- 1. 1. API 总表
- 2. 2. Vereinbarung举例:LED 灯控
- 3. 3. Status机Analyse(处理Unterteilung包/粘包)
Custom Vereinbarung(被动):VisualHMI 内置 DCBUS、XGUS、Modbus(RTU/TCP 主从)、三菱 FX2N、台达 DVP、西门子 PPI 等Vereinbarung,但实际现场总有私有Vereinbarung要接。走 LUA 对Die Serie做底层控制,实现Custom definiert帧的收发Analyse。本篇是被动模式:收zuDaten触发回调,你只管Analyse。
1. API 总表
| 函数 | 说明 |
|---|---|
uart_setup(ch, baudrate, databits, stopbit, parity) |
配置Die Serie:stopbit 0=1位/1=1.5位;parity 0=无/1=奇/2=偶。副Die Serie必须调用才aktiviert.,主Die Serie(ch=0)仅配Daten |
on_uart_recv(ch, packet) |
被动Empfang回调,packet 为下标从 1 的Bytes表。可能Unterteilung包/粘包,必须自己缓冲Analyse |
uart_send(ch, packet) |
Senden von Bytes表 |
set_free_protocol(en) |
1=主Die Serie交Drehbuch接管(自由Vereinbarung);0=恢复工程配置的原始Vereinbarung |
主Die Serie(ch=0)触发 on_uart_recv 的条件:工程配置Vereinbarung设「Custom definiert」,或Drehbuch里 set_free_protocol(1)。主Die Serie被 Modbus 等内置Vereinbarung占用时,on_uart_recv 不会被调用。DCBUS/XGUS Serienparameter固定:1 位Stoppen Sie Platz、无Prüfungen。
2. Vereinbarung举例:LED 灯控
帧结构:
| 方向 | 帧头(1B) | Länge(1B) | Funktionscode(2B) | Daten(nB) | 帧尾(2B) |
|---|---|---|---|---|---|
| Ausrüstung→屏幕 | 0x5A | Funktionscodezu帧尾的Anzahl der Bytes | 0x0001~0xFFFF | 可变 | 0xFC 0xFF |
| 屏幕→Ausrüstung | 0xA9 | 同上 | 同上 | 可变 | 0xFC 0xFF |
Länge = Funktionscode 2B + Daten nB + 帧尾 2B = n+4,大端。Funktionscode:0x0001=Schalter!、0x0002=Leuchtkraft、0x0003=改Name。
3. Status机Analyse(处理Unterteilung包/粘包)
recvBuf = {} -- Empfang缓冲
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 -- Die2Bytes:Länge
state = STATE_DATA
recvBuf = {b}
elseif state == STATE_DATA then
table.insert(recvBuf, b)
if #recvBuf >= frameLen then
-- 收满一帧,Analyse
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)
end
回调是Das System任务轮询触发,不是硬件中断——别在回调里做耗时Operationen(Charaktere串大拼接、文件读写),会拖慢Das System。
整理自 广州大彩科技 VisualHMI 开发Dokumentation(hmi-doc.gz-dc.com)LUA Unterricht「Custom Vereinbarung-被动Empfang」,版权归大彩科技所有。
Antwort veröffentlichen