主题
B12. 报警判定与上报框架(留回差 / 状态变化才发)
综合例程。报警是现场覆盖面最广的一类逻辑;要点是留回差和只在状态变化时上报,否则平台会被刷爆。 云端上报结构见
B10 云端双向通信框架。
适用:全机型 | 依赖模块:timer plc mqtt | 难度:★★☆
场景:超阈值、设备断线、通讯失败要报出来;在临界点不能反复报警/复归,也不能每周期刷同一条。
完整框架
lua
报警 = 0
上次报警 = 0
timer.start(5000, function()
local v = plc.df(150) -- 工程量
local 通讯码 = plc.d(600) -- 通讯状态(0 = 正常)
-- ① 阈值判定要留回差,否则临界点会反复报警/复归
if 报警 == 0 and v > 80.0 then
报警 = 1
plc.m(100, 1) -- 报警位,梯形图里用它点灯/停机
elseif 报警 == 1 and v < 75.0 then -- 回差 5.0
报警 = 0
plc.m(100, 0)
end
-- ② 通讯断线单独判:数据"看起来正常"不等于链路正常
if 通讯码 ~= 0 then
plc.m(101, 1)
else
plc.m(101, 0)
end
-- ③ 只在状态变化时上报,不要每周期发同一条
if 报警 ~= 上次报警 then
上次报警 = 报警
mqtt.publish(mqc, "alarm", tostring(报警), 1) -- mqc 按 B10 框架建好
end
end)要点:
- 必须留回差(上例 5.0)。不留回差会在临界点每个周期翻一次,现场表现报警灯闪烁、云平台报警记录刷屏。
- 通讯断线单独判。数据停在旧值看起来"一切正常",是最危险的假象。
- 只在状态变化时上报,不要每周期发同一条——平台侧会被淹没,真正的报警反而看不见。
验证方法:
- 工程量手动改到 81 → 报警位置 1 且平台收到一条。
- 改到 78(回差区内)→ 报警应保持,这是回差生效的证据。
- 改到 74 → 复归并再收到一条。
- 拔通讯线 → 断线位(M101)应置 1。
注意事项:
- 不留回差 → 临界点抖动。
- 每周期无条件
publish→ 平台报警记录被淹没。 - 只判数值不判通讯 → 从站掉线后数值停在旧值,报警永远不触发。
和梯形图怎么分工
报警的"判"和"点灯/停机"可以两边都做:
- 梯形图做硬实时的联锁(报警位直接串进输出回路);
- Lua做带回差的阈值判定和"变化才上报"的云端逻辑。
两边只通过 M/D 交接(报警位 M100、断线位 M101),互不调用函数。分工详见 a-03 Lua 与 PLC 协同。