benutzerdefiniertes Protokoll (passiv): VisualHMI integriert DCBUS, XGUS, Modbus (RTU / TCP Master / Slave), Mitsubishi FX2N, Delta DVP, Siemens PPI und andere Protokolle, aber es gibt immerprivate Protokollauf dem tatsächlichen Standort. LUA übernimmt die untersteuerung des seriellen anschlusses und realisiert die Übertragung und Annahme von benutzerdefinierten frames. Dieser Artikel ist in Passivmodus:Erhält einen Datentrigger-Rückruf, du analysierst einfach。
API-Zusammenfassung
| Funktion | Beschreibung |
|---|---|
uart_setup(ch, baudrate, databits, stopbit, parity) | Konfiguration des seriellen Portes: stopbit 0 = 1 Bit / 1 = 1,5 Bit; Parity 0 = None / 1 = Odd / 2 = G偶el.Der sekundäre serielle Anschluss muss aufgerufen werden, umzu aktivieren, der primäre serielle Anschluss (ch=0) ist nur für Daten |
on_uart_recv(ch, packet) | Passiv empfangen Rückrufe, ein Paket als Unterzeichnis von 1 in der Byte-Tabelle.Möglicherweise Unterverpackung / Verpackung, muss selbst buffered |
uart_send(ch, packet) | Master-Serial - Port (ch=0) Auslöser für die Bedingung on_uart_recv: Das Konfigurationsprotokoll ist „Benutzerdefiniert" gesetzt oder das Skript set_free_protocol(1). |
set_free_protocol(en) | 1 = Master-Serial - Port Script Übernahme (freies Protokoll); 0 = Wiederherstellung des ursprünglichen Protokolls für die Konfiguration |
Der primäre serielle Anschluss (ch = 0) löst die Bedingung für on_uart_recv aus: Das Projektkonfigurationsprotokoll ist "Benutzerdefiniert" oder das Skript set_free_protocol(1).On_uart_recv wird nicht aufgerufen, wenn der primäre serielle Anschluss von integrierten Protokollen wie Modbus besetzt wird。DCBUS / XGUS-Serialanschluss - Parameter Fix: 1 Stop-Bit, ohne Verifikation.
2. Beispiel: LED-Licht - Steuerung
Rahmenstruktur:
| Richtung | Frame-Header (1B) | Länge (1B) | Funktion-Code (2B) | Daten (nB) | Frame-End (2B) |
|---|---|---|---|---|---|
| Gerät → Bildschirm | 0x5A | Funktionscode bis Frame-End | 0x0001 ~ 0xFFFF | Variable | 0xFC 0xFF |
| Bildschirm → Geräte | 0xA9 | Ähnlich oben | Ähnlich oben | Variable | 0xFC 0xFF |
Länge = Funktionscode 2B + Daten nB + Frame End 2B = n + 4, Großes Ende. Funktionscode: 0x0001 = Schalter, 0x0002 = Helligkeit, 0x0003 = Name ändern.
3. Zustandmaschinenanalyse (Verarbeitung von Subverträgen / Klebenspaket)
recvBuf = {} -- 接收缓冲
STATE_IDLE, STATE_LENGTH, STATE_DATA = 0, 1, 2
state = STATE_IDLE
frameLen = 0
function on_uart_recv(ch, packet)
for i = 1, #packet do
local b = packet[i]
if state == STATE_IDLE then
if b == 0x5A then
state = STATE_LENGTH
recvBuf = {}
end
elseif state == STATE_LENGTH then
frameLen = b -- 第2字节:长度
state = STATE_DATA
recvBuf = {b}
elseif state == STATE_DATA then
table.insert(recvBuf, b)
if #recvBuf >= frameLen then
-- 收满一帧,解析
parse_frame(recvBuf)
state = STATE_IDLE
end
end
end
end
function parse_frame(buf)
local func = (buf[2] <> 8) & 0xFF, func & 0xFF}
for i = 1, #payload do table.insert(pkt, payload[i]) end
table.insert(pkt, 0xFC); table.insert(pkt, 0xFF)
uart_send(0, pkt)
endZurückweisung istSystem-Aufgabe - Auslöser, kein Hardware-Interrupt- - Verwenden Sie keine zeitaufwändigen Operationen in Rückrufen (große Zeichenfolgen, Dateien lesen und schreiben), die das System verlangsamen.
Aus dem LUA-Tutorial "Benutzerdefiniertes Protokoll - Passiver Empfang", VisualHMI-Entwicklungsdokument (hmi-doc.gz-dc.com) von Guangzhou Dacai Technology, das Urheberrecht im Besitz von Dacai Technology.
Antwort veröffentlichen