Custom Protocol(被动):VisualHMI 内置 DCBUS、XGUS、Modbus(RTU/TCP 主从)、三菱 FX2N、台達 DVP、シーメンス PPI 等协议,但实际现场总有私合意がある。要接。走 LUA 对シリアルポート做底层控制,実装自定义フレーム的收发解析。本篇是被动モード:データの受信触发回调,你只管解析。
1. API 总表
| 函数 | 説明 |
|---|---|
uart_setup(ch, baudrate, databits, stopbit, parity) | シリアルポートの設定:stopbit 0=1位/1=1.5位;parity 0=无/1=奇/2=偶。副シリアルポート必须调用才有効,主シリアルポート(ch=0)仅配データ |
on_uart_recv(ch, packet) | 被动受信回调,packet 为下标从 1 的バイト表。可能分包/粘包,必须自己缓冲解析 |
uart_send(ch, packet) | 送信バイト表 |
set_free_protocol(en) | 1=主シリアルポート交脚本接管(自由协议);0=恢复工程設定的元の协议 |
主シリアルポート(ch=0)触发 on_uart_recv 的条件:工程設定协议设「Customization」,或脚本里 set_free_protocol(1)。主シリアルポート被 Modbus 等内置协议占用时,on_uart_recv 不会被调用。DCBUS/XGUS シリアルパラメータ固定:1 位ストップ·ビット、検証なし。。
2. 协议举例:LED 灯控
フレーム構造:
| 方向 | フレーム头(1B) | Length(1B) | function code(2B) | data(nB) | フレーム尾(2B) |
|---|---|---|---|---|---|
| device→屏幕 | 0x5A | 機能コード到フレーム尾的Bytesの数 | 0x0001~0xFFFF | 可变 | 0xFC 0xFF |
| 屏幕→device | 0xA9 | 同上 | 同上 | 可变 | 0xFC 0xFF |
Length = function code 2B + data nB + フレーム尾 2B = n+4,ビッグエンディアン。function code:0x0001=switch、0x0002=Brightness、0x0003=改名称。
3. ステータス机解析(処理分包/粘包)
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 -- No.2バイト:Length
state = STATE_DATA
recvBuf = {b}
elseif state == STATE_DATA then
table.insert(recvBuf, b)
if #recvBuf >= frameLen then
-- 收满一フレーム,Parse
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回调是系统任务ポーリング触发,ではない硬件中断——别在回调里做耗时操作(ストリング·ストリング大拼接、文件読み書き),会拖慢系统。
整理自 广州大彩科技 VisualHMI 开发ドキュメント(hmi-doc.gz-dc.com)LUA Tutorial「Custom Protocol-被动受信」,著作権は大彩科技すべての。
Leave a Reply