VisualHMI LUA macht Modbus-Master mehr von: start _ read / select _ slave Live-Kampf und Pit

kostenlosKostenloses technisches Material

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

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.

und️ Anwendungsbereich:Die HMI & M & Dx-Serie. Beispielsweise sind die beiden Modbus-Slaven, Stationen 10 und 20, die Logik gilt gleichermaßen für Master-Slaven FX2N / FX3U.

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)
ParameterTypBeschreibung
indexnumberTask-Index 0 ~ 127, Stop_read mit
vtypenumberDatentyp VT_3x / VT_4x usw.
addrnumberRegister-Adresse
quantitynumberLesenmenge 1 ~ 120
cyclenumberPolling-Zyklus - Vielfache, 0 = pro Zyklus gelesen
Cycle _ RunnumberAusführung innerhalb eines Zyklus (0 - basiert, < cycle erforderlich)
modenumber0 = kontinuierliches Lesen (Standard) / 1 = nur einmal Lesen
💡cycle/cycle_run wird verwendet, um die Hoch - und Niederfrequenzen zu teilen. Hochfrequente Variable (Geschwindigkeit, Temperatur) cycle = 0 pro Zyklus gelesen; niedrigfrequente Variable (kumulative Menge, Statuswort) cycle = 5, cycle_run = 4 alle 5 Zyklen gelesen,reduziert die Buslast. Beispiel:
start_read(0, VT_4x, 0x1000, 10)→ Lesen pro Zyklus 4x1000 ~ 1009
start_read(1, VT_4x, 0x2000, 10, 3, 2)→ Alle 3 Zyklen, 3. Zyklus lesen 4x2000 ~ 2009

1.2 Sonstige Verwaltungsfunktionen

  • stop_read(index): Stoppt einzelner Polling-Aufgaben, Cache hält den letzten Wert
  • stop_all_read(): Alles mit einem Knopfdruck beendet, geeignet für Reset / Notfall-Stopping
  • set_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!

BegriffBedeutungBeispiel
Slave-Index slave_idHMI-interne Liste Unterzeichner 0,1,20 = Erster Slave
Modbus-StationsnummerPhysikalische Adresse des Geräts10, 33
☑️ Die am häufigsten fehlerhaften Punkte:slave_id = 0 entspricht der Stationsnummer 10, slave_id = 1 entspricht der Stationsnummer 33, diese Zuordnung ist in der Konstruktionskonfiguration festgelegt. Das Skript ist falsch ausgefüllt, um andere von der Maschine zu lesen, die Hälfte der Zeit zu überprüfen, dachte, es wäre ein Abkommen Problem.

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
end

3. 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
end
️ Wichtig: Bevor Sie das Schreiben nutzen, nutzen Sie die Funktion feed _ dog ().LUA-Skript läuft in der Echtzeit-Aufgabe des Bildschirms, wenn der Hund für eine lange Zeit nicht füttert wird, wird der Wachhund als Todschleife getötet, der Bildschirm wird neu gestartet. Für jede Schleife oder zeitraubende Logik, fügen Sie die Intervalle feed _ dog hinzu.

Ein 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
end

Viertens, 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: 线圈值表
Debugging-Tipps:Online-Authentifizierung mit Modbus Slave-Software + virtuelle serielle Portpaare, so dass der Bildschirm als Master, Computer als Slave, in Echtzeit sehen die Gesamtspannung / Gesamtspannung Änderungen. Viel schneller als direkt in die Rechenschaft.

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.

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.