VisualHMI freie serielle Portsprotokoll (aktiv): uart_recv/calc_crc16 und XGUS-Zusammenarbeit

kostenlosKostenloses technisches Material

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

Das Free Serial Port Protocol (Active) ist eine Weiterentwicklung von „passiv": Das HMI empfängt nicht nur aktiv von Geräten gesendete Daten, sondern kann auchaktiv an das Gerät senden Abfrage-Frame, Lesen-AntwortenHMI ist der Busführer. Die Kern-API ist uart_recv (), die zusammen mit Collaboration + Meta-Tabellen ein nicht-blockierendes Kommunikations-Framework für das private XGUS-Protokoll verwendet. Gilt für die HMI & M-Serie und die Dx-Serie.

1. Neue API (relativ passiv)

FunktionParameterBeschreibung
uart_rxsize(ch)ch Serialportnummer, normalerweise 0Abfrage Anzahl der zu lesen Bytes des Empfangspuffers. Gibt N für N-Bytes zurück, 0 für keine neuen Daten
uart_recv(ch, size)size Die Anzahl der Bytes, die erwartet werden, muss ≥ 1aus dem Empfangspuffer aktiv gelesen werden. Gibt den Empfangspuffer aus einer Byte-Tabelle mit 1 zurück, wie z. B. {0xAA, 0x55, 0x01, 0x02}
uart_rxclear(ch)ch Serial Port NumberLeeren. Kommunikationsinitialisierung / Fehlerwiederherstellung / Protokoll-Synchronisierung Rest
calc_crc16(data)data-Byte - Tabelle, Unterzeichner von 1Modbus CRC - 16 - Überprüfungsberechnung, Rückgabe 0 ~ 65535,Low-Byte vorne(konform zu Modbus-Klein - Anordnung)

Auch uart_send (ch, packet) ist wie der passive Modus: Sendet ein Byte-Array an den angegebenen seriellen Kanal, mit einem Paket-Subscript, das mit 1 beginnt, pro Element 0 bis 255. ch = 0 primärer serieller Anschluss, 1/2... sekundärer serieller Anschluss (je nach Hardware-Modell). Der Kanal muss sich im freien Protokollmodus befinden (nicht von Systemprotokollen wie Modbus / XGUS belegt).

2. und️ Wichtiges Voreinstellung: Deaktivieren des Empfangs von Rückrufen

Aktive Lesen des seriellen Portes muss zuerst in den Engineering-Eigenschaften sein:Serial Port Einstellung → Empfang von Callback → Deaktivieren(Die neue Software hat diese Option.) Wenn nicht deaktiviert, werden uart _ recv () und on _ uart _ recv Rückrufe die Daten rauben und die Frames verwirren.

VisualHMI freie serielle Portsprotokoll (aktiv): uart_recv/calc_crc16 und XGUS-ZusammenarbeitAbbildung

3. Beispiel: XGUS-Protokoll in Systemregister zugeordnet

Ziel: Lesen und Schreiben von Adressen ≥ 0x1000 im XGUS-Protokoll, Zuordnung in HMI-Systemregister LW1000 ~ LWFFFF. Das externe Gerät verwendet XGUS-Frame, um interne Variablen des HMI zu lesen und zu schreiben, und das HMI sendet auch aktiv Lese - und Schreibanforderungen an das Gerät.

3.1 XGUS-Frameformat

FeldLängeBeschreibung
Frame-Header2 Byte0x5AA5
Länge1 ByteBefehl + Daten + Anzahl der Bytes zu überprüfen
Befehl1 Byte0x82 Schreiben / 0x83 Lesen (0x80 / 0x81 auch nützlich)
DatenMaximal 249 BytesAdresse (2 Bytes) + Dateninhalt (n Bytes), Länge = n + 2
CRC2 Byte (Optional)CRC - 16 (x16 + x15 + x2 + 1)

Beispiel: Schreiben des Wertes 2 in die Variable-Adresse 0x1000 (CRC nicht aktiviert):5A A5 05 82 10 00 00 02- -05 ist die Länge (Befehl 1 + Adresse 2 + Daten2), geschrieben als Wort.

3.2 Initialisierung: Laden von XGUS.lua

Das XGUS.lua-Framework basiert auf den Coprocess + Meta-Tabellen ist offiziell verfügbar. Erstellen Sie eine Instanz in mainlua.com:

