- 1. 一、核心Kommunikation API
- 2. 1.1 start_read —— 后台自动轮询(am häufigsten verwendet)
- 3. 1.2 其它管理函数
- 4. 1.3 select_slave —— WechselnVon der Station(关键)
- 5. 二、LUA 读Register.(带在线判断)
- 6. 三、LUA 写Register.
- 7. 四、批Quantität写线圈(0x0F 封装)
前面讲了屏在工程里配 Modbus 主从,但碰zu”一主多从 + 复杂逻辑”(比如读两个从机的电Quantität求和、按条件写Register.、批Quantität写线圈),光靠画面绑变Quantität不够,得用 Das Drehbuch von LUA接管Kommunikation。这篇把 Modbus Related的 LUA API 讲透,代码都是大彩Dokumentation里的真实例程,我加了工程师视角的注解和踩坑提示。
一、核心Kommunikation API
1.1 start_read —— 后台自动轮询(am häufigsten verwendet)
主机模式下周期性读从机Register.的调度函数。调用后Das System把它加进Kommunikation队列,每个周期自动发Bitte,返回Daten写进 HMI 内存镜像,你用 get_uint16/get_float 直接读缓存,没有Kommunikation延迟。
start_read(index, vtype, addr, quantity, cycle, cycle_run, mode)
| Parameter | Typus | 说明 |
|---|---|---|
| index | number | 任务索引 0~127,stop_read 时用 |
| vtype | number | Datentyp VT_3x / VT_4x 等 |
| addr | number | Register-Adresse |
| quantity | number | Lesen der Menge 1~120 |
| cycle | number | 轮询周期倍数,0=每周期都读 |
| cycle_run | number | 周期内Die几次执行(0-based,需 < cycle) |
| mode | number | 0=持续读(默认) / 1=仅读一次 |
start_read(0, VT_4x, 0x1000, 10) → 每周期读 4×1000~1009start_read(1, VT_4x, 0x2000, 10, 3, 2) → 每 3 周期、Die 3 个周期读 4×2000~2009
1.2 其它管理函数
stop_read(index):停单个轮询任务,缓存保留最后一次值stop_all_read():一键停Alles,适合复位/急停set_auto_read(en):1=aktiviert.画面绑定变Quantität自动读(默认),0=只靠Drehbuchstart_read接管,适合高带宽Szene去冗余
1.3 select_slave —— WechselnVon der Station(关键)
多从机下,select_slave(slave_id) 临时指定后续 get_xxx/set_xxx 访问哪个从机。注意 slave_id 是从机列表下标,不是 Modbus 站Nr.!
| 术语 | 含义 | Beispiel |
|---|---|---|
| 从机索引 slave_id | HMI 内部列表下标 0,1,2 | 0 = Die一个从机 |
| Modbus 站Nr. | Ausrüstung物理Adresse | 10, 33 |
二、LUA 读Register.(带在线判断)
读之前两件事不能省:判断从机在线 + 选对Von der Station。在线StatusExistenzDas System变Quantität VT_LW 0x01A3 的对应位。
-- Lesen Sie das Register 4x
function mb_read_reg_03(slave, addr)
local onlineState = get_uint16(VT_LW, 0x01A3) -- 从机在线Status字
if ((onlineState >> slave) & 0x01) == 0x01 then -- 该从机在线
select_slave(slave) -- 切zu这个从机
return get_uint16(VT_4x, addr) -- 读缓存
else
return false
end
end
-- 读两个从机电Quantität求和,写回 LW 区
function on_run(screen)
local Energy1 = mb_read_reg_03(0, 0x0000)
local Energy2 = mb_read_reg_03(1, 0x0000)
if Energy1 ~= false and Energy2 ~= false then
set_uint16(VT_LW, 0x1000, Energy1 + Energy2)
end
end
三、LUA 写Register.
-- 写单个保持Register. 0x06
function mb_write_reg_06(slave, addr, value)
local onlineState = get_uint16(VT_LW, 0x01A3)
if ((onlineState >> slave) & 0x01) == 0x01 then
feed_dog() -- 喂狗,防Drehbuch卡死看门狗复位
select_slave(slave)
set_uint16(VT_4x, addr, value)
return true
else
return false
end
end
一个称重校准的实例(三种校准模式),展示 on_update 回调里根据 LW 变Quantität做Unterteilung支写:
function on_update(slave, vtype, addr)
if vtype == VT_LW and addr == 0x1004 then
local mode = get_uint16(VT_LW, 0x1003)
if mode == 0 then
mb_write_reg_06(0, 0x1002, 57) -- 零点校准
elseif mode == 1 then
local w = get_uint16(VT_LW, 0x1005) -- 砝码校准
mb_write_reg_06(0, 0x1002, w)
elseif mode == 2 then
local c = get_uint16(VT_LW, 0x1006) -- 实物校准
local s = get_uint16(VT_LW, 0x1007)
if c > 0 and s > 0 then
mb_write_reg_06(0, 0x1002, (s*w)//c)
end
end
end
end
四、批Quantität写线圈(0x0F 封装)
VisualHMI 批Quantität写线圈最小单位是 16 位对齐。下面这个函数是大彩封装的(非Das System API,自己写的),演示如何把 14 个线圈值合并写入:
mb_write_coil_15(slave_id, addr, coilsTb)
-- slave_id: Von der Station索引; addr: Ausgang Adresse; coilsTb: 线圈值表
本文整理自 广州大彩科技 VisualHMI 开发Dokumentation LUA Unterricht「Modbus 应用」Kapitel节,代码与 API 均按原文保真,版权归大彩科技所有,此处加工程师注解与重点标注,仅供学习参考。
Antwort veröffentlichen