> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# PLC 程序设计：五步，让 Agent 从需求走到验收
- URL: https://www.hubwiz.com/blog/plc-program-design-five-stages/
- Published: 2026-11-07T17:23:39.000Z
- Updated: 2026-11-08T03:52:42.000Z
- Description: 技能名 plc-program-design：五步工作流，每步一份能交接的产物。装了就能照顺序做。
- Author: admin
- Tags: PLC, 博途, SCL, 工业 AI, TIA Portal

我们把 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 里跑通过（编译、下载、用例都过）。用处不是"看它能跑"，而是让你看到接口表、状态机骨架和用例表**实际长什么样**——照着改比照着读快得多。

---

## 六、怎么开始

```bash
npx skills add tia-forge/plc-program-design

```

或者把 `SKILL.md` 放进你智能体的 skills 目录（Claude Code、Cursor、pi、WorkBuddy 都认 `SKILL.md` 加 frontmatter）。

装完第一句话可以直接用这个：

```text
读我给的工艺描述，先不要写 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](https://github.com/tia-forge/plc-program-design?ref=hubwiz.com)。

要把第 3、4 步接到真实工程上，用 [TiaLink](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=plc-program-design-five-stages)：在博途里建块、编译、下载到仿真、读回核对——同样的五步，最后一步从"纸面判据"变成"工程里的证据"。

本文由汇智网整理撰写，转载请注明出处。TIA Portal、SIMATIC、S7、PLCSIM 是 Siemens AG 的商标，本文与 Siemens AG 无隶属或背书关系。

> **这是「AI × 工业 / PLC」专题的一部分。**完整地图见：[AI × 工业 / PLC 完全指南](https://www.hubwiz.com/blog/ai-industrial-stack/)