PLC 程序设计:五步,让 Agent 从需求走到验收

技能名 plc-program-design:五步工作流,每步一份能交接的产物。装了就能照顺序做。

分享
PLC 程序设计:五步,让 Agent 从需求走到验收

我们把 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 完全指南