引言
在汽车焊装、3C 装配、冲压加工、物流仓储等工业场景中,设备的安全联锁是避免人员伤亡、设备损坏的核心底线。一旦安全逻辑出现漏洞,轻则造成产线长时间停机,重则引发严重的安全事故。随着功能安全标准(如 ISO 13849、IEC 62061)的普及,工业设备的安全控制逻辑需要满足「故障导向安全」原则:即任何元件故障、信号异常时,设备优先进入安全状态,而非继续运行。
今天分享的FB_SafetyMonitor是一款轻量化的冗余安全监控功能块,逻辑简洁清晰,覆盖了急停冗余校验、安全门/光幕联锁、安全状态机管理、复位确认等核心安全功能,可直接嵌入中小型设备的安全控制程序中,满足 PLd/SIL2 及以下等级的安全需求。
1
程序代码及逻辑介绍
下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):
1.1
完整代码
FUNCTION_BLOCK FB_SafetyMonitor
VAR_INPUT
estop1 : BOOL; // 急停按钮1(常闭触点,未按下为1,按下为0)
estop2 : BOOL; // 急停按钮2(冗余,常闭触点)
lightCurtain : BOOL; // 光幕(常闭触点,未被遮挡为1,被遮挡为0)
safetyDoor : BOOL; // 安全门(常闭触点,关闭为1,打开为0)
resetButton : BOOL; // 复位按钮(上升沿触发)
acknowledge : BOOL; // 确认按钮(预留接口,可用于扩展权限校验)
END_VAR
VAR_OUTPUT
safeState : BOOL; // 整体安全状态:1=所有安全条件满足,可正常运行
safeTorqueOff : BOOL;// 安全扭矩关闭信号:输出给伺服驱动器,切断电机扭矩
safeStop1 : BOOL; // 安全停止1(IEC 61800-5-2标准,Category 1停止,断电制动)
safeStop2 : BOOL; // 安全停止2(Category 2停止,断电后保持位置)
alarm : BOOL; // 安全报警标志:1=当前存在安全故障
estopActive : BOOL; // 急停触发标志:1=当前有急停被按下
resetAcknowledged : BOOL; // 复位完成标志:1=已完成安全复位,可重启设备
END_VAR
VAR
estopRedundant : BOOL; // 冗余急停校验结果:1=双急停均正常,0=至少一个急停触发
safetyRequest : BOOL; // 安全请求标志:1=存在安全风险,需进入安全状态
lastReset : BOOL; // 上一次复位按钮状态,用于上升沿检测
timer : TIME; // 复位延时定时器
END_VAR
// 1. 冗余急停检查:双通道急停需同时正常才判定为无急停故障
// 注:急停采用常闭触点,未按下时为高电平,因此用AND逻辑判断两个均未触发
estopRedundant := estop1 AND estop2;
// 2. 安全请求生成:采用「与逻辑取反+或逻辑」实现多条件联锁
// 安全条件要求:急停正常、光幕无遮挡、安全门关闭,三者同时满足才安全
// 根据德摩根定律,只要有一个条件不满足,就触发安全请求
safetyRequest := NOT estopRedundant OR NOT lightCurtain OR NOT safetyDoor;
// 3. 安全状态机逻辑
IF safetyRequest THEN
// 场景1:存在安全风险,立即进入安全状态
safeTorqueOff := TRUE; // 切断伺服扭矩,电机立即失力
safeStop1 := TRUE; // 触发 Category 1 停止,设备立即制动
safeStop2 := TRUE; // 触发 Category 2 停止,用于需要保持位置的场景
alarm := TRUE; // 上报报警
estopActive := NOT estopRedundant; // 标记急停触发状态
resetAcknowledged := FALSE; // 复位完成标志清零,需重新复位才能恢复
ELSIF alarm THEN
// 场景2:已触发报警,等待复位操作
// 检测复位按钮上升沿,避免长按复位按钮重复触发定时器
IF resetButton AND NOT lastReset THEN
timer := T#2s; // 启动2秒复位延时,避免光幕/安全门瞬间抖动导致误恢复
END_IF;
IF timer > T#0s THEN
// 复位延时期间保持安全状态,不恢复运行
timer := timer - T#10ms; // 假设PLC循环周期为10ms,递减定时器
safeTorqueOff := TRUE;
safeStop1 := TRUE;
safeStop2 := TRUE;
// 延时结束,校验所有安全条件是否已恢复
IF timer <= T#0s THEN
IF estopRedundant AND lightCurtain AND safetyDoor THEN
// 所有安全条件满足,清除报警,恢复运行
alarm := FALSE;
safeTorqueOff := FALSE;
safeStop1 := FALSE;
safeStop2 := FALSE;
resetAcknowledged := TRUE;
END_IF;
END_IF
END_IF;
ELSE
// 场景3:所有安全条件满足,正常运行
safeTorqueOff := FALSE;
safeStop1 := FALSE;
safeStop2 := FALSE;
alarm := FALSE;
estopActive := FALSE;
END_IF;
// 4. 边沿检测存储:保存本次循环的复位按钮状态,供下次循环做上升沿判断
lastReset := resetButton;
1.2
核心逻辑说明
-
冗余急停设计:采用双通道急停并联校验,只有两个急停同时正常(均未按下)才判定为无急停风险,避免单急停线路断线、触点粘连等故障导致安全失效。
-
多条件联锁:光幕、安全门、急停三个安全装置采用「与逻辑」校验,只要有一个触发,设备立即进入安全状态,完全符合故障导向安全原则。
-
安全状态机:逻辑分为「安全请求触发→报警等待复位→条件校验恢复→正常运行」四个阶段,状态切换清晰,避免逻辑混乱导致的安全漏洞。
-
防误操作设计:复位按钮采用上升沿触发,配合 2 秒延时,避免人员短暂遮挡光幕、瞬间开门导致的误复位,同时防止长按复位按钮重复触发逻辑。
-
标准接口兼容:输出的
safeTorqueOff、safeStop1、safeStop2完全符合 IEC 61800-5-2 伺服安全标准,可直接对接主流品牌的伺服驱动器,无需额外转换逻辑。
2
典型应用场景
该功能块通用性极强,可覆盖绝大多数工业设备的安全联锁需求,典型场景包括:
-
冲压/注塑设备:冲压机工作区域安装安全门和光幕,只要安全门打开、光幕被遮挡,设备立即停止冲压动作,切断伺服扭矩,避免人手伸入模具区域造成伤残;双冗余急停避免单急停故障导致设备无法停机。
-
工业机器人工作站:协作机器人、码垛机器人周边安装光幕和安全门,人员进入工作区域时,机器人立即进入安全停止状态,等待人员离开、复位确认后才能重新启动,符合 ISO 10218 机器人安全标准。
-
物流仓储设备:堆垛机、分拣机的检修平台安装安全门,人员进入检修区域时自动停机,避免设备意外运行砸伤人员;双急停设计可在设备两侧紧急停机,提升应急响应效率。
-
非标自动化装配线:工位的安全门、光幕与设备控制逻辑联锁,装配过程中人员误入工位时自动停机,避免装配工具、运动部件造成人身伤害。
3
拓展思考
本功能块作为轻量化的安全监控方案,逻辑清晰易修改,但针对更高安全等级、更复杂的工业场景,还可以从以下几个方向拓展优化:
-
功能安全合规性优化原代码的冗余急停逻辑存在单点故障隐患:如果某路急停的常闭触点断线(输入信号始终为 1),即使另一路急停按下,也无法触发安全请求,不符合功能安全要求的「单点故障不导致安全失效」。优化方案包括:① 使用带断线检测的安全 IO 模块,定期检测急停线路通断;② 增加急停线路诊断逻辑,若某路急停信号长时间保持高电平(无论另一路状态),立即上报线路故障;③ 高安全等级场景下采用双 CPU 冗余运行本逻辑,通过投票机制避免单 CPU 故障导致的安全失效。
-
可配置性优化当前代码中的 2 秒复位时间、安全停止类型等参数为固定值,可改为输入变量,支持不同场景自定义参数;同时可增加故障码输出(WORD 类型),每一位对应一个安全装置的状态(如急停 1 故障、光幕故障、安全门故障等),方便上位机快速排查故障原因,缩短停机时间。
-
分布式场景适配若安全装置(急停、光幕、安全门)通过远程分布式 IO 接入,需增加通信超时判断逻辑:若 IO 站通信超时,立即触发安全请求,避免通信故障导致安全联锁失效;同时可增加安全逻辑同步机制,确保多 CPU 下的安全状态一致。
-
响应时间优化当前代码的定时器依赖 PLC 循环周期递减,若 PLC 循环周期不稳定,可能导致复位时间偏差。可替换为系统级 TON 定时器,或使用安全 PLC 的专用定时模块,确保安全响应时间符合标准要求(如安全停止响应时间需小于 100ms)。
总结
FB_SafetyMonitor是一款「小而全」的安全监控功能块,用不到 100 行的逻辑就实现了冗余急停、多条件联锁、状态机管理、复位确认等核心安全功能,非常适合中小型非标设备、低安全等级场景快速实现安全联锁需求。
但需要特别注意的是:安全逻辑没有「通用解」,所有安全设计都需要结合实际场景的风险评估结果来优化。如果是高安全等级的场景(如 PLe/SIL3),需要基于功能安全标准做完整的故障诊断、冗余设计、认证测试,不可直接套用通用逻辑。安全是工业现场的底线,每一行控制逻辑都要考虑「最坏情况下的故障状态」,确保故障时设备一定处于安全状态,才能真正守护人员与设备的安全。
你来出题 我来答![]()
![]()
![]()
欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。
往期回顾
每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比
每周一个编程小例子:记录设备运行时间
每周一个编程小例子:基于长按检测的启动控制系统
每周一个编程小例子:探秘 PLC 数据记录功能块
每周一个编程小例子:心跳检测与 PLC 应用
每周一个编程小例子:斜坡发生器
每周一个编程小例子:旋转速度计算
每周一个编程小例子:计算 PLC 循环周期|例程需求征集!
每周一个编程小例子:如何优雅的分割字符串
每周一个编程小例子:带反馈的阀门控制程序
每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块
每周一个编程小例子:曲线加减速的控制应用
每周一个编程小例子:轻松去除字符串前导字符
每周一个编程小例子:根据阈值更新输入
每周一个编程小例子:官方模拟量输入处理模块
每周一个编程小例子:主从电机的时序控制
每周一个编程小例子:基于一阶滞后滤波的优化方案
每周一个编程小例子:16 进制到浮点数的神奇转换
每周一个编程小例子:PLC 长按控制程序
每周一个编程小例子:PLC 程序实现多位整数拆分
每周一个编程小例子:流量累积计算器
每周一个编程小例子:用于连锁的电机标准控制模块
每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用
每周一个编程小例子:自定义种子生成随机数
每周一个编程小例子:可调时间的脉冲生成器
每周一个编程小例子:带滤波的标准模拟量输入功能块
每周一个编程小例子:使用 PLC 将字符串转换为日期格式
每周一个编程小例子:PLC 配方管理
每周一个编程小例子:比较两个 DB 块(STL)
每周一个编程小例子:如何使用 PLC 实现数组逆序
每周一个编程小例子:流量累计与批次控制
每周一个编程小例子:自定义循环执行控制程序
每周一个编程小例子:步进控制功能块
每周一个编程小例子:PLC 权重比例分配器
每周一个编程小例子:数字量输入组监控
每周一个编程小例子:实时数据分析
每周一个编程小例子:PLC 多轴同步控制的理解与应用
每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)
每周一个编程小例子:模拟量信号报警
每周一个编程小例子:组合数概率的实现
每周一个编程小例子:多传感器信号融合与优化方案
每周一个编程小例子:监控模拟信号的健康状态
每周一个编程小例子:PLC 程序实现模拟信号的线性校准
每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序
每周一个编程小例子:使用 PLC 程序让灯光呼吸
每周一个编程小例子:自适应性滤波器:动态调整以平衡响应与稳定性
每周一个编程小例子:卡尔曼滤波器在自动化中的简单应用
每周一个编程小例子:多模式定时器
每周一个编程小例子:基于 PLC 的编码器速度计算器
每周一个编程小例子:电机顺序启动与停止程序
每周一个编程小例子:电梯控制程序
每周一个编程小例子:自动门控制系统
每周一个编程小例子:智能停车场计数系统
每周一个编程小例子:智能照明控制系统
每周一个编程小例子:变频器控制
每周一个编程小例子:比例阀控制
每周一个编程小例子:脉冲输出的灵活控制
每周一个编程小例子:计算移动平均值
每周一个编程小例子:速率限制器
每周一个编程小例子:线性插值法线性化感器
每周一个编程小例子:循环队列FIFO
每周一个编程小例子:温度均匀性控制
每周一个编程小例子:设备安全计时功能
每周一个编程小例子:流量分配控制
每周一个编程小例子:数据转换的魔力
2026年9月