说句实话,我一开始对“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/DC,TIA 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/DC,TIA 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生成代码的前半小时确实惊艳,但真正让它值回票价的,是后面你认真审过、改过、验证过的每一行逻辑——那才是工程落地的底气。