Skip to content

Chinese Protocol Wire Format

戴梓恆 (TAI TZU-HENG) edited this page Aug 31, 2026 · 1 revision

傳輸格式

Python 跟控制器之間送什麼字串,怎麼判斷收完了,怎麼判斷版本。

基本格式

送出:  <指令>[:<參數>...]\n
收到:  <碼>:<訊息>

0 成功,1 失敗。

兩件容易踩到的事:

  • 送出的指令要以換行結尾,driver 的 READ comm_file(cmd) 是一行一行讀的。
  • 回應沒有結尾字元。mappdk_server.klWRITE comm_file (resp) 不帶 CR,分界只靠 TCP 封包邊界。上游因此只 recv() 一次,封包被拆開就會 讀到半截。這裡改成由 protocol 層告訴 transport「收夠了沒」,不夠就 繼續收,見 transport.MappdkTransport._recv

連線建立時 driver 會先送一個 0:successmappdk_comm.klOPEN_COMM),要先讀掉,不然會被下一道指令當成回應。

動作指令的欄位寬度

movej:VVVV:AAAA:CCC:M:N:<值1>:<值2>...
       │    │    │  │ └ 軸數,1 位
       │    │    │  └ 0=關節內插 1=直線內插
       │    │    └ CNT,3 位
       │    └ 加速度,4 位
       └ 速度,4 位

每個數值是正負號加 13 字元定點數,共 14 字元,例如 +000090.000000。 13 是總寬(6 位整數 + 小數點 + 6 位小數),不是整數位數,這裡很容易看錯。

版本偵測

FanucRobot.connect() 會送 ver。上游版本回 wrong-command,這時 robot.extended 設成 False,之後呼叫擴充方法會直接說原因;RDO 編號上限也會跟著切換。

潛在的封包邊界問題

transport.py 原本預設的 is_complete 只檢查「有沒有冒號」,訊息夠長、 剛好卡在 TCP 封包邊界時會提前判定收完,殘留位元組混進下一次的回應。 _recv 現在在判定完整後會用短逾時再讀一次確認沒有後續資料,正常情況 幾乎不花時間。


最後更新:2026-08-31

Clone this wiki locally