PLC 程序设计:五步,让 Agent 从需求走到验收
技能名 plc-program-design:五步工作流,每步一份能交接的产物。装了就能照顺序做。
我们把 PLC 程序设计的流程做成了一份技能(skill)。它把一件事拆成五步——需求、IO、模块、SCL、验收——每一步都产出一份能交接的东西,缺一份就不往下一步走。
它不生成代码模板,也不替你画图。它管的是顺序和产物:先有动作矩阵,才谈得上点位表;先有接口表,才谈得上写状态机;先有验收用例,才谈得上"做完了"。
一、为什么把设计做成一条工作流
PLC 项目返工,很少是因为某段逻辑写得不够巧。绝大多数出在跳步:
- 需求停在口头。现场问"料到了就推一下",写成程序时没人能回答"推多久""没到位怎么办""谁能复位"。
- 点位表没留余量。调试期加两个传感器,整段地址要重排。
- 块没有接口表。半年后要改一个设备,先得读完它从哪读输入、往哪写输出。
- 没有验收用例。改完只能上机试,试通了也不知道有没有试漏。
这四件事都不是"代码问题",但都会变成代码问题。工作流的作用是把它们提前成可核对的产物:一份表能被人指着说"这里不对",一段代码不能。
Agent 在这里是执行者,不是前提。人照着这五步做,产物一样。
二、五步与五份交付物
| 步 | 做什么 | 交付物 | 过关判据 |
|---|---|---|---|
| 0 | 需求分析 | 动作矩阵:谁 / 何时动 / 动多久 / 什么算完成 / 出错怎么办 / 谁能复位,外加模式矩阵(自动 / 手动 / 维护) | 每一行动作都能指到一个传感器和一个执行器 |
| 1 | IO 设计 | 点位表:地址、符号、类型、量程、正常态、所属模块 | 地址分段无冲突、余量 ≥20%、安全回路不在表内 |
| 2 | 模块拆分 | 模块清单 + 接口表(i_ / q_ / stat_)+ 块号与 DB 规划 |
一个设备一个 FB;工艺层不直接写 Q |
| 3 | 实现 | SCL 源 + 接口读回 + 调用关系 | 块尾统一赋值;每个状态有超时;故障只有一条复位路径 |
| 4 | 验收 | 编译原文 + 用例表 PASS/FAIL + 回归子集 | 编译 → 一致性 → 用例 → 变更回归,顺序不可换 |
技能的正文不是这段原则,而是每一步的模板、判据和可以直接贴给 Agent 的提示词。
三、每份交付物长什么样
需求:动作矩阵
| 谁 | 什么时候动 | 动多久 | 什么算完成 | 出错怎么办 | 谁能复位 |
|---|---|---|---|---|---|
| 输送机 Conv1 | 启动且安全回路正常 | 到分拣位光电 | 分拣位光电上升沿 | 5 s 未到 → 进料超时 | 故障态下复位按钮,模式=手动 |
| 气缸 A | 分拣位有件且质量合格 | 到伸出到位 | ExtEnd 信号 |
3 s 未到 → 伸出超时 | 同上 |
需求里没写清的条件,技能要求列成"待确认"问你,不允许替人补默认值——补一个默认值,就是埋一次返工。
IO:点位表
| 地址 | 符号 | 类型 | 说明 | 正常态 |
|---|---|---|---|---|
%I0.0 |
DI_Conv1_PartAtEntry |
Bool | 入口光电 | 0 |
%Q0.0 |
DO_Conv1_Run |
Bool | 输送机运行 | 0 |
%IW64 |
AI_Tank1_Level |
Int | 液位 0–1000 mm,4–20 mA | — |
三条硬规则:地址从硬件读回来(规划常常和实际起始地址不一样);DI / DO 各占独立段并留 20% 余量;急停、安全门、光幕不进普通 DI——那是安全继电器或安全 PLC 的事,普通 DI 只接它的"回路正常"辅助触点做联锁。
模块:清单 + 接口表
设备层一个物理设备一个 FB,工艺层管顺序和互锁,OB 只做调用。接口先定,再开写:
| 块 | 名 | i_(输入) | q_(输出) | stat_(静态) |
|---|---|---|---|---|
| FB | FB_Motor |
i_xStart, i_xStop, i_xFeedback, i_xReset, i_tFbTimeout |
q_xRun, q_xFault, q_wFaultCode |
stat_xRun, stat_tFb, stat_xFault |
实现:四条规矩
块首给所有输出默认值;中间只改状态;块尾统一赋值;停止与安全钳位放在赋值之后——同一个扫描周期里谁最后写谁赢,顺序写反,停止按钮就是摆设。
另外两条:每个状态配一个超时(没有超时的状态机在现场等于死锁);故障统一一个出口(进同一个故障步、给故障码、留一条复位路径)。
验收:四级闸 + 用例表
编译 → 一致性(接口读回 vs 接口表)→ 用例 → 变更回归,顺序不可换。
| # | 场景 | 输入 | 期望 |
|---|---|---|---|
| 1 | 启动 | 安全=1、启动=1 | 状态 10,输送机=1 |
| 2 | 进料 | 入口光电 → 分拣位光电,质量 OK | 状态 20,气缸 A=1、B=0 |
| 3 | 故障复位 | 故障态下复位上升沿 | 回 Idle,故障码清 0 |
用例写的判据只有一条:每条都能只靠输入序列复现。写不出输入序列的,是愿望不是用例。另外每条开头先回确定初始态,并把它单独判一条——不回初始态,拿到的是上一条的残留。
四、实现阶段常见的返工点
技能里有一整张反模式表,下面是最常见的六条:
| 反模式 | 后果 |
|---|---|
两个名字只差大小写(i_xExtend / i_xExtEnd) |
博途标识符大小写不敏感,编译报"参数重复" |
TON 的复位调用只给 IN := FALSE |
编译报 Parameter 'PT' has to be used,复位调也要给 PT |
| 停止钳位写在块尾赋值之前 | 被后面的赋值覆盖,停机无效 |
| 设备层只有请求口、没有撤销口 | 工艺层离步后设备层仍在跑,超时故障在无关时刻爆出 |
设备层故障上抛写在 CASE 之后 |
复位当拍被重新拉回故障步,复位无效 |
用全局 M 点传状态、自己累加计时 |
换 CPU 就不准,两个块互相踩 |
前两条编译器会拦住你,后四条只能靠"实现完就读回来 + 跑用例"发现。这也是为什么第 4 步不能省。
五、附带的示例
技能里带一个完整示例,可以直接照着复现:
- SCL 外部源:设备层
FB_Cylinder、FB_Conveyor,工艺层FB_SortStation(状态机),加一个实例 DB,一次导入。 - 点位:2 个光电 + 质量结果 + 面板按钮 + 2 个气缸的到位反馈,输出 7 点。
- 用例:8 条,覆盖正常流、边界、故障、复位、模式切换,外加 1 条"气缸伸出中停机"。
它在博途 V19 + S7-PLCSIM Advanced 里跑通过(编译、下载、用例都过)。用处不是"看它能跑",而是让你看到接口表、状态机骨架和用例表实际长什么样——照着改比照着读快得多。
六、怎么开始
npx skills add tia-forge/plc-program-design
或者把 SKILL.md 放进你智能体的 skills 目录(Claude Code、Cursor、pi、WorkBuddy 都认 SKILL.md 加 frontmatter)。
装完第一句话可以直接用这个:
读我给的工艺描述,先不要写 SCL。产出三张表:
1) 动作矩阵:谁/何时动/动多久/算完成的判据/出错怎么办/谁能复位;
2) IO 点位表:地址、符号、类型、量程、正常态、所属模块,按站点分段并留 20% 余量;
3) 模块清单 + 接口表:设备层/工艺层各有哪些块,每块的 i_/q_/stat_ 分别是什么。
需求里没写的,列「待确认」问我,不要补默认值。
不装博途也能用大半:前两步是纸面产物,第 3 步写 SCL,第 4 步用云仿真跑用例。要把程序真正落进工程——建块、编译、下载、读回核对——才需要一条连到博途的链路。
七、边界
- 它保证"程序按设计工作",不保证"设计是对的"。设计与验收要人签字。
- 安全功能不进生成物:急停、安全门、光幕由安全继电器或安全 PLC 实现,硬联锁用气动或电气,时间与传感器标定必须在真机上做。
- 需求里没写的,它会列成"待确认"问你,不补默认值——这不是偷懒,是为了让缺的那一项在纸上就暴露出来。
这份技能是免费的知识包(CC BY 4.0),代码与示例在 https://github.com/tia-forge/plc-program-design。
要把第 3、4 步接到真实工程上,用 TiaLink:在博途里建块、编译、下载到仿真、读回核对——同样的五步,最后一步从"纸面判据"变成"工程里的证据"。
本文由汇智网整理撰写,转载请注明出处。TIA Portal、SIMATIC、S7、PLCSIM 是 Siemens AG 的商标,本文与 Siemens AG 无隶属或背书关系。
这是「AI × 工业 / PLC」专题的一部分。完整地图见:AI × 工业 / PLC 完全指南