VisualHMI LUA 做 Modbus 一主多从:start_read/select_slave 实战与坑

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

🌐 Diese Seite ist noch nicht auf Deutsch verfügbar. Die chinesische Version wird angezeigt. Zurück zur chinesischen Seite.
本文目录
  1. 1. 一、核心Kommunikation API
  2. 2. 1.1 start_read —— 后台自动轮询(am häufigsten verwendet)
  3. 3. 1.2 其它管理函数
  4. 4. 1.3 select_slave —— WechselnVon der Station(关键)
  5. 5. 二、LUA 读Register.(带在线判断)
  6. 6. 三、LUA 写Register.
  7. 7. 四、批Quantität写线圈(0x0F 封装)

前面讲了屏在工程里配 Modbus 主从,但碰zu”一主多从 + 复杂逻辑”(比如读两个从机的电Quantität求和、按条件写Register.、批Quantität写线圈),光靠画面绑变Quantität不够,得用 Das Drehbuch von LUA接管Kommunikation。这篇把 Modbus Related的 LUA API 讲透,代码都是大彩Dokumentation里的真实例程,我加了工程师视角的注解和踩坑提示。

⚠️ 适用范围: HMI&M&Dx 系列。Beispiel是 Modbus 两个Von der Station,站Nr. 10 和 20,逻辑对 FX2N/FX3U 主从同样适用。

一、核心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=仅读一次
💡 调度精髓: cycle/cycle_run 用来Unterteilung高低频。高频变Quantität(速度、Temperatur)cycle=0 每周期读;低频变Quantität(累计Quantität、Status字)cycle=5, cycle_run=4 每 5 周期读一次,降总线负载。例:
start_read(0, VT_4x, 0x1000, 10) → 每周期读 4×1000~1009
start_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=只靠Drehbuch start_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
⚠️ 最容易错的点: slave_id=0 对应站Nr. 10,slave_id=1 对应站Nr. 33,这个映射在工程配置里定。Drehbuch里填错下标就读zu别的从机去了,查半天以为是Vereinbarung问题。

二、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
⚠️ 重点:写之前务必 feed_dog()。 Das Drehbuch von LUA跑在屏的实时任务里,长Zeit不喂狗会被看门狗当死循环干掉,屏重启。凡是循环或耗时逻辑,间隔里加 feed_dog。

一个称重校准的实例(三种校准模式),展示 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: 线圈值表
Tests提示: 联机验证用 Modbus Slave 软件 + 虚拟Die Serie对,让屏当主机、电脑当从机,实时看总电压/总电Quantität变化。比直接上真机快得多。

本文整理自 广州大彩科技 VisualHMI 开发Dokumentation LUA Unterricht「Modbus 应用」Kapitel节,代码与 API 均按原文保真,版权归大彩科技所有,此处加工程师注解与重点标注,仅供学习参考。

Techniken术语(共 4 个)—— Klick auf展开
Register.Modbus Register.存储Daten单元,Unterteilung线圈/离散输入/保持/输入Register.四类
Die SerieBerechnung机与外部Ausrüstung进行串行Kommunikation的物理Schnittstelle
线圈Modbus位可读Schreiben von Daten,Adresse从00001开始
保持Register.Modbus 16位可读Schreiben von Daten,Adresse从40001开始
来源/Werkzeuge信息 —— Klick auf展开
来源 Modbus Chinesisches Netzwerk(modbus.cn) —— Inländisch führend.ModbusKommunikationsprotokoll Technologie Gemeinschaft Klassifizierung Das Drehbuch von LUA / Entwicklung von HMI / HMI 字数 2738 字 · 阅读约 7 Unterteilung钟 更新 2026-08-04 永久链接 https://www.modbus.cn/49944.html
Empfohlene Werkzeuge: Modbus Debugger-Assistent WeChat-Applet
Modbus Chinesisches Netzwerk官方推出的Modbus Debugging-Tools,支持 Modbus RTU/TCP 实时KommunikationTests、Register.读写、线圈控制、Daten监控和MeldungUnterteilung析。 keine Installation erforderlich,Mikro-Suche「Modbus DebuggingAssistenten.」Benutzt werden kann.。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.