Skip to main content


 

引言

工业现场的控制系统可是生产的“大脑”,小到包装机、灌装线,大到风电主机、化工反应釜,一旦 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

   

核心逻辑亮点说明

  1. 上升沿喂狗设计:仅当feedDog从 0 变 1 的瞬间才重置定时器,避免喂狗信号粘连(比如信号线断路 stuck at 1)导致的误判,比普通的高电平喂狗逻辑可靠性高得多。

  2. 80%提前预警:默认在超时前的 80%时间就触发警告状态,不用等彻底超时才被动响应,给故障排查留足缓冲时间。

  3. 跨平台兼容:所有变量和运算都符合 IEC 标准语法,不用修改就能在不同品牌 PLC 上移植使用。

  4. 资源占用极低:内部仅用了 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%以上的看门狗需求,如果有特殊场景,也可以基于现有逻辑快速扩展:

  1. 适配不同调用周期:如果你的项目主程序周期不是 10ms,可以把代码里固定的T#10ms改成输入变量,调用时传入当前任务的周期,比如 5ms 周期就传T#5ms,不用修改内部逻辑。

  2. 增加故障分类状态:现在只有 3 个状态,如果需要区分“主程序卡死”和“喂狗信号线断路”,可以增加一个状态:连续 10 个周期没有检测到feedDog的上升沿,就判定为“喂狗信号丢失”,方便快速排查故障根因。

  3. 多级看门狗架构:对于复杂的大型系统,可以实例化多个 FB_Watchdog,分层监视不同优先级的任务:比如安全逻辑用T#100ms超时,超时直接触发急停;主控制逻辑用T#500ms超时,超时切备用控制;通信、HMI 逻辑用T#2s超时,超时仅报警不停止生产,兼顾安全和生产连续性。

  4. 增加统计功能:可以新增两个计数器输出,每次喂狗计数+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月