
各位做PLC的同行不知道你们有没有遇到过这种情况一个项目里全是重复的梯形图逻辑比如十几个电机起保停、一批阀门顺序控制、若干套同样的温度PID手自动切换结构几乎一样就是变量名和地址换一下。手写吧又累又容易漏复制粘贴改吧改错一个地址现场就跳闸。最近我一直在折腾AI辅助写PLC代码这条路用本地部署的大语言模型跑博途相关的代码生成任务把“简单且重复”那部分工作彻底交给模型生成完再导进TIA Portal效果比想象中靠谱。这篇就把完整方案、提示词、导入步骤和踩过的坑全部摊开讲。先说适合谁看如果你平时主要写西门子博途TIA Portal梯形图为主SCL用得不多又被重复逻辑搞得头大那这篇对你的帮助最大。当然用三菱GX Works2或Codesys的朋友也能参考整体思路就是导入细节要换一换。文中我会用博途V18加一个1500系列PLC做演示案例选的是电机星三角降压启动——这玩意儿在论坛里跟“PLC梯形图100实例”一样属于最经典的需求拿它当例子最说明问题。1. 项目思路拆解AI帮写PLC代码怎么落地才靠谱1.1 为什么选AI生成梯形图而不是直接从零手写很多人一听“AI写梯形图”第一反应是让AI直接输出LAD的图形结构。实际做过就会发现这条路不好走。梯形图本质是图形化编程AI大模型擅长生成的是文本虽然像LAD的XML描述文件也能生成但那种东西脱离博途项目环境基本没法看也不方便修改和复用。真正合理的做法是让AI生成SCL结构化控制语言代码或者生成可以直接贴进博途“外部源文件”的STL文本再在博途里编译成块。SCL和梯形图是等价的同一段逻辑既可以显示成LAD也可以显示成SCL只是表达形式不同。AI写SCL本质上就是在写一种接近Pascal的文本代码这对大模型来说简直是送分题生成质量远高于直接让它“画”梯形图。那为什么不是直接让AI生成完代码就完事还要大费周章导进博途因为最终程序要跑在PLC上必须经过博途的编译器生成目标代码而且现场调试、监控、改动都是靠着博途里的块来进行的。AI只是帮我们完成了“写代码”这个环节工程化闭环还得靠博途本身。1.2 一条更稳的路线让AI写SCL进博途再转梯形图我目前验证下来最稳定的流程是AI生成SCL代码 → 粘贴到博途外部源文件 → 编译生成块 → 使用时在OB1里调用。如果项目有需要或者客户明确要求梯形图呈现还可以在博途里把块的编程语言从SCL切到LAD前提是代码结构没有用CASE、FOR这类LAD不支持的语句。这条路线之所以稳是因为它把AI最擅长的“文本生成”和博途最擅长的“编译运行”接在了一起。AI不需要懂博途内部奇怪的块结构只需要按照IEC 61131-3标准写SCL剩下的交给博途。对PLC工程师来说学习成本也很低SCL的语法上手半天就会而且一旦会了写复杂逻辑比梯形图快得多。更关键的是这条路线能复用到“重复代码”场景。比如你一个项目里有8台一模一样的泵每台泵都是启动、停止、故障复位、运行反馈、综合故障唯一的区别是变量名。这种代码让AI一次性生成8份或者生成一个带参数的FB然后调8个实例都是几分钟的事。搞过这种工程的都知道手写8套起保停逻辑虽然不难但核对变量名的过程极其枯燥AI来干这事不会不耐烦。1.3 哪些梯形图场景适合交给AI哪些最好别碰也不是什么梯形图都适合AI生成我试了一圈大致分了这么几类非常适合起保停逻辑、电机顺序启停、星三角降压启动、闪烁/延时控制、阀门连锁、简单的报警汇总、批量IO映射。这类逻辑结构成熟、边界清楚AI见过海量类似代码生成出来基本不用大改。可以尝试手自动切换、单按钮启停、模拟量处理、PID手自动无扰切换、用SCL实现的排队和物流分拣逻辑。这类需要一定的工程经验但只要提示词里写清楚规则AI也能写出能用的版本就是需要人工多审几遍。不建议涉及安全回路的急停链、安全PLC程序、复杂运动控制和伺服插补。这些不是AI能力不行而是出了事责任太大。AI生成的代码必须经过严格人工审核确认后才能使用安全相关逻辑本来也要按标准单独设计别图省事。一句话总结AI适合干“量大的体力活”不适合干“出了事担责任的脑力活”。把它当高级打字员别把它当安全顾问。2. AI生成PLC代码的核心细节与准备2.1 提示词设计才是真正的门槛很多人用完AI写代码说“不行生成的代码全是错的”90%的情况是提示词没写好。让AI写PLC代码和让它写Python不一样PLC有严格的数据类型、指令版本、厂商差异你得先把这些约束喂给它。我长期保存了下面这段提示词基本覆盖了博途SCL生成的要点。注意这段提示词是给人用AI时的“角色设定”建议直接复制到ChatGPT、Claude或者本地部署的模型里保存为预设。模型不同效果会略有差异但总体框架是通用的你是我的PLC自动化编程助手。你精通西门子博途TIA Portal V18熟悉IEC 61131-3标准擅长STL、SCL、LAD语言。请严格按照以下规则输出PLC代码 1. 代码语言使用SCL语法必须适配TIA Portal V18 2. 变量必须显式声明使用符号名禁止使用VW、MW、DBX这类绝对地址 3. 定时器使用TON、TOF、TP等IEC定时器定时器实例必须在VAR区声明 4. 逻辑必须包含互锁和安全条件 5. 输出格式先列出需要的输入输出变量和内部变量表再输出完整代码关键逻辑加中文注释 6. 生成代码必须能在TIA Portal SCL编译器中直接编译通过。这段提示词里有一条特别重要就是禁止使用绝对地址。AI如果不加约束很容易生成MD20、M0.3这类老STL风格的寻址方式博途里虽然能用但维护性极差而且不同项目的变量表完全对不上。用符号名配合博途的PLC变量表才是现代工程该有的习惯。还有一点最好在提示词里告诉AI你要用FB还是FC两者的变量声明和调用方式差别很大。FB适合做需要保持内部状态的功能比如星三角启动、PID手自动切换FC适合做纯逻辑计算比如报警输出、数据格式转换。你告诉AI用FB它就会自动带上VAR_INPUT、VAR_OUTPUT、VAR_IN_OUT、VAR这些段这正好对应了博途里的块接口。2.2 让代码“一次过”的语法约定AI生成SCL代码最常翻车的地方集中在数据类型、定时器用法和块接口。我把这几条单独拎出来说说因为这决定了代码能不能一次编译通过。先讲数据类型。西门子博途的SCL比标准IEC 61131-3更严格很多隐式转换是不允许的。比如把INT直接赋值给REAL会报错必须用INT_TO_REAL显式转换把两个INT相加赋值给DINT也要注意位置。AI模型在训练数据里见过各种PLC的代码有时候会带出三菱或者Codesys的写法类型习惯混在一起这在提示词里要特别强调。再讲定时器。博途V18里TON之类是IEC定时器必须声明成变量实例不能像老S7-300那样直接写个T1、T2。AI如果不注意生成的代码可能是T37、T38这种已经被淘汰的写法导进博途必报错。所以在提示词里明确要求“定时器实例必须在VAR区声明”这样AI就会生成类似ton1 : TON这样的变量然后ton1(IN : , PT : )调用这是博途SCL的标准姿势。还要注意一个很多人忽略的点博途V18的SCL编译器对一些写法有版本差异。比如数组下标可以用变量但个别版本对可变上下限数组支持有差异REAL常量的写法1.0和1.0e0都能识别但0不能直接赋给REAL变量时可能被当INT。这类细节遇到报错了再改也不迟但提前在提示词里写“语法必须适配TIA Portal V18”能减少一半报错。2.3 博途环境准备版本、许可证和项目组织既然要把代码导入博途环境肯定要先准备好。我用的是TIA Portal V18配合S7-1500系列的CPU做仿真验证。如果你的博途版本是V16或者V17SCL的基本语法差别不大但有些内置指令和库函数可能不同导入后遇到“DVD无法解析”之类的提示先别急八成是版本差异。博途安装时经常有人遇到“一些已安装产品需要许可证”的报错这个跟AI代码无关属于环境问题通常用SIMATIC Automation Tool或者重装许可证管理器能解决网上案例很多就不展开说了。我建议使用博途V18及以上版本对SCL的支持更好仿真器也更稳定。另一个需要提前准备的是项目结构。我建议新建一个测试项目在PLC数据类型里创建好需要的UDT在PLC变量表里定义好全局变量然后再添加FB。如果AI生成了全局变量引用你得保证博途的变量表里真有这些符号名不然后续导入外部源文件时编译器会提示“找不到符号”。我自己的习惯是第一次导入AI代码优先导进一个专门的测试DB或者独立FB编译过了再去改接口对接正式逻辑。千万别一上来就动正在跑的程序博途这软件有时候一个编译错误能牵连出一堆。3. 实操演示3路电机星三角降压启动的AI生成与导入全流程3.1 需求整理与提示词示例星三角降压启动是电机控制里最经典的电路主回路用三个接触器主接触器KM1、星形接触器KM2、三角形接触器KM3。启动时先KM1和KM2吸合电机绕组星形连接降压启动延时几秒后KM2断开、KM3吸合切换到三角形全压运行。控制回路里必须有启动按钮、停止按钮、热继电器故障输入还要做星形和三角形互锁防止同时吸合造成相间短路。把这个需求交给AI之前先在脑子里把控制逻辑理清楚停止按钮按下任何状态都要停下来启动按钮按下如果还没在运行进入星形启动状态星形状态持续设定时间后切换到三角形运行状态KM2和KM3绝对不能同时吸合故障输入一旦触发立刻停机并复位。理清需求后把这段描述补进提示词里同时添上“使用FB实现做成可重复调用的功能块输入输出接口用符号名”。下面是我实际操作时用的完整提示词你可以直接复制请用西门子博途V18的SCL语言编写一个FB功能块功能是三路电机星三角降压启动要求如下 1. FB接口 输入启动按钮bStart、停止按钮bStop、热继电器故障bFault、星三角切换延时时间tiStarTime 输出主接触器bKM1、星形接触器bKM2、三角形接触器bKM3、运行状态bRunning 2. 控制逻辑停止优先启动按钮上升沿触发启动先星形启动延时结束后切换为三角形任何时刻KM2和KM3不能同时吸合故障时全部断开并保持停止状态 3. 使用TON定时器实例在VAR区声明 4. 给出完整代码和变量声明添加中文注释 5. 代码必须能直接粘贴到博途V18的SCL编辑器里编译通过。加上“三路电机”是防止AI只写一路。实际上FB写好后调三个实例就自然“三路”了但直接告诉它三路AI会在代码结构上做一些适配比如数组或者共享定时器的考虑虽然不一定用得上但这代表了一种工程思维。3.2 AI生成的SCL代码核查AI返回的代码不可能拿来就直接用我拿到手会先做一轮人工核查。先贴一份我在项目中实际使用的版本这是经过我手动整理过的最终版AI原始输出和这个结构一致但细节略有出入FUNCTION_BLOCK FB_StarDelta { S7_Optimized_Access : TRUE } VERSION : 0.1 VAR_INPUT bStart : Bool; // 启动按钮 bStop : Bool; // 停止按钮 bFault : Bool; // 热继电器故障输入 tiStarTime : Time : T#5S; // 星形切换延时 END_VAR VAR_OUTPUT bKM1 : Bool; // 主接触器 bKM2 : Bool; // 星形接触器 bKM3 : Bool; // 三角形接触器 bRunning : Bool; // 运行状态 END_VAR VAR nStep : Int; // 状态步进 rTrigStart : R_TRIG; // 启动上升沿 tonStar : TON; // 星形延时定时器 END_VAR BEGIN // 停止和故障优先处理 IF bStop OR bFault THEN nStep : 0; END_IF; // 启动按钮上升沿触发 rTrigStart(CLK : bStart); IF rTrigStart.Q AND nStep 0 THEN nStep : 1; END_IF; // 状态机控制三路输出 CASE nStep OF 0: // 停止状态 bKM1 : FALSE; bKM2 : FALSE; bKM3 : FALSE; tonStar(IN : FALSE); 1: // 星形启动 bKM1 : TRUE; bKM2 : TRUE; bKM3 : FALSE; tonStar(IN : TRUE, PT : tiStarTime); IF tonStar.Q THEN nStep : 2; END_IF; 2: // 三角形运行 bKM1 : TRUE; bKM2 : FALSE; bKM3 : TRUE; tonStar(IN : FALSE); END_CASE; // 运行状态输出 bRunning : (nStep 1); END_FUNCTION_BLOCK核查时重点看三点。第一KM2和KM3互锁是否天然成立——这个版本用CASE状态机实现每个状态里只有一个接触器吸合KM2和KM3永远不会同时为TRUE比用常规互锁回路写更简洁第二停止是否优先——停止故障在CASE前面直接清零nStep任何状态都会被打断第三定时器实例是否在VAR里声明且复位——切换到三角形后tonStar(IN : FALSE)用于复位避免下次启动时Q残留。还有个容易被忽略的细节启动按钮沿检测。用R_TRIG而不是直接用bStart做条件是为了避免按钮长按导致重复触发。实际现场如果按下不放普通逻辑会反复启动用上升沿就只认按下的那一下这个工程细节很多人会漏AI倒是写出来了。3.3 把代码导入博途的全过程代码审查没问题后就可以进博途导入了。这一步有两种方式一种是把代码作为外部源文件导入另一种是直接新建FB然后手动粘贴SCL代码。这里我把两种都讲一下你按习惯选。方法一外部源文件导入在桌面新建一个文本文件把AI生成的SCL代码复制进去注意保存成.scl后缀文件编码用UTF-8。打开博途V18在项目树中找到“外部源文件”右键选择“添加新的外部文件”选中刚才的.scl文件。添加后文件会出现在外部源文件目录下右键该文件选择“从源文件生成块”博途会解析SCL文本并生成FB块。如果代码里有语法错误或找不到的类型这一步会直接报错错误列表里能看到具体行号。方法二直接新建FB粘贴在项目树里右键PLC选择“添加新块”块类型选函数块FB编程语言选SCL。确定后进入SCL编辑界面把AI生成的代码整体粘贴进去。如果代码里带了FUNCTION_BLOCK开头的完整声明需要去掉因为博途的FB编辑器里已经帮你搭好了接口区。只保留BEGIN到END_FUNCTION_BLOCK之间的逻辑接口变量手动在块接口区域添加。我个人推荐方法一因为外部源文件可以保留SCL文本的完整结构批量导入多个AI生成的FB时效率高很多。方法二的复制粘贴会遇到接口区冲突问题AI生成的VAR_INPUT段和博途编辑器里已有的接口区是重复的需要手动整理反而麻烦。导入成功后下一步是把FB实例化并调用。在OB1里拖一个FB_StarDelta的调用配置背景数据块DB然后给输入输出接上PLC变量。比如bStart接启动按钮I0.0bStop接停止按钮I0.1bFault接热继电器I0.2输出接Q0.0、Q0.1、Q0.2。接好之后编译整个PLC项目只要能过就说明AI代码和博途环境兼容。3.4 从SCL转梯形图并完成仿真验证很多朋友看到SCL第一反应是“客户要梯形图怎么办”。这就要用到博途的语言切换功能了。选中刚才生成的FB块在菜单里找到“编辑”选择“更改编程语言”把语言从SCL切换成LAD。这时候有一个很重要的认知不是所有SCL代码都能无缝切到LADCASE语句、循环语句这些结构化很强的代码LAD表达不了博途会提示“某些指令无法转换”。我用的这个星三角FB由于用了CASE状态机直接切LAD基本会失败或转换后结构很难看。所以工业现场如果硬要求梯形图我的做法是把CASE改写成IF嵌套和普通常开常闭触点串联的写法让逻辑能被LAD完全表达。如果你写的逻辑就是起保停这种简单结构比如下面这个1秒闪烁程序切LAD就毫无压力FUNCTION_BLOCK FB_Flash { S7_Optimized_Access : TRUE } VERSION : 0.1 VAR_INPUT bEnable : Bool; END_VAR VAR_OUTPUT bOut : Bool; END_VAR VAR tonFlash : TON; tFlashTime : Time : T#1S; bAux : Bool; END_VAR BEGIN tonFlash(IN : bEnable AND NOT bOut, PT : tFlashTime); IF tonFlash.Q THEN bOut : TRUE; ELSE bOut : FALSE; END_IF; END_FUNCTION_BLOCK这个代码生成的逻辑很简单定时器计时满就翻转输出配合取反实现闪烁。把FB切到LAD视图你会看到输出线圈和定时器触点都完整显示成梯形图元件完全可读。所以你可以把需要给客户看的梯形图逻辑尽量写得简单直接CASE这类留给SCL内部使用。代码导入成功后仿真验证这步我建议别省。在博途里启动PLCSIM把OB1下载到仿真PLC强制启动按钮变量观察KM1、KM2、KM3的输出状态变化。我的测试结果是启动信号给上之后KM1和KM2立刻为TRUE经过设定延时时间KM2变FALSE、KM3变TRUE整个切换时间点能精确控制。故障模拟给一个bFault TRUE输出全部清零逻辑符合预期。4. 常见问题与排查技巧实录4.1 中文注释乱码与字符问题AI生成的代码里中文注释经常出问题粘贴进博途后显示成乱码甚至直接编译报错。这主要是文件编码闹的。外部源文件导入时博途对UTF-8和ANSI的识别有时候会出错不同版本行为还不一样。我在V18里遇到过UTF-8带BOM的.scl文件导入后中文正常但某些版本必须保存成ANSI才认这个没有统一标准。我的处理办法是预先准备一个空的外部源文件模板编码统一保存成ANSI代码里的中文注释在导入前先复制出来用记事本重新存一遍。如果就几个块我更推荐直接新建FB粘贴粘贴的时候博途SCL编辑器会自动处理编码乱码概率小很多。要是已经乱码了最简单的办法是把注释全删了反正代码逻辑不受影响关键位置用拼音或者英文重新写注释。4.2 数据类型不匹配和隐式转换报错AI生成的代码里最容易报错的地方是数据类型的隐式转换。博途SCL对类型检查很严格把TIME显示给INT变量、把REAL赋给DINT等操作都会直接编译失败。我在这个星三角例子里也遇到过AI把tiStarTime写成TIME但定时器PT引脚接了一个INT常量编一下就报“数据类型不一致”。排查方法很简单编译错误列表里会直接指示是哪个网络、哪个指令的类型冲突。双击错误行博途会跳转到出错位置。常见冲突就那几类INT和REAL互转、TIME和TIME_OF_DAY混用、自定义UDT和基础类型不匹配。处理方式也统一在SCL里用显式转换函数包一层比如INT_TO_REAL(变量)、TIME_TO_DINT(变量)。我每次从AI拿代码第一件事就是全局搜索有没有直接的赋值语句针对性检查类型。4.3 代码能编译但转梯形图失败前面提到过CASE语句切LAD的问题这里单独拎出来说。实际项目里客户方审查图纸经常要求看梯形图你SCL写得再规范客户一句“我看不懂SCL”就能让你多干两天。我自己的处理经验是分两步。第一步在功能设计阶段凡是明确要展示成梯形图的逻辑提示词里限定AI“只能用IF和基本触点指令不要用CASE、FOR、WHILE”第二步如果代码已经写完了用SCL的“将代码块转换为LAD”功能试一次能转就转转不了就老老实实重写这些块的梯形图版本。博途V18的SCL转LAD对简单指令支持已经很好了甚至部分嵌套IF都能转但别指望100%成功。4.4 导入外部源文件失败和块版本不兼容导入外部源文件时偶尔会遇到“块无法生成”的报错这种情况一般是SCL文件里包含了博途不认识的指令或语法结构。排查时先确认代码里有没有用到当前版本博途不支持的指令比如S7-1200的某些工艺对象、V18才有的新库指令这些在旧版本里必然报错。另一个可能是SCL文件里同时包含多个块定义Botu外部源文件允许一个文件里多个块但编译器要求块顺序要符合依赖关系。版本不兼容这个事还体现在AI训练数据的滞后性上。市面上主流大模型的训练数据里西门子PLC相关的内容大量来自S7-300/400时代的STL代码一不留神就会生成DB25.DBW3这种绝对地址或者FB编号加背景DB的旧风格。我在提示词里加了“禁止使用绝对地址”的约束之后这个情况改善了很多但还是会冒出来拿到的代码务必人工过一遍。4.5 常见问题速查表现象可能原因解决办法中文注释乱码文件编码与博途不匹配改存ANSI或删除注释改用英文编译报类型不匹配INT/REAL/TIME隐式转换用显式转换指令包装定时器报错使用了T37/T38旧定时器改用TON实例并在VAR中声明外部源文件生成块失败指令版本不兼容或语法错误逐条核对错误列表确认块依赖顺序切换到LAD失败代码含CASE/FOR等结构改写成IF和触点结构后再切换找不到符号名AI生成的变量与PLC变量表不一致在变量表手动添加或改代码符号4.6 关于AI幻觉代码的预防最后说一个AI写PLC代码特有的坑幻觉指令。AI会生成一些看起来很有道理、但实际上根本不存在于博途的指令或者把西门子和别家PLC的指令混在一起。比如有一次AI给我生成了个RST指令这是三菱风格的博途根本不认还有一次生成MOVE_BLK_VARIANT这种指令在特定版本才支持。预防办法就一条在提示词里限定指令集。我会额外加一句“只允许使用博途V18标准指令库里的指令不要使用其他PLC品牌的指令”。同时拿到代码后第一遍审核时扫一眼有没有看起来陌生的指令名有就单独查手册。AI生成代码的速度确实快但审核这步偷不得懒尤其是在调试期间发现逻辑不对再回头查成本会翻倍。我个人在实际操作中最深的一个体会是AI写PLC代码这件事真正值钱的环节不是“生成”而是“把关”。把需求描述清楚、把规则约束到位、把生成的代码认真审核一遍这套流程熟练之后原来两天写完的重复逻辑现在半天就能搞定多出来的时间可以用来做仿真验证和现场优化。如果你手头正有大量重复性梯形图逻辑要做建议先拿一个小项目试试这个流程体会一下把体力活外包出去的感觉。