VisualHMI 自由シリアルポート协议(被动):on_uart_recv 自定义フレーム解析

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

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
屏幕→device0xA9同上同上可变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

回调是系统任务ポーリング触发,ではない硬件中断——别在回调里做耗时操作(ストリング·ストリング大拼接、文件読み書き),会拖慢系统。

四个坑:①副シリアルポート不调 uart_setup 就是关闭的,on_init 里初期化すべての要用的副シリアルポート;②packet 不保证是一整フレーム——分包粘包必须自己缓冲ステータス机解析,这是被动协议 90% 的 bug 来源;③主シリアルポート被内置协议占用时受信できない。回调,要么工程里设「Customization」要么 set_free_protocol(1);④長さ字段算清楚(本例=function code2+datan+フレーム尾2),算错一フレーム都解不出来。

整理自 广州大彩科技 VisualHMI 开发ドキュメント(hmi-doc.gz-dc.com)LUA Tutorial「Custom Protocol-被动受信」,著作権は大彩科技すべての。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.