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)
| Funktion | Parameter | Beschreibung |
|---|---|---|
uart_rxsize(ch) | ch Serialportnummer, normalerweise 0 | Abfrage 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 ≥ 1 | aus 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 Number | Leeren. Kommunikationsinitialisierung / Fehlerwiederherstellung / Protokoll-Synchronisierung Rest |
calc_crc16(data) | data-Byte - Tabelle, Unterzeichner von 1 | Modbus 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.

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
| Feld | Länge | Beschreibung |
|---|---|---|
| Frame-Header | 2 Byte | 0x5AA5 |
| Länge | 1 Byte | Befehl + Daten + Anzahl der Bytes zu überprüfen |
| Befehl | 1 Byte | 0x82 Schreiben / 0x83 Lesen (0x80 / 0x81 auch nützlich) |
| Daten | Maximal 249 Bytes | Adresse (2 Bytes) + Dateninhalt (n Bytes), Länge = n + 2 |
| CRC | 2 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
endXGUS: 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
end3.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)
endAus 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.
Antwort veröffentlichen