本文目录
- 1. 1. API 总表
- 2. 2. 8 从机 × 96 告警案例
告警集中管理:warning_set(warning_id, value, count) 批量触发告警 + on_parse_warning 自定义告警文本。典型场景:HMI 从 Modbus 读回从机的故障位,逐位映射成告警——8 台从机、每台 96 个告警,一条命令全触发。
1. API 总表
| 函数 | 说明 |
|---|---|
warning_set_mode(en) |
全局使能:1=开/0=关 |
warning_set(warning_id, value, count) |
位掩码批量触发:value 的低 count 位对应从 warning_id 起的告警(bit0→warning_id,count 1~16) |
on_parse_warning(id, text, screen_id, control_id, p0, p1, p2, p3) |
自定义告警文本回调,返回 (字符串, encode),encode 1=UTF-8/0=GBK |
2. 8 从机 × 96 告警案例
架构:8 台从机,每台读 Modbus 4×1000 起连续 6 个寄存器(16bit×6=96 位告警)。on_init 里 create_resp_que,on_cmd_resp 中逐从机逐寄存器逐位调用 warning_set。
_warningTb = {} -- 0x1000~0x1005 各 bit 的告警名
function on_init()
set_auto_read(0)
create_resp_que()
-- 告警设置里预配 768 条(8 台 × 96)
end
function on_cmd_resp(slave, vtype, addr, count, ret, wr)
if ret == 0 and wr == 0 then
-- slave 从机,addr 起始,读回 count 个寄存器
for i = 0, 5 do
local val = get_uint16(vtype, addr + i)
for j = 0, 15 do
local bitv = (val >> j) & 0x01
local wid = (addr - 0x1000) * 16 + j + slave * 100
warning_set(wid, bitv, 1) -- 单 bit 触发
end
end
end
end
function on_parse_warning(id, text, screen_id, control_id, p0, p1, p2, p3)
local slave_no = math.floor(id / 96) + 1 -- 从机号
local msg_id = id % 96 -- 消息 ID
local name = _warningTb[0x1000 + math.floor(msg_id / 16)] or "未知告警"
local msg = "从机"..slave_no.." : "..name
return msg, 1 -- 1=UTF-8
end
告警 ID 编码约定:从机号×100 + 位序号,解析时反推。告警设置需预配全部 768 条,文本用 on_parse_warning 动态生成(按从机号前缀),比静态配 768 条文本省事得多。
三个坑:①warning_set 的 value 低 count 位对应从 warning_id 起的告警,bit0→warning_id、bit1→warning_id+1,批量触发一条命令搞定;②count 范围 1~16,超过拆多次;③on_parse_warning 的返回值第一个是文本、第二个是编码(1=UTF-8/0=GBK),中文屏别用错编码。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「告警集中管理」,版权归大彩科技所有。
发表回复