ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AI生成PLC程序实战:用DeepSeek写西门子SCL代码全复盘

AI生成PLC程序实战:用DeepSeek写西门子SCL代码全复盘 说句实话我一开始对“AI自动生成PLC程序”这件事是持怀疑态度的。干工控十几年接触器怎么吸合、模拟量怎么抗干扰、联锁怎么搭、现场调试会出什么幺蛾子这些在我这儿都是拿时间喂出来的经验一个聊天机器人能懂什么直到上个月一个项目卡在客户临时改工艺要求把星三角启动的切换时间从固定的3秒改成两段可调还要加一个切换死区。下午四点半现场催得急我抱着试一试的态度把需求原原本本打给DeepSeek让它用SCL语言写一段西门子S7-1200的星三角降压启动程序。从给出需求到TIA Portal编译通过前后不到半小时。那天下班路上我就在想这套工作方式值得认真整理一下——AI确实能帮PLC工程师省下大量重复劳动但前提是你得知道怎么用它怎么验它。这篇文章就是我这段时间把DeepSeek用在PLC程序生成上的完整复盘。我会讲清楚AI生成PLC代码的原理边界、提示词怎么写、一个完整的实战案例、从AI草稿到正式工程必须做的校验流程以及我踩过的那些坑。适合正在用西门子、三菱、欧姆龙等主流PLC、想提升编程效率的电气工程师和自动化从业者。不管你是第一次听说AI写PLC还是已经试过但被结果劝退这篇文章应该都能给你一些能直接上手的思路。1. 先泼一盆冷水AI写PLC到底能写到什么程度网上关于“AI自动生成PLC程序”的说法非常两极分化。一边是培训机构天天喊“AI要取代PLC工程师了”另一边是老工程师觉得“AI连梯形图都画不明白纯属玩具”。以我这段时间的实际使用体验来看两个说法都不太对。AI目前能做的是帮你把“相对标准化的控制逻辑”快速变成一份结构完整、语法基本正确的代码草稿。比如电机启保停、星三角启动、电机正反转、阀门顺序控制、Modbus通讯轮询框架、数据处理与报警逻辑这类东西。这些逻辑在公开的技术文档、手册、论坛例程里反复出现过AI见过的样本足够多生成出来的内容成熟度很高。但它处理不了两件事一是你现场的工艺细节和特殊联锁条件二是设备安全和调试过程中积累的那些隐性经验。AI不知道你的设备是离心泵还是螺杆泵不知道变频器是ERR端子复位还是键盘复位更不知道甲方验收时要的“手自动切换互锁”具体长什么样。所以我更愿意把DeepSeek定位成一个“随叫随到的外协工程师”——你给它清晰的需求它给你一版可用的初稿然后由你来审查、修改、完善。这个过程和当年带刚毕业的大学生徒弟很像但AI的响应速度是秒级的而且不会抱怨你下班前还改需求。谁适合用这种方式我的建议是已经在用博图、GX Works、CX-One这些编程软件做过至少一两个真实项目的工程师用AI提效最明显。如果你连PLC的扫描周期、常开常闭、自锁互锁这些概念都还不太清楚AI生成的代码拿过去大概率不知道怎么改反而容易出事。AI是放大器能放大你的效率也能放大你的无知带来的风险。2. DeepSeek凭什么能生成工控代码搞清楚原理你才敢用它2.1 大模型不是“懂PLC”而是“看过足够多PLC资料”先说原理。DeepSeek这类大语言模型本身不具备任何工程经验它做的事情简单说就是“根据你输入的文本预测最应该接在后面的文本”。它能生成看起来像模像样的PLC程序是因为它的训练语料里包含了大量工业自动化相关的内容——西门子官方手册、技术论坛的问答帖、各类教材、开源项目里的ST语言程序、二手交易平台里流传的例程文档等等。见得多了它就能总结出规律一个标准的星三角启动程序大概长什么样、SCL语言里的IF语句该怎么写、TON定时器的接口参数有哪些。明白这一点非常重要它决定了你该怎么用AI。既然AI是在“根据统计规律补全内容”那么你给的输入信息越详细、越接近真实项目需求它补全出来的内容就越靠谱。反过来你只丢一句“给我写个PLC程序”它就只能从一个平均状态往外猜——猜你的PLC型号猜你的IO分配猜你的控制要求。猜对的概率能有多高2.2 为什么要选DeepSeek而不是其他工具工控圈现在常用的大模型我基本都试过。DeepSeek在PLC这个垂类场景里的优势总结起来有三个。一是中文理解能力强。工控领域的资料大量是中文的很多术语在不同厂家语境下还有不同含义。比如“常闭触点接进来”西门子语境和欧姆龙语境的表达习惯就有差异。DeepSeek对这类中文技术表达的把握比较到位不会像有些模型那样把“点动”理解成“移动到一个点”。二是上下文窗口大支持长对话。一次完整的PLC程序生成往往需要先给它IO表再提控制要求然后它给初稿你再提修改意见来回很多轮。如果不支持长上下文聊到一半它把前面的IO表忘了程序就会越改越乱。DeepSeek在长对话场景下丢信息的情况相对少一些。三是API和本地部署方案成熟。如果公司对项目数据保密要求高不允许把工艺逻辑发到外部服务可以选择本地部署方式让数据不出内网。这也是很多工控企业和系统集成商愿意试它的重要原因。对于个人学习和验证场景直接用Web端或者通过API接入自己常用的代码编辑器就足够用了。2.3 结构化文本语言是AI的舒适区SCL/ST比梯形图更合适这里必须说一个很多刚接触AI生成PLC程序的人最容易踩的认知误区以为AI能直接“画”出梯形图。实际上DeepSeek这类大模型擅长生成的是文本类内容而TIA Portal里的梯形图LAD本质上是一个图形化编辑器里的元素组合。AI没办法直接在你的博图项目里生成一个梯形图程序段它更适合生成SCL语言、ST语言这类结构化文本代码。为什么SCL更适合AI生成一方面SCL的语法结构清晰和高级编程语言接近变量声明、IF语句、CASE语句、定时器调用都有明确规则AI只要见过足够多的例子写出来的语法正确率就很高。另一方面SCL代码是纯文本你复制粘贴到TIA Portal或者GX Works的ST编辑器里编译一下就能发现问题修改也方便。相比之下就算AI给你输出一段梯形图的XML描述你也没办法直接导入博图实际意义不大。所以我的习惯是和AI沟通时明确要求它输出SCL或ST语言而不是梯形图。这不代表AI不会梯形图而是目前的技术条件下文本语言才是AI和PLC编程软件之间转化效率最高的桥梁。对于习惯看梯形图的工程师SCL代码编译生成后可以很方便地在TIA Portal里切换查看梯形图视图完全不耽误。3. 让AI听懂工艺需求提示词这样写一次成稿率最高3.1 一段合格的PLC提示词必须包含六个要素我见过很多同事用AI生成PLC代码效果不好九成原因是提示词太随意。这就像你给一个刚来的外协工程师打电话只告诉他“给我做一台星三角启动的柜子”就挂了电话他做出来的东西你敢直接用吗一段合格的PLC提示词至少要把下面六个要素交代清楚要素说明示例角色设定让AI以资深工程师的身份回答问题“你是一名深耕西门子PLC二十年的电气工程师”PLC型号与软件不同品牌的指令体系和变量风格差异很大“S7-1200 1214C DC/DC/DCTIA Portal V17”编程语言指定SCL或ST语言避免输出梯形图描述“请使用SCL语言”IO分配表每个输入输出信号的地址和含义“I0.0启动按钮Q0.0主接触器”控制要求工艺流程、时序、互锁、复位条件逐条列出“启动后星型运行3秒断开50ms后切角型”输出格式要求带注释、用FB/FC封装、先给说明再给代码“使用FB形式变量命名规范关键行加中文注释”这六个要素核心是“让AI少猜一点”。每次AI需要靠猜来补全的信息都是你后面要花时间改的地方。IO表和控制要求给得越详细AI生成的程序就越接近你能直接用的状态。3.2 可以照抄的提示词模板下面这个模板是我现在给DeepSeek发需求时用的底稿复制过去改一改具体参数就能用你是一名有20年经验的大型PLC电气工程师精通西门子S7-1200/S7-1500、TIA Portal和SCL语言。 请根据以下需求设计一个电机星三角降压启动程序 【PLC型号】西门子S7-1200 1214C DC/DC/DCTIA Portal V17 【编程语言】SCL语言 【IO分配】 I0.0启动按钮常开 I0.1停止按钮常闭 I0.2热继电器/电机保护器动作信号常开 Q0.0主接触器KM1 Q0.1角型接触器KM2 Q0.2星型接触器KM3 【控制要求】 1. 按下启动按钮后KM1和KM3同时接通电机星型启动 2. 星型启动3秒后KM3断开间隔50ms后KM2接通电机切换为角型运行 3. 按下停止按钮或热继电器动作时所有输出全部断开 4. 热继电器动作后可通过启动按钮进行故障复位 5. 星型接触器和角型接触器必须互锁防止同时接通 6. 程序需要包含运行指示输出。 【输出要求】 1. 使用FB函数块形式编写给出变量声明和程序主体 2. 变量命名符合西门子命名习惯禁止使用中文变量名 3. 在程序关键位置添加中文注释 4. 先简单描述你的程序设计思路再输出完整SCL代码。这个模板看着长但实际用起来非常省事。因为AI第一次给你的代码质量高了后面要改的东西就少整体上反而更快。3.3 多轮对话中的需求变更与上下文管理第一次生成往往不是终点实际项目中你肯定要调整参数、加联锁、改时序。这时候有个很关键的操作习惯不要只说“把延时改短一点”而是把改动的上下文交代清楚。比如“前面程序里的StarTime是T#3S现在现场要求星型阶段运行时间改为5秒请只在定时器参数上做修改其他逻辑保持不变。”这样AI就知道你是针对哪个位置做调整不会顺手把别的逻辑也改了。另一个常见问题是对话一长DeepSeek可能会提示达到对话长度上限或者出现上下文“漂移”——聊到后面它忘了你最初的IO分配。我的处理方法是把一份核心信息固定保存在电脑里的项目文件夹中包括IO表、控制要求、已确认的程序框架。每次新开一个对话窗口第一段话就把这份核心信息粘过去再附上当前的修改需求。这比在同一个长对话里无限续聊要稳得多。4. 实战DeepSeek生成西门子星三角降压启动程序的完整过程4.1 需求输入只给工艺不给结论这个案例就是我文章开头提到的那个现场救急场景。当时客户要求星三角启动的星型阶段运行3秒星角切换死区50毫秒热继电器动作后必须手动复位。我把这个需求按第三章的模板整理好发给了DeepSeek。值得注意的是我没有告诉AI“你应该在第三步用一个TON定时器”也没有说“星角切换需要加一个中间变量”。具体的实现方式交给AI自己去设计我只需要把工艺要求讲清楚。这背后的逻辑是AI见过的实现方案比任何一个单个工程师都多你预设的结论反而可能限制了它给出更好的结构。4.2 DeepSeek输出的SCL程序DeepSeek在简单说明了设计思路之后给出了下面这段SCL代码。这里需要说明以下代码是我根据实际使用体验整理出的一个具有代表性的版本供参考学习FUNCTION_BLOCK FB_StarDelta { S7_Optimized_Access : TRUE } VERSION : 0.1 VAR_INPUT StartBtn : Bool; // 启动按钮常开触点 StopBtn : Bool; // 停止按钮常闭触点 Overload : Bool; // 热继电器/电机保护器动作信号 StarTime : Time : T#3S; // 星型启动持续时间 ChangeOverT : Time : T#50MS; // 星角切换死区时间 END_VAR VAR_OUTPUT MainK : Bool; // 主接触器 KM1 StarK : Bool; // 星型接触器 KM3 DeltaK : Bool; // 角型接触器 KM2 MotorRun : Bool; // 运行指示 END_VAR VAR StarTimer : TON; ChangeTimer : TON; StarPhase : Bool; DeltaPhase : Bool; RunReq : Bool; TripMem : Bool; END_VAR BEGIN // 1. 停止优先停止按钮按下或过载动作立即断开所有输出 IF NOT #StopBtn OR #Overload THEN #RunReq : FALSE; IF #Overload THEN #TripMem : TRUE; END_IF; END_IF; // 2. 故障复位通过启动按钮在无过载状态下复位 IF #StartBtn AND NOT #Overload AND #TripMem THEN #TripMem : FALSE; END_IF; // 3. 启动请求无故障、未停止且未在运行时按一次启动按钮生成启动请求 IF #StartBtn AND NOT #RunReq AND NOT #TripMem AND #StopBtn THEN #RunReq : TRUE; END_IF; // 4. 星型阶段进入RunReq后先接通主接触器和星型接触器 IF #RunReq AND NOT #StarPhase AND NOT #DeltaPhase THEN #StarPhase : TRUE; END_IF; // 5. 星型计时星型时间到切换为角型 #StarTimer(IN : #StarPhase, PT : #StarTime); IF #StarTimer.Q AND #StarPhase THEN #StarPhase : FALSE; #DeltaPhase : TRUE; END_IF; // 6. 切换死区星型断开后再延时接通角型 #ChangeTimer(IN : #DeltaPhase AND NOT #StarPhase, PT : #ChangeOverT); // 7. 输出赋值 #MainK : #StarPhase OR (#ChangeTimer.Q AND #DeltaPhase); #StarK : #StarPhase; #DeltaK : #DeltaPhase AND #ChangeTimer.Q; #MotorRun : #StarPhase OR #DeltaK; END_FUNCTION_BLOCK平心而论这个初稿的质量已经超过了不少助理工程师的第一次作品。它具备了几个优点接口参数清晰星型时间和切换死区都做成了可调输入参数方便现场调试停止优先逻辑放在了程序最前面符合安全回路的设计习惯星型和角型通过不同的输出变量最终控制接触器没有在软逻辑里直接冲突同时还在最后输出赋值阶段做了状态分离。4.3 拿到AI代码后我先改了这三处但如果你以为把这段代码直接粘到博图里下载到CPU就能用那就危险了。我当时逐行审查后做了三处修改。第一处是停止逻辑的覆盖范围。AI的初稿里停止按钮按下后只把RunReq复位了但StarPhase和DeltaPhase这两个状态变量并没有被强制复位。这意味着如果设备是在角型运行阶段按下停止DeltaPhase仍然是TRUE下次启动信号来时启动逻辑会直接跳过星型阶段。我在停止分支里补上了对StarPhase和DeltaPhase的复位。第二处是故障复位的具体实现。AI默认用启动按钮进行复位这在现场其实容易误操作——如果操作工在故障状态下不小心碰到启动按钮设备会突然重新得电。实际项目里我通常会把复位功能独立出来或者要求启动按钮必须持续按压超过2秒才执行复位。这不是AI逻辑错误而是它不了解现场安全操作规程。第三处是接触器互锁的物理实现。AI在软逻辑里保证了StarK和DeltaK不会同时为TRUE但真正的星三角柜子里接触器线圈回路还必须串联对方的常闭触点做硬互锁以防PLC输出模块故障、输出晶体管击穿时两个接触器同时吸合造成相间短路。这不是AI能替你决定的是电气设计的基本底线。这三处修改花了大约十五分钟。你可以理解为AI帮我省掉了从零写一版标准程序的一两个小时但省不掉我作为现场工程师的审查责任。5. 从AI草稿到下装程序校验与安全底线检查清单5.1 编译是门槛不是终点把AI生成的代码放进TIA Portal之后第一步当然是编译。编译能帮你发现语法错误、变量未定义、数据类型不匹配等问题。但我要强调的是编译通过只意味着代码在语法上没有毛病绝不代表程序逻辑正确。很多AI生成代码的问题不是语法层面的而是逻辑层面的——它可能把一个定时器接错了触发条件或者在某个边界情况下产生了不符合工艺的状态。所以编译之后我建议把AI生成的代码从头到尾读一遍像给新人做代码评审一样。重点看这几个位置定时器的IN和PT引脚接了什么信号、输出线圈有没有可能被多段逻辑重复赋值、状态变量在各种边界组合下会不会出现“卡死”的状态。SCL语言表面上是顺序执行但PLC的扫描机制决定了各段程序在每个周期都会被完整执行一遍输出最终以程序结尾最后一次赋值为准这个特性一定要刻在脑子里。5.2 用仿真把工艺时序“跑”一遍如果项目可以搭仿真环境建议尽量用仿真来验证AI生成的逻辑。比如TIA Portal配套的PLCSIM就可以在没有真实硬件的情况下模拟数字量输入、观察输出结果。把启动按钮、停止按钮、热继电器分别强制成不同状态组合逐个验证工艺时序是否满足要求。以星三角这个案例为例我在仿真环境里至少测了三轮第一轮是正常启动流程记录从按下启动按钮到角型接触器吸合的完整时间轴确认3秒星型阶段和50毫秒死区是否符合要求第二轮是运行中按停止按钮确认所有输出立即断开状态变量全部复位再次启动时能正常走一遍星型流程第三轮是模拟热继电器在星型阶段动作确认热继电器信号能切断所有输出并且故障复位的流程能正常执行。仿真不是万能的它验证不了实际接线、接触器线圈得电后的机械动作时间但跑完这三轮你至少对AI生成代码的核心逻辑有了信心。5.3 工程落地还要过一遍这几关从仿真到实际上电中间还隔着好几道工控行业特有的“常识关卡”。这里我整理了一份我在启用AI生成PLC程序后一直使用的校验清单每次走到这一步都会逐条过一遍校验项具体内容常见问题硬件组态与实际PLC型号、模块版本是否一致AI默认的参数可能与实际硬件不符地址绑定程序中的IO地址与实际接线表是否一致提醒接线图和点位表必须亲自核对联锁逻辑所有接触器、阀门的硬互锁与软互锁是否齐备AI可能漏掉工艺联锁不能直接依赖软逻辑故障处理急停、过载、失压保护、上电初始化状态是否齐全AI生成的代码只有核心逻辑缺少保护逻辑很常见手自动模式如果有手自动切换各模式下的输出控制是否互相隔离手自动互锁是现场最常见也是程序最容易出问题的点变量规范变量名、注释、程序块结构是否符合公司标准AI生成的变量风格可能七零八落后期维护困难安全底线允许下载前的人工确认流程是否执行上电这件事永远不能绕过现场工程师的判断这张清单看起来繁琐但你养成习惯后每条核一遍几分钟就完了。对于AI生成的代码我建议把这个流程当成强制项不要跳过——因为AI不会为你的设备事故负责供应商也不会。6. 我用DeepSeek踩过的五个坑每个都和代码质量有关说了这么多优点也该聊聊坑了。这段时间用DeepSeek写下来我碰到的问题基本集中在下面五类每一条都是真金白银换来的经验。6.1 一本正经地编造指令和系统功能块AI有一个很迷惑人的问题当它不确定某个指令是否存在时它有可能会“一本正经地胡说八道”编造出一个看起来完全合理的指令名。有一次我让它写一段和第三方设备通讯的程序它在代码里用了一个不存在的系统功能块名称编译立刻报错。如果是经验不太足的新手可能会以为是自己没装某个库文件浪费很多时间在搜这个根本不存在的功能块上。应对办法很简单所有AI用到的系统指令和功能块都要在编程软件自带的指令列表或系统库里确认一遍。特别是通讯类、诊断类、运动控制类的指令每个厂家的实现方式差异很大AI跨型号编造指令的概率非常高。6.2 逻辑“看起来对”实际缺了边界条件这是最隐蔽的坑。AI生成的一段电机控制逻辑正常流程完全正确启动、停止、过载保护、运行反馈都有了。但仔细思考会发现它没考虑启动按钮按着不放会怎么样没考虑运行反馈信号一直不回来会不会导致程序卡死没考虑PLC从停止切到运行模式时输出模块的初始状态。这些问题在实际运行中一定会遇到只是不一定每次都会发生。一段看似完美的程序往往就是在这些边界条件上把我坑住了。处理办法是在仿真阶段把这些“异常操作”全部试一遍不要只按正常流程测完就结束。6.3 上下文一长就开始“漂移”我在前面提过长对话的上下文管理问题这里再补充一点细节。实践中发现同一个对话窗口聊到五六轮以上之后AI输出内容时对你最初给出的IO表细节开始记忆模糊。比如它会把Q0.1和Q0.2的输出含义搞混或者在修改某个定时器参数时把另一个定时器的PT值也顺手改了。现在我的习惯是一个功能模块一个子任务完成一轮修改后把最终版代码单独保存出来而不是让AI在长对话里反复改动同一段程序。另外当DeepSeek提示对话达到长度上限时就先开新对话把保存的核心信息和最新版代码贴过去而不是硬着头皮在旧对话里继续聊。6.4 变量命名随性后期维护想摔键盘AI生成的代码变量命名很多时候是“能看但不好用”的状态。它会给变量起名Msg1、Temp2、Flag3图省事不像一个严谨的工程师会起的MotorRunFault、HandAutoModeSwitch、Pump1StarTimerET。如果只是自己跑个小Demo问题不大但如果要交付给客户或者交给运维团队后期维护这种变量名会引发很大的问题。拿回来的代码第一件事就是按你们公司的变量命名规范给关键变量重新命名。这个工作最好在生成后立刻做拖到后期AI又写了几百行引用旧变量名的逻辑改起来就费劲了。6.5 来路不明的“封装工具”别乱用网上能看到不少第三方开发者做的DeepSeek封装工具、桌面客户端、浏览器插件号称“一键接入”“超级加速”“无限多开”。这类工具我建议慎用尤其是一定不要往里面填你的API密钥或账号密码。我见过有同事用了某个封装工具之后账号被异地登录API额度被刷爆的案例。官方Web端和官方API能力足够覆盖我们的PLC编程场景不要把安全风险无谓地暴露给中间环节。6.6 本地部署还是在线使用先想清楚数据边界最后聊一个很多工控同行都在纠结的事公司要求项目资料严格保密AI对话内容会不会泄密我的处理方式是分场景来看。如果是做公司内部标准功能库、通用算法验证这类不带客户信息的程序用在线Web端聊完全没问题。但如果涉及具体项目名称、客户信息、特殊工艺就不要发给在线服务了可以选择在隔离环境用本地部署方案跑AI。本地部署对硬件有一定要求但换来的是数据不出内网的安心。说到底AI是工具怎么用、用在哪判断权一直在工程师自己手里。如果你也正打算把DeepSeek用到自己的PLC项目里我的建议很简单不要一上来就想让它帮你写整套几十个功能的复杂程序先从一个模块试起比如一段星三角、一个阀门顺控、一台变频器的启停逻辑。跑通一次完整的“需求描述→AI生成→编译→仿真→修改→下装”流程你对它能力的边界就有数了也知道哪些环节能偷懒、哪些环节必须亲自盯。AI生成代码的前半小时确实惊艳但真正让它值回票价的是后面你认真审过、改过、验证过的每一行逻辑——那才是工程落地的底气。
返回列表