Früher sprach Bildschirm im Projekt mit Modbus Master Slave, aber treffen "ein Master mehr Slave + komplexe Logik" (z. B. Lesen zwei Slave-Summe, bedingte Schreibregister, Batch-Schreibspulen), allein auf das Bild binden Variablen nicht genug, müssen mit LUA-Skript übernehmen die Kommunikation. Dieser Artikel erklärt die LUA-API im Zusammenhang mit Modbus, der Code ist die echte Routine in der großen Farbe-Dokumentation, ich habe die Anmerkungen aus der Sicht des Ingenieurs hinzugefügt und Tipps für das Treiben der Grube.
1. Kern-Kommunikations - API
1.1 start_read - Automatisches Polling im Hintergrund (am häufigsten verwendet)
Zeitplanungsfunktion, die periodisch Slave-Register im Host-Modus liest. Nach dem Aufruf fügt das System es in die Kommunikationswarteschlange hinzu, sendet automatisch jede Zyklus-Anforderung, gibt die Daten zurück in das HMI-Speicher - Spiegel geschrieben, Sie verwendenget_uint16/get_floatdirekt Lese-Cache,keine Kommunikationsverzögerung。
start_read(index, vtype, addr, quantity, cycle, cycle_run, mode)| Parameter | Typ | Beschreibung |
|---|---|---|
| index | number | Task-Index 0 ~ 127, Stop_read mit |
| vtype | number | Datentyp VT_3x / VT_4x usw. |
| addr | number | Register-Adresse |
| quantity | number | Lesenmenge 1 ~ 120 |
| cycle | number | Polling-Zyklus - Vielfache, 0 = pro Zyklus gelesen |
| Cycle _ Run | number | Ausführung innerhalb eines Zyklus (0 - basiert, < cycle erforderlich) |
| mode | number | 0 = kontinuierliches Lesen (Standard) / 1 = nur einmal Lesen |
start_read(0, VT_4x, 0x1000, 10)→ Lesen pro Zyklus 4x1000 ~ 1009start_read(1, VT_4x, 0x2000, 10, 3, 2)→ Alle 3 Zyklen, 3. Zyklus lesen 4x2000 ~ 20091.2 Sonstige Verwaltungsfunktionen
stop_read(index): Stoppt einzelner Polling-Aufgaben, Cache hält den letzten Wertstop_all_read(): Alles mit einem Knopfdruck beendet, geeignet für Reset / Notfall-Stoppingset_auto_read(en): 1 = Aktivieren des automatischen Lesens von Bildbindungsvariablen (Standard), 0 = Übernahme nur durch das Skriptstart_readgeeignet für High-Bandbreite - Szenarien Redundanz
1.3 select_slave - - Wechseln von Slaves (Kritisch)
unter mehreren Slaves,select_slave(slave_id)Gibt vorübergehend an, auf welchen Slave der nachfolgendeget_xxx/set_xxxzugreifen soll.Beachten Sie, dass slave _ id ein Slave-Liste - Unterzeichnis ist, nicht die Modbus-Stationsnummer!
| Begriff | Bedeutung | Beispiel |
|---|---|---|
| Slave-Index slave_id | HMI-interne Liste Unterzeichner 0,1,2 | 0 = Erster Slave |
| Modbus-Stationsnummer | Physikalische Adresse des Geräts | 10, 33 |
II. LUA-Lese - Register (mit Online-Urteil)
LUA-Lese - Register (mit Online-Beurteilung) nicht ausgegeben werden:Beurteilung im Internet + Wählen Sie die Slave Station. Das entsprechende Bit der SystemvariableVT_LW 0x01A3der entsprechenden Position.
-- 读保持寄存器 4x
function mb_read_reg_03(slave, addr)
local onlineState = get_uint16(VT_LW, 0x01A3) -- 从机在线状态字
if ((onlineState >> slave) & 0x01) == 0x01 then -- 该从机在线
select_slave(slave) -- 切到这个从机
return get_uint16(VT_4x, addr) -- 读缓存
else
return false
end
end
-- 读两个从机电量求和,写回 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
end3. LUA Schreibregister
-- 写单个保持寄存器 0x06
function mb_write_reg_06(slave, addr, value)
local onlineState = get_uint16(VT_LW, 0x01A3)
if ((onlineState >> slave) & 0x01) == 0x01 then
feed_dog() -- 喂狗,防脚本卡死看门狗复位
select_slave(slave)
set_uint16(VT_4x, addr, value)
return true
else
return false
end
endEin Beispiel für die Kalibrierung von Gewichten (drei Kalibrierungsmodi), zeigton_updateIn diesem Fall wird die Variable LW als Folge angegeben:
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
endViertens, Batch-Schreibspule (0x0F-Pakete)
VisualHMI Batch-Schreibspule Mindesteinheit ist 16 Bit Ausrichtung. Die folgende Funktion ist farbige Verpackung (Nicht-System - API, selbst geschrieben), zeigt, wie man 14 Spule-Werte zu schreiben:
mb_write_coil_15(slave_id, addr, coilsTb)
-- slave_id: 从站索引; addr: 起始地址; coilsTb: 线圈值表Dieser Artikel ist von Guangzhou Dacai Technologie VisualHMI Entwicklung Dokument LUA Tutorial "Modbus Anwendung" Kapitel, Code und API sind in Übereinstimmung mit dem Original treu, Urheberrecht im Besitz von Dacai Technologie, hier hinzufügen Ingenieur Kommentare und Schwerpunkte, nur zum Lernen Referenz.
Antwort veröffentlichen