function on_init()
  dofile("XGUS.lua")
  xgus = XGUS:new(0, 0x55AA, true, true)
  -- 参数:串口号, 帧头, 开启CRC, 开启写应答
end

-- on_run 里跑协程,非阻塞轮询
_EN_SET_DATA_ = false
function on_run(screen)
  _EN_SET_DATA_ = true
  xgus:run()
  _EN_SET_DATA_ = false
end

XGUS: run () mit Kooperationsprozess: Überprüfen Sie die Serienportdaten → Zusammenfassung von "Framehead + Befehl + Länge + Adresse" 6 Byte → Analysieren → Verbleibdaten nach Länge sammeln → CRC-Prüf → Verarbeitung. Collaboratoren können Aufgaben unterbrechen / wiederherstellen, ohne die on _ run-Hauptschleife zu blockieren und sind für zeitaufwändige Prozesse geeignet.

3.3 Befehl-Analyse: Adressübertragung

function XGUS:processMsg()
  local func = self.func
  if func == XGUSFunction.write then
    -- 写指令
    if self.addr >= 0x1000 then
      -- 用户寄存器区:解析数据写入 LW
      local datas = {}
      for i = 1, write_count do
        datas[i] = self.req[5+i*2]<>8), (self.head&0xFF), 0x03, 0x82, 0x4F, 0x4B})
    end
  elseif func == XGUSFunction.read then
    -- 读指令
    if self.addr >= 0x1000 then
      -- 组应答帧:读 LW 值回发
      local datas = {(self.head>>8), (self.head&0xFF), 4+self.req[7]*2,
                     0x83, (self.addr>>8), (self.addr&0xFF), (self.req[7]*2)&0xFF}
      for i = 1, self.req[7] do
        local num = get_uint16(VT_LW, self.addr+(i-1))
        datas[6+i*2] = (num>>8) & 0xFF
        datas[7+i*2] = num & 0xFF
      end
      self:sendMsg(datas)
    else
      on_cmd_resp_xgus(self.addr, self.req[7], func, {})
    end
  end
end

-- 系统寄存器区读写回调(main.lua 里定义)
function on_cmd_resp_xgus(addr, count, wr, data)
  if wr == 0x82 then
    print("write addr num : "..count)
  elseif wr == 0x83 then
    print("read addr num : "..count)
  end
end

3.4 Aktives Senden: XGUS: dataSend (addr, data)

Aktive Befehle an das Gerät senden, die Daten können number oder table sein:

-- 写单个值
xgus:dataSend(0x1000, 1234)
-- 写一组值(table)
xgus:dataSend(0x2000, {0x12, 0x34, 0x56})

-- 内部 send():开 CRC 时自动补 2 字节校验再 uart_send
function XGUS:send(resp)
  if self.crc == true then
    resp[3] = resp[3] + 2   -- 长度加 CRC 2 字节
    local crc_buff = {}
    for i = 4, #resp do crc_buff[i-3] = resp[i] end
    local crc_check = calc_crc16(crc_buff)
    resp[#resp+1] = (crc_check>>0) & 0xFF
    resp[#resp+1] = (crc_check>>8) & 0xFF
  end
  uart_send(self.port, resp)
end
Vier Pit:1 Deaktivieren Sie den Empfang von Callback auf uart_recv, Frame wird chaot- Engineering Attribute → Serial Port Einstellungen → Empfang von Callback → Deaktivieren;2calc_crc16 Low Byte vor, während Framing zuerst 8 Bits niedrig und dann 8 Bits hoch;3 Aktive Lesen, um zu vermeiden, dass das Gerät nicht antwortet- - XGUS: wait () hat einen Timeout-Mechanismus (interne get _ tick _ count Differenz-Bewertung), selbst schreiben Protokoll muss eine Timeout, sonst on _ run stecken stecken;4 Adresse ≥ 0x1000 gehen LW Zuordnung, kleiner als 0x1000 gehen on _ cmd_resp _ xgus Rückruf selbst verarbeitet. Vor der Verwendung des sekundären seriellen Anschlusses muss uart _ setup initialisiert werden.

Aus dem VisualHMI-Entwicklungsdokument von Guangzhou Dacai Technology (hmi-doc.gz-dc.com) LUA-Tutorial "Free Serial Port Protocol (Active)" zusammengestellt, das Urheberrecht gehört Dacai Technology.

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.