引言
工业现场的控制系统可是生产的“大脑”,小到包装机、灌装线,大到风电主机、化工反应釜,一旦 PLC 死机、控制逻辑卡顿,轻则几小时产量损失,重则设备损坏、甚至引发安全事故。很多工程师都遇到过这种糟心事:排查半天才发现是某段小逻辑的死循环卡住了主程序,要是能提前发现程序卡顿、及时止损就好了。
今天给大家带来的这款标准化 FB_Watchdog 看门狗功能块,就是专门解决这类问题的“安全哨兵”:用极少的 PLC 资源,就能实时监视程序运行状态,提前预警、超时报警,是工业控制系统可靠性设计的必备工具。
1
程序代码及核心逻辑介绍
1.1
完整功能块代码
下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):
FUNCTION_BLOCK FB_Watchdog
VAR_INPUT
feedDog : BOOL; // 喂狗信号:由被监视的程序周期性置位
timeout : TIME; // 超时阈值:自定义允许的最大无喂狗时间
enable : BOOL; // 使能位:TRUE时启用看门狗,FALSE时停用不误报
reset : BOOL; // 复位信号:手动复位所有状态,用于调试或故障后恢复
END_VAR
VAR_OUTPUT
timeoutEvent : BOOL; // 超时事件:拉高代表被监视程序已超时未运行
timeRemaining : TIME;// 剩余时间:距离超时还剩多久,方便监控
status : INT; // 状态字:0=正常,1=警告(达80%阈值),2=超时
END_VAR
VAR
timer : TIME; // 内部倒计时定时器
lastFeed : BOOL; // 上一次喂狗信号状态,用于上升沿检测
warningTimer : TIME; // 警告阈值定时器,默认设为超时时间的80%
END_VAR
// 1. 手动复位逻辑:复位后所有状态清零,定时器回到初始值
IF reset THEN
timer := timeout;
// 计算80%超时时间的警告阈值,TIME类型不能直接乘系数,转REAL计算保证跨平台兼容
warningTimer := REAL_TO_TIME(TIME_TO_REAL(timeout) * 0.8);
timeoutEvent := FALSE;
timeRemaining := timeout;
status := 0;
RETURN; // 复位后直接退出,避免后续逻辑修改状态
END_IF;
// 2. 未使能时直接返回正常状态,不会触发任何报警,方便调试或临时停用
IF NOT enable THEN
timeoutEvent := FALSE;
timeRemaining := timeout;
status := 0;
RETURN;
END_IF;
// 3. 喂狗检测:仅检测feedDog的上升沿(从0变1)时重置定时器
IF feedDog AND NOT lastFeed THEN
timer := timeout;
warningTimer := REAL_TO_TIME(TIME_TO_REAL(timeout) * 0.8);
timeoutEvent := FALSE;
status := 0;
END_IF;
lastFeed := feedDog; // 保存当前喂狗状态,供下一次沿检测使用
// 4. 定时递减与状态判断:默认10ms调用一次本功能块,每次减10ms
IF timer > T#0s THEN
timer := timer - T#10ms; // 若你的调用周期不是10ms,修改此处对应值即可
timeRemaining := timer;
// 到达80%超时时间时触发警告,提前给工程师排查问题的时间
IF timer <= warningTimer THEN
status := 1;
END_IF;
// 倒计时归零时触发超时事件
IF timer <= T#0s THEN
timeoutEvent := TRUE;
status := 2;
END_IF;
ELSE
// 边界保护:避免TIME类型出现负值,同时确保超时状态被正确置位
timeoutEvent := TRUE;
status := 2;
END_IF;
1.2
核心逻辑亮点说明
-
上升沿喂狗设计:仅当
feedDog从 0 变 1 的瞬间才重置定时器,避免喂狗信号粘连(比如信号线断路 stuck at 1)导致的误判,比普通的高电平喂狗逻辑可靠性高得多。 -
80%提前预警:默认在超时前的 80%时间就触发警告状态,不用等彻底超时才被动响应,给故障排查留足缓冲时间。
-
跨平台兼容:所有变量和运算都符合 IEC 标准语法,不用修改就能在不同品牌 PLC 上移植使用。
-
资源占用极低:内部仅用了 3 个内部变量,内存占用不到几十字节,哪怕是小型 PLC 也能轻松使用。
2
典型应用场景
这个功能块几乎能覆盖所有需要“程序运行状态监视”的场景,举几个最常用的例子:
2.1
主程序循环监视(最经典用法)
把feedDog接你主控制程序的运行标志位(比如主程序每周期置位一次的 BOOL 变量),enable接常开,timeout根据主程序周期设置:比如主程序 10ms 跑一次,就设T#500ms(相当于 50 个周期没运行就判定卡死)。
-
超时信号可以接报警灯、声光报警器,也可以接备用控制回路的切换信号:比如风电主控 PLC 卡顿时,自动切到安全模式停机,避免风机飞车;汽车焊装线 PLC 卡顿时,立刻给机器人发急停,避免撞坏价值几十万的夹具。
2.2
通信链路监视
不用再为每个通信口单独写超时逻辑:把feedDog接通信正常的标志位(比如每次收到 Modbus、Profinet 的响应帧就置位一次),timeout设T#200ms,一旦通信中断超过 200ms 就立刻触发超时报警,大幅减少通信故障的排查时间。
2.3
工艺动作超时监视
比如物料输送线电机启动后,3 秒内应该到位,到位信号反馈回来就给feedDog置位一次;如果 3 秒没到位,看门狗触发超时,直接报“卡料故障”并停机,避免电机长时间过载烧坏,或者物料堵料损坏设备。
2.4
高危设备人机交互监视
对于压力机、注塑机、冲压设备等高危设备,可以设置timeout为T#60s,要求操作员每 60 秒在 HMI 按一次“运行确认”按钮,否则触发超时自动停机,避免操作员离开岗位误操作引发安全事故。
3
拓展思考:如何根据需求改造功能块?
这个功能块已经覆盖了 90%以上的看门狗需求,如果有特殊场景,也可以基于现有逻辑快速扩展:
-
适配不同调用周期:如果你的项目主程序周期不是 10ms,可以把代码里固定的
T#10ms改成输入变量,调用时传入当前任务的周期,比如 5ms 周期就传T#5ms,不用修改内部逻辑。 -
增加故障分类状态:现在只有 3 个状态,如果需要区分“主程序卡死”和“喂狗信号线断路”,可以增加一个状态:连续 10 个周期没有检测到
feedDog的上升沿,就判定为“喂狗信号丢失”,方便快速排查故障根因。 -
多级看门狗架构:对于复杂的大型系统,可以实例化多个 FB_Watchdog,分层监视不同优先级的任务:比如安全逻辑用
T#100ms超时,超时直接触发急停;主控制逻辑用T#500ms超时,超时切备用控制;通信、HMI 逻辑用T#2s超时,超时仅报警不停止生产,兼顾安全和生产连续性。 -
增加统计功能:可以新增两个计数器输出,每次喂狗计数+1,每次超时计数+1,方便后续做设备健康度分析,统计设备的故障率、卡顿频率。
总结
这个 FB_Watchdog 看门狗功能块虽然代码量不大,但把看门狗逻辑的细节都考虑到了:上升沿喂狗避免误判、80%提前预警减少损失、标准化语法全平台兼容、资源占用极低适配所有 PLC。 工业自动化领域有句话叫“可靠性是设计出来的,不是测出来的”,很多大型停机事故往往都是因为小的监视逻辑缺失导致的。把这个功能块加到你的标准函数库裡,每个项目只要花 1 分钟调用、接几个信号,就能给控制系统加一道可靠的“安全锁”,既节省开发时间,又能大幅降低现场故障率,绝对是 PLC 工程师工具箱里必备的“神器”。
你来出题 我来答![]()
![]()
![]()
欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。
往期回顾
每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比
每周一个编程小例子:记录设备运行时间
每周一个编程小例子:基于长按检测的启动控制系统
每周一个编程小例子:探秘 PLC 数据记录功能块
每周一个编程小例子:心跳检测与 PLC 应用
每周一个编程小例子:斜坡发生器
每周一个编程小例子:旋转速度计算
每周一个编程小例子:计算 PLC 循环周期|例程需求征集!
每周一个编程小例子:如何优雅的分割字符串
每周一个编程小例子:带反馈的阀门控制程序
每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块
每周一个编程小例子:曲线加减速的控制应用
每周一个编程小例子:轻松去除字符串前导字符
每周一个编程小例子:根据阈值更新输入
每周一个编程小例子:官方模拟量输入处理模块
每周一个编程小例子:主从电机的时序控制
每周一个编程小例子:基于一阶滞后滤波的优化方案
每周一个编程小例子:16 进制到浮点数的神奇转换
每周一个编程小例子:PLC 长按控制程序
每周一个编程小例子:PLC 程序实现多位整数拆分
每周一个编程小例子:流量累积计算器
每周一个编程小例子:用于连锁的电机标准控制模块
每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用
每周一个编程小例子:自定义种子生成随机数
每周一个编程小例子:可调时间的脉冲生成器
每周一个编程小例子:带滤波的标准模拟量输入功能块
每周一个编程小例子:使用 PLC 将字符串转换为日期格式
每周一个编程小例子:PLC 配方管理
每周一个编程小例子:比较两个 DB 块(STL)
每周一个编程小例子:如何使用 PLC 实现数组逆序
每周一个编程小例子:流量累计与批次控制
每周一个编程小例子:自定义循环执行控制程序
每周一个编程小例子:步进控制功能块
每周一个编程小例子:PLC 权重比例分配器
每周一个编程小例子:数字量输入组监控
每周一个编程小例子:实时数据分析
每周一个编程小例子:PLC 多轴同步控制的理解与应用
每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)
每周一个编程小例子:模拟量信号报警
每周一个编程小例子:组合数概率的实现
每周一个编程小例子:多传感器信号融合与优化方案
每周一个编程小例子:监控模拟信号的健康状态
每周一个编程小例子:PLC 程序实现模拟信号的线性校准
每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序
每周一个编程小例子:使用 PLC 程序让灯光呼吸
每周一个编程小例子:自适应性滤波器:动态调整以平衡响应与稳定性
每周一个编程小例子:卡尔曼滤波器在自动化中的简单应用
每周一个编程小例子:多模式定时器
每周一个编程小例子:基于 PLC 的编码器速度计算器
每周一个编程小例子:电机顺序启动与停止程序
每周一个编程小例子:电梯控制程序
每周一个编程小例子:自动门控制系统
每周一个编程小例子:智能停车场计数系统
每周一个编程小例子:智能照明控制系统
每周一个编程小例子:变频器控制
每周一个编程小例子:比例阀控制
每周一个编程小例子:脉冲输出的灵活控制
每周一个编程小例子:计算移动平均值
每周一个编程小例子:速率限制器
每周一个编程小例子:线性插值法线性化传感器
每周一个编程小例子:数据转换的魔力
每周一个编程小例子:PLC 安全监控功能块
2026年10月