本文目录
- 1. 1. API
- 2. 2. 场景:8 台 PLC 告警集中管理
- 3. 3. LUA 实现
- 4. 3.1 初始化
- 5. 3.2 触发/解除告警
- 6. 3.3 解析告警文本(带从机前缀)
多台 PLC 告警数量庞大时,图形化告警配置效率低。用 LUA 脚本做告警集中管理:warning_set_mode 开启脚本告警,warning_set 按位批量触发/清除,on_parse_warning 动态生成告警文本。
1. API
| 函数 | 说明 |
|---|---|
| warning_set_mode(en) | 告警模式总开关:1=开启 Lua 解析告警模式,0=关闭。必须先调用,否则 warning_set 无效 |
| warning_set(warning_id, value, count) | 按位批量设置:value 是位掩码,低 count 位对应从 warning_id 开始 count 个告警(1=触发,0=清除),count 1~16 |
| on_parse_warning(id, text, screen_id, control_id, p0, p1, p2, p3) | 告警内容动态解析回调,返回自定义字符串(可拼接变量/单位/状态)+ 编码标志(1=UTF8/0=GBK) |

2. 场景:8 台 PLC 告警集中管理
Modbus RTU 总线挂 8 台 PLC(站地址 1~8),每台 100 个同构告警点,告警起始地址 4×1000、连续 6 个地址(每个地址 16 个 bit 对应 16 个告警)。
工程配置:工程→告警设置,告警条数设 768(8 台×96 条,不能小于实际条数)。告警控件属性按需配。

3. LUA 实现
3.1 初始化
function on_init()
warning_set_mode(1) -- 启用 Lua 告警解析
set_auto_read(0) -- 脚本控制读取
create_resp_que() -- 队列发送, 使能回调 on_cmd_resp
for i = 0, 7 do
select_slave(i)
start_read(i+1, VT_4x, 0x1000, 6) -- 读从机1~8的告警
end
end
3.2 触发/解除告警
on_cmd_resp 里解析每个从机、每个寄存器(0x1000~0x1005)、每个 bit:
-- 告警文本表: 4x1000 bit0~bit15 ... 4x1005 bit0~bit15 共96条
_warningTb = {
"相序保护","水流开关保护","水位开关保护","制热出水温度过高",
"下水流开关断开","1#电流故障","2#电流故障","线控器通讯故障",
-- ... 完整96条见源文档
}
function on_cmd_resp(slave, vtype, addr, count, ret, wr)
if ret == 0 and wr == 0 then
if vtype == VT_4x and addr == 0x1000 and count == 6 then
select_slave(slave) -- 从机1~8
for i = 0, 5 do -- 6个告警寄存器
local val = get_uint16(VT_4x, 0x1000 + i)
for j = 0, 15 do -- 16个bit
local idx = i*16 + j + 1
-- 跳过"预留"位: idx==35, 41~48, 85~96
if idx ~= 35 and not (idx >= 41 and idx = 85 and idx > j) & 0x01), 1)
end
end
end
end
end
end
3.3 解析告警文本(带从机前缀)
function on_parse_warning(id, text, screen_id, control_id, p0, p1, p2, p3)
local slaveId = (id // 96) + 1 -- 第几个从机
local msgId = id % 96 -- 告警类型ID
if msgId == 0 then msgId = 96 end
local curWarnMsg = "从机" .. string.format("%02d", slaveId) .. ": " .. _warningTb[msgId]
return curWarnMsg, 1 -- 返回GBK编码(0=UTF8/1=GBK)
end

告警集中管理三要点:①warning_set_mode(1) 必须最先调用;②warning_set 的 value 是 16 位掩码,一次最多批量设 16 条;③on_parse_warning 的返回编码参数别搞反——1=GBK、0=UTF-8,和中文显示乱码直接相关。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「告警记录」,版权归大彩科技所有。
发表回复