1. 功能概述
FB1_HeartBeat是一个专门用于监控通讯连接状态的功能块。它通过定期检测心跳信号的变化来判断通讯链路是否正常,当检测到通讯中断时会触发报警机制。该功能块广泛应用于工业自动化系统中,确保关键通讯连接的可靠性。
2. 工作原理
2.1 核心检测机制
双值比较法
-
- : 通过时钟信号控制,交替采样两次心跳值
变化检测
-
- : 比较两次采样值是否相等来判断通讯状态
容错设计
-
- : 提供可配置的重连次数和超时时间
2.2 状态判断逻辑
通讯正常: PreviousHeartbeat ≠ CurrentHeartbeat
通讯中断: PreviousHeartbeat = CurrentHeartbeat
通讯中断: PreviousHeartbeat = CurrentHeartbeat
3. 接口参数说明
3.1 输入参数 (VAR_INPUT)
| 参数名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
Enable |
BOOL | TRUE | 功能块使能信号,FALSE时停止所有检测 |
Reset |
BOOL | FALSE | 手动复位信号,清除报警和计数器 |
ClockTrigger |
BOOL | FALSE | 时钟触发信号,控制心跳值采样时机 |
HeartbeatValue |
INT | 0 | 当前心跳值,来自被监控设备 |
MaxRetryCount |
INT | 3 | 最大重连次数,超过后触发报警 |
TimeoutInterval |
TIME | T#1000ms | 超时检测时间间隔 |
3.2 输出参数 (VAR_OUTPUT)
| 参数名 | 数据类型 | 说明 |
|---|---|---|
TimeoutAlarm |
BOOL | 超时报警信号,TRUE表示通讯中断 |
TotalAlarm |
BOOL | 总报警输出,可扩展其他报警类型 |
3.3 输入输出参数 (VAR_IN_OUT)
| 参数名 | 数据类型 | 说明 |
|---|---|---|
RetryCounter |
INT | 重连计数器,记录当前重连次数 |
3.4 内部变量 (VAR)
| 变量名 | 数据类型 | 说明 |
|---|---|---|
PreviousHeartbeat |
INT | 存储上一次采样的心跳值 |
CurrentHeartbeat |
INT | 存储当前采样的心跳值 |
TimeoutTimer |
TON | 超时定时器实例 |
FallingEdgeTrig |
F_TRIG | 下降沿检测器,用于重连计数 |
InternalAlarmFlag |
BOOL | 内部报警标志位 |
完整代码:
FUNCTION_BLOCK "FB300_HeartBeat"TITLE = 'Heartbeat Communication Monitor'AUTHOR : 'Rewritten Version'VERSION : '1.0'VAR_INPUTEnable : BOOL := TRUE; // 功能块使能信号Reset : BOOL := FALSE; // 手动复位信号ClockTrigger : BOOL := FALSE; // 时钟触发信号HeartbeatValue : INT := 0; // 当前心跳值MaxRetryCount : INT := 3; // 最大重连次数TimeoutInterval : TIME := T#1000ms; // 超时时间间隔END_VARVAR_OUTPUTTimeoutAlarm : BOOL := FALSE; // 超时报警输出TotalAlarm : BOOL := FALSE; // 总报警输出END_VARVAR_IN_OUTRetryCounter : INT := 0; // 重连计数器END_VARVARPreviousHeartbeat : INT := 0; // 上一次心跳值CurrentHeartbeat : INT := 0; // 当前心跳值TimeoutTimer : TON; // 超时定时器FallingEdgeTrig : F_TRIG; // 下降沿触发器InternalAlarmFlag : BOOL := FALSE; // 内部报警标志END_VARBEGIN// ===============================================// 主逻辑处理// ===============================================IF Enable THEN// 根据时钟触发信号切换记录心跳值IF ClockTrigger THEN// 时钟信号为高时记录第一个心跳值PreviousHeartbeat := HeartbeatValue;ELSE// 时钟信号为低时记录第二个心跳值CurrentHeartbeat := HeartbeatValue;END_IF;// 心跳超时判断逻辑// 条件:两次心跳值相等 AND 重连次数未超限 AND 定时器未到时TimeoutTimer(IN := (PreviousHeartbeat = CurrentHeartbeat) AND(RetryCounter < MaxRetryCount) ANDNOT TimeoutTimer.Q,PT := TimeoutInterval);// 检测定时器输入信号的下降沿,用于重连计数FallingEdgeTrig(CLK := TimeoutTimer.IN);// 每次检测到下降沿时,重连计数器加1IF FallingEdgeTrig.Q THENRetryCounter := RetryCounter + 1;END_IF;// 超时报警判断// 当重连次数达到或超过最大重连次数时,触发报警IF RetryCounter >= MaxRetryCount THENInternalAlarmFlag := TRUE;END_IF;// 报警复位条件// 手动复位 OR 心跳值发生变化(通讯恢复)IF Reset OR (PreviousHeartbeat <> CurrentHeartbeat) THENInternalAlarmFlag := FALSE;RetryCounter := 0;END_IF;ELSE// 功能块未使能时,清除所有状态PreviousHeartbeat := 0;CurrentHeartbeat := 0;InternalAlarmFlag := FALSE;RetryCounter := 0;TimeoutTimer(IN := FALSE, PT := TimeoutInterval);END_IF;// ===============================================// 输出映射// ===============================================// 超时报警输出TimeoutAlarm := InternalAlarmFlag;// 总报警输出(可扩展其他报警类型)TotalAlarm := InternalAlarmFlag;END_FUNCTION_BLOCK
6.2 配置建议
| 应用场景 | 超时间隔 | 重连次数 | 时钟频率 |
|---|---|---|---|
| 高速设备通讯 | 500ms | 3次 | 2Hz |
| 一般工业设备 | 1000ms | 3次 | 1Hz |
| 慢速远程监控 | 5000ms | 5次 | 0.2Hz |
7. 故障诊断
7.1 常见问题及解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 频繁误报 | 时钟频率过快 | 调整时钟信号频率或增加超时时间 |
| 无法检测中断 | 心跳值未变化 | 检查心跳源是否正常更新 |
| 报警无法复位 | 复位信号异常 | 检查Reset信号连接 |
| 功能块无响应 | Enable信号为FALSE | 确认使能信号状态 |
7.2 调试要点
监控关键变量
-
- : PreviousHeartbeat, CurrentHeartbeat, RetryCounter
检查时序
-
- : 确保ClockTrigger信号正常切换
验证心跳源
-
- : 确认HeartbeatValue确实在变化
测试报警逻辑
- : 模拟通讯中断场景
8. 性能特点
8.1 优势
可靠检测
-
- : 双值比较法提高检测准确性
灵活配置
-
- : 支持多种超时和重连参数
容错能力
-
- : 避免偶发性通讯干扰造成的误报
标准接口
- : 符合西门子PLC编程规范
8.2 限制
时钟依赖
-
- : 需要稳定的时钟触发信号
延时响应
-
- : 最快检测时间受时钟周期限制
内存占用
- : 需要额外的定时器和触发器资源
9. 扩展建议
9.1 功能增强
- 添加通讯质量统计支持多路心跳监控增加历史报警记录实现自适应超时调整
9.2 集成建议
- 与HMI系统集成,提供可视化监控连接到SCADA系统,实现远程监控集成到设备健康管理系统
阅读全文
2568