ARTICLE · 1134354
安全PLC程序结构规范:防止逻辑混乱的模板设计
🟢 选型指南|安全PLC程序结构规范:防止逻辑混乱的模板设计
「硬件选对了,程序写乱了,安全功能照样不成立。」——安全PLC的CPU、认证功能块库都是经过认证的,但把它们连起来的应用程序,认证机构并不替你背书。这篇文章聊聊安全PLC程序的结构化模板设计,以及几个能在评审和审计里省下大量时间的做法。
01开场:一份“谁都在改”的安全程序
某汽车零部件厂的老冲压线,安全PLC是2015年上的。八年里程序被三拨人维护过:最初的集成商、两年前的改造商、以及厂里自己的一位电气工程师。
一次定期的安全功能验证里,出现了这样一幕:
•安全门 S1 的输入信号,在程序里被引用 7 处:安全输出逻辑、HMI 显示、与机器人互锁、光幕逻辑,以及三个不同年代的历史遗留网络
•其中一处是两年前改造时加的临时旁路,注释写着“调试后删除”——但没删
•急停回路的输出点,在两个网络里都被写:一处按急停逻辑写 0,另一处按“设备启动条件”写 1
验证时按下急停,输出确实断了——因为两个网络的执行顺序里,“写 0”恰好排在“写 1”之后。
换个说法:这台设备的安全功能,依赖的是两个写操作的先后顺序,而不是设计者的明确意图。 只要有人调整网络顺序、或在中间插入一段程序,这个先后关系就变了,而现场没有人会发现——直到某次真正需要它动作的时候。
这次只是险兆(near miss),没有人员受伤。整改时做的第一件事不是换硬件,而是重写程序结构:把 7 处引用归并到 1 处、把双写输出改成单一所有者、把旁路逻辑从“散落在程序各处”改成“集中在一个带许可条件和计时的功能块里”。
这个案例想说明的是:安全PLC的硬件是认证过的,程序不是。应用程序的正确性,只能靠结构规范 + 验证流程来保证。
02先看数据:程序结构问题一般长什么样
以下分布来自几个项目程序评审的经验整理,属于示意性质,不是统计抽样结果,供对照自查:
把这些数字放到一台设备上看:一个中等规模的冲压单元,安全程序可能有 3000~6000 个网络,涉及 10~20 个安全功能。结构一旦失控,靠“逐条读程序”是查不干净的——这也是为什么结构规范值得在项目开始时就定下来。
03结构规范的八个要点
1|先搞清楚:安全认证覆盖到哪里为止
这是很多讨论容易含糊的地方。分工大致是这样的(以各厂商证书和标准原文为准):
| 把库块连成“这台设备的安全功能”的应用程序(SRASW) | 不在认证范围 | 用户 / 集成商 |
也就是说:“用了认证功能块”不等于“程序是对的”。 标准对安全相关应用软件(SRASW)是有具体要求的——软件安全要求规范、架构设计、模块化设计、编码限制、集成与测试、验证、修改管理(ISO 13849-1 的软件条款;2015 版在 4.6 条,2023 版章节编排有调整,以标准原文为准)。IEC 61508-3 则给出了更完整的软件安全生命周期框架。
应用程序这部分,只能靠自己的规范和流程。
2|四层结构模板:把“读、判、写、报”分开
一个比较省心的结构是把安全程序分成四层,职责不交叉:
安全应用程序的四层结构(建议模板)
① 输入映射层 物理I/O → 安全输入变量 双通道等效性 / 反相信号检查(多数厂商可用专用库块完成) 测试脉冲状态、输入诊断位汇总 —— 只做“读”,不做逻辑判断;输入变量只在本层写入
② 逻辑判断层 一个安全功能 = 一个功能块实例 急停类 / 门监控类 / 光幕+Muting 类 / 双手控制类 / 使能类 … 复位信号、许可条件、时间参数在本层显式取得(不从全局随意取用)
③ 输出驱动层 每个安全输出只有一个所有者(单一写入者原则) 输出 = 逻辑层结果 + EDM 反馈监控结果 输出变量只在本层写入
④ 诊断与信息层 把前两层的诊断位、复位需求、旁路生效状态汇总成状态字 以只读方式交给标准PLC / HMI 显示 —— 禁止标准程序回写安全数据
这四层不是标准强制要求,但好处很实在:读程序的人知道去哪儿找“这个输出为什么是 0”。
3|单一所有者:一个安全输出只允许一处写
这是投入产出比最高的一条规范。
⚠️ 一个容易踩的坑:有同事会认为“写 0 的那段在写 1 的后面,所以没问题”。这在功能上是成立的,但在可维护性上不成立——它把安全逻辑变成了对执行顺序的隐式依赖,而这种依赖在图纸和文档里看不出来。顺序一旦变化,安全功能就悄悄降级了。
4|功能块实例化:一个安全功能 = 一个实例 = 一个地址
5|复位逻辑集中化
复位是安全程序里最容易“各写各的”的部分,建议统一约定:
(防止意外启动、重启动要求可参考 IEC 60204-1 / GB/T 5226.1 与 ISO 14118 / GB/T 19670。)
6|旁路与 Muting:结构化,而不是“藏起来”
调试用的旁路是现场的现实需求,禁不掉,但可以结构化成安全的东西:
7|命名与参数集中管理
8|变更与再验证:程序版本本身就是安全资料
04模板示例:一个安全门监控功能的骨架
下面是一个结构示意(中立伪代码,不是任何厂商的实际实现),主要用来看“一个实例应该包含哪些东西”:
【安全门监控功能 —— 结构示意】
实例名 : SF_DOOR_01
安全地址 : 1001
对应设备 : 冲压线上料门 S1
私有变量(本实例独占,不与其它实例共用)
IN_A 门开关通道A
IN_B 门开关通道B(等效性 / 反相检查)
EDM K1、K2 反馈触点
RESET 复位按钮(手动,上升沿有效)
LOCK_REQ 门锁/运行许可请求
时间参数 t_EDM_START / t_EDM_STOP / t_RESET ← 取自集中参数表,不写魔数
每个扫描周期的处理顺序
1) 读输入映射层的双通道状态,做等效性判断
2) 门未关闭 → 输出禁止启动,并置“需要复位”
3) 门关闭且等效性成立 → 等待复位(不自动启动)
4) 复位条件:门关闭 + 故障已清除 + RESET 上升沿 + 视觉确认
5) 输出驱动:ON 条件全部满足才输出;
EDM 反馈在 t_EDM_START 内未到位 → 判故障
6) 任一故障 → 断开输出 + 置“需要复位” + 上报诊断码
对外输出(供输出驱动层与诊断层使用)
Q_ENABLE 安全使能 —— 本实例是该变量唯一的写入者
DIAG_CODE 故障代码
RESET_REQUIRED 需要复位标志
BYPASS_ACTIVE 旁路生效标志(如配置了旁路)
一个实践中的省力做法:多数厂商的认证功能块库里,等效性检查、EDM 监控、启动测试、诊断代码、复位需求判断这些内部逻辑已经做好了(例如西门子 F 库中的急停、门监控、反馈监控、全局确认等类别的块;皮尔磁(Pilz) PNOZmulti 的图形元素;倍福 TwinSAFE 的逻辑端子等)。优先调用库块,而不是手写梯形图实现等效性判断,是最省事、也最经得起审计的一条。具体的块名、引脚和限制条件,以厂商最新手册为准。
05品牌 / 平台对比:安全程序结构与组态工具
几点选型上的体会:
1.程序结构能力比库块数量更重要——交叉引用检查、安全/标准变量隔离、编译期“多次写入”告警这些机制,直接决定后期维护成本
2.改造项目优先“安全侧独立 + 图形化组态”——不改原标准程序,风险最小
3.多人维护的场合,模板先行——先定层次结构、命名规范、参数表、实例清单,再动手写逻辑
4.各厂商允许的安全语言集合、库块命名与版本差异较大,上表仅为结构性对照,具体以官方最新手册和认证证书为准
06坑点总结:安全程序里最容易踩的坑
| 同一输出多处写入 | ||||
| 逻辑分散 | ||||
| 调试旁路未删 | ||||
| 复位逻辑各写各的 | ||||
| 手写等效性判断 | ||||
| 时间参数是魔数 | ||||
| 标准程序回写安全数据 | ||||
| 多个功能共用实例 | ||||
| 安全地址编号无表 | ||||
| 程序版本无记录 | ||||
| 下载即完事 | ||||
| 扫描周期忽略不计 |
07结语
回到开场那条冲压线——问题从来不在硬件选型上,而在于程序有没有“结构”。四层分层、单一写入者、一功能一实例、复位集中、旁路结构化、参数集中、变更留痕,这几条加起来并不复杂,但它们决定了八年之后这份程序还能不能被看懂、被安全地修改。
几个落地动作:
1.动手前先定模板——层次结构、命名前缀、参数表、实例与地址编号表,四项先定下来
2.把编译器的“多次写入”告警当错误处理——不要用“能编译过”当验收标准
3.优先调用认证功能块库——等效性检查、EDM 监控、诊断代码尽量不手写
4.旁路必须可见、可限时、可追溯——程序里的旁路,永远不如一把钥匙可靠
5.程序版本和验证记录一起归档——这是审计里最实在的“证据链”
一句话记住:安全PLC的硬件是认证的,程序不是——结构规范决定了这份程序在被修改之后,还安不安全。
以上内容基于 ISO 13849-1、IEC 61508-3、IEC 62061 及主流厂商安全编程手册整理,各厂商允许的安全编程语言、库块名称与限制条件差异较大以官方最新手册为准,安全要求以标准原文为准。文中程序结构为通用示意,非任何厂商的实际实现。
08参考资料
1.ISO 13849-1:2023 / GB/T 16855.1-2025 — 机械安全 控制系统安全相关部件 第1部分:设计通则(含安全相关应用软件 SRASW 的要求)
2.IEC 61508-3:2010 / GB/T 20438.3 — 电气/电子/可编程电子安全相关系统的功能安全 第3部分:软件要求
3.IEC 62061:2021 / GB/T 28526 — 机械安全 安全相关电气、电子和可编程电子控制系统的功能安全
4.IEC 61131-3 — 可编程控制器 第3部分:编程语言
5.IEC 60204-1 / GB/T 5226.1-2019 — 机械电气安全 机械电气设备 第1部分:通用技术条件(复位与重启动要求)
6.ISO 14118 / GB/T 19670 — 机械安全 防止意外启动
7.IEC 61784-3 — 工业通信网络 行规 第3部分:功能安全通信(PROFIsafe / CIP Safety / FSoE 等)
8.SIEMENS / Pilz / Rockwell / Omron / Beckhoff / Schneider / Mitsubishi / Wieland — 安全PLC 安全编程手册与安全功能块库说明(以各厂商官方最新文档为准)
本文内容基于公开标准文献与行业实践经验整理,以标准原文为准。安全程序设计涉及具体设备的风险评估结果与厂商实现差异,建议结合厂商技术支持和项目实际进行确认;文中提到的程序结构与参数取值均为示意。