ANROT CANopen SDO 指令與 TPDO 設定教學
整理 CANopen SDO 格式、Node ID、波特率、TPDO 輸出率、TPDO 啟停與 Heartbeat 設定。
- canopen
- tutorial
- protocol
CANopen SDO 指令與 TPDO 設定教學
協議支援
| 協議 / frame | 支援狀態 | 本教學的範圍 |
|---|---|---|
| CANopen NMT / SDO / TPDO | 支援 | 說明 CANopen 預設值、TPDO mapping 與常用 SDO 設定。 |
| EDS / CANopen DBC | 支援 | 下載檔提供 EDS 與 DBC 輔助整合。 |
ANROT UART binary (0x91, 0x62, 0x63) | 不適用 | 這不是 UART example;請改看 Python、Qt C++、Ubuntu 等串列範例。 |
本頁整理 CANopen SDO 指令,從通訊觀念、frame 組成、保存流程到 TPDO / Heartbeat 設定完整串起來,方便實作時逐步確認,也方便直接查表。
適用情境
| 你想完成的事 | 主要章節 |
|---|---|
| 確認 SDO frame 要怎麼組 | SDO 基本格式、如何讀一筆 SDO 指令 |
| 修改 Node ID | 修改 Node ID、設定保存與重啟流程 |
| 修改 CAN Baud Rate | 修改 CAN Baud Rate、設定保存與重啟流程 |
| 調整 TPDO 輸出頻率 | TPDO 輸出率設定 |
| 暫停或恢復某個 TPDO | TPDO 啟用、停用與 Heartbeat |
| 設定 Heartbeat | TPDO 啟用、停用與 Heartbeat |
| 導入既有 CANopen 工具 | EDS / DBC 附件 |
文件版本
本頁命令來源的版本資訊如下:
| 項目 | 內容 |
|---|---|
| Document date | 2025-04-09 |
| Firmware | HI14R5-CAN-000 1.6.3 |
| Vendor | Sea Land Tech |
範例中的 ID=0x608 以預設 Node ID 8 為例。若 Node ID 改為 9,SDO Client CAN-ID 需改為 0x609。
EDS / DBC 附件
EDS 主要給 CANopen master 或 CANopen 工具匯入物件字典與裝置資訊;DBC 主要給一般 CAN 工具解析 TPDO frame。若你的工具同時支援兩者,CANopen 設定工作通常看 EDS,資料監看或 log 解析通常看 DBC。DBC 只用於資料顯示與解析,不包含 SDO/NMT 控制或配置類報文定義。
canopen.eds 是 CANopen master 匯入用的裝置描述檔。檔內保留部分 manufacturer object 描述,例如 0x2100 / 0x2101;實際設定指令以本頁後續 SDO 命令表為準。
核心觀念
| 名稱 | 概念說明 | 本頁中的用途 |
|---|---|---|
| Node ID | 裝置在 CANopen 網路中的站號 | 決定 SDO CAN ID 與 TPDO frame ID |
| SDO | 用來讀寫裝置參數的設定通道 | 修改 Node ID、Baud Rate、TPDO 週期、Heartbeat |
| TPDO | 裝置主動送出的資料封包 | 輸出加速度、角速度、歐拉角、四元數 |
| COB-ID | CANopen 物件使用的 CAN frame ID | TPDO 啟用/停用時會寫入 COB-ID |
| Object Index | CANopen 物件字典的索引 | 例如 0x20A0 是 Node ID 設定 |
| Sub-index | 同一個 index 底下的欄位 | 例如 TPDO 的 0x1800:05 是輸出週期 |
| Little-endian | 低位元組先送 | 0x20A0 在 DATA 內寫成 A0 20 |
操作前檢查
開始送 SDO 前,先確認下列項目:
- CAN adapter、終端電阻、H/L 接線與 GND 參考都已正確連接。
- CAN Baud Rate 與裝置目前設定一致;若不一致,SDO 不會有回應。
- Node ID 已知。本文範例使用 Node ID
8,因此 SDO Client CAN-ID 是0x608。 - 使用標準 CAN frame,DLC 通常為
8。 - 寫入設定後,根據指令類型決定是否需要 Save to Flash 與 reset / power cycle。
SDO 基本格式
所有配置指令使用 expedited SDO。多位元組資料皆為 little-endian。
Master 發送 SDO 指令給裝置:
| CAN ID | CS Command | Data Dictionary Index | Sub-index | Data |
|---|---|---|---|---|
0x600 + NodeID | 0x23 寫入 4 bytes | little-endian | 子索引 | 4 bytes,little-endian |
裝置回應:
| CAN ID | SDO Command | Data Dictionary Index | Sub-index | Data |
|---|---|---|---|---|
0x580 + NodeID | 0x60 成功回應 | little-endian | 子索引 | 保留 |
設定修改後若需要保存,需執行「Save Configuration to Flash」。修改 Node ID 或 CAN Baud Rate 後,還需要 reset 或重新上電才會生效。
如何讀一筆 SDO 指令
以修改 Node ID 為例:
ID=0x608, DATA=23,A0,20,00,09,00,00,00
| Byte | 內容 | 說明 |
|---|---|---|
| CAN ID | 0x608 | 0x600 + Node ID,範例 Node ID 為 8 |
| Byte 0 | 23 | expedited SDO,寫入 4 bytes |
| Byte 1-2 | A0 20 | Object Index 0x20A0,little-endian |
| Byte 3 | 00 | Sub-index 0x00 |
| Byte 4-7 | 09 00 00 00 | 寫入值 9,little-endian |
若寫入成功,裝置會從 0x580 + Node ID 回應,預設 Node ID 8 時為 0x588,SDO command byte 應為 0x60。
設定保存與重啟流程
不是每一個 SDO 寫入都代表永久保存。建議用以下流程區分:
| 設定類型 | 寫入後是否立即可觀察 | 是否需要 Save to Flash | 是否需要 reset / 重新上電 |
|---|---|---|---|
| Node ID | 通常需重啟後用新 ID 通訊 | 需要 | 需要 |
| CAN Baud Rate | 通常需重啟後用新 baud rate 通訊 | 需要 | 需要 |
| Restore Factory Settings | 重啟後生效 | 指令本身為還原設定 | 需要重新上電 |
| TPDO 輸出率 | 可用 CAN bus 觀察輸出週期變化 | 依專案需求保存 | 視專案需求 |
| TPDO COB-ID 啟用/停用 | 可用 CAN bus 觀察 TPDO 是否停止/恢復 | 依專案需求保存 | 視專案需求 |
| Heartbeat | 可觀察 heartbeat frame 週期 | Heartbeat rate 有專用保存指令 | 視專案需求 |
典型修改流程:
- 送出目標設定 SDO。
- 等待
0x60成功回應。 - 若要永久保存,送出 Save to Flash 或對應的保存指令。
- 若是 Node ID 或 Baud Rate,送出 Reset 或重新上電。
- 使用新的 CAN ID 或新的 Baud Rate 重新連線驗證。
常用系統設定指令
修改 Node ID (0x20A0)
Node ID 的可設定範圍為 1-127。修改後需 Save to Flash,並 reset 或重新上電。
| 目的 | CAN 指令 |
|---|---|
| 修改 Node ID | ID=0x608, DATA=23,A0,20,00,[ID],00,00,00 |
Save Configuration to Flash (0x2000)
| 目的 | CAN 指令 |
|---|---|
| 儲存設定到 Flash | ID=0x608, DATA=23,00,20,00,00,00,00,00 |
Reset (0x2000)
| 目的 | CAN 指令 |
|---|---|
| Reset | ID=0x608, DATA=23,00,20,00,FF,00,00,00 |
Restore Factory Settings (0x2000)
| 目的 | CAN 指令 |
|---|---|
| 還原出廠設定,包含 Node ID | ID=0x608, DATA=23,00,20,00,01,00,00,00 |
注意:還原出廠設定需重新上電後生效,請謹慎使用。
修改 CAN Baud Rate (0x209A)
修改 CAN Baud Rate 後,需 Save to Flash,並 reset 或重新上電。
| CAN Baud Rate | CAN 指令 |
|---|---|
| 1000 kbit/s | ID=0x608, DATA=23,9A,20,00,00,00,00,00 |
| 500 kbit/s | ID=0x608, DATA=23,9A,20,00,02,00,00,00 |
| 250 kbit/s | ID=0x608, DATA=23,9A,20,00,03,00,00,00 |
| 125 kbit/s | ID=0x608, DATA=23,9A,20,00,04,00,00,00 |
實作範例
將 Node ID 從 8 改成 9
| 步驟 | 發送 frame | 說明 |
|---|---|---|
| 1 | ID=0x608, DATA=23,A0,20,00,09,00,00,00 | 將 0x20A0:00 寫成 9 |
| 2 | ID=0x608, DATA=23,00,20,00,00,00,00,00 | Save Configuration to Flash |
| 3 | ID=0x608, DATA=23,00,20,00,FF,00,00,00 | Reset |
| 4 | ID=0x609, DATA=... | 重啟後改用新的 SDO CAN-ID |
修改 Node ID 後,TPDO frame ID 也會跟著 Node ID 改變。例如 Node ID 9 時,TPDO1 為 0x189,TPDO2 為 0x289。
將 CAN Baud Rate 改成 250 kbit/s
| 步驟 | 發送 frame | 說明 |
|---|---|---|
| 1 | ID=0x608, DATA=23,9A,20,00,03,00,00,00 | 將 CAN Baud Rate 設為 250 kbit/s |
| 2 | ID=0x608, DATA=23,00,20,00,00,00,00,00 | Save Configuration to Flash |
| 3 | ID=0x608, DATA=23,00,20,00,FF,00,00,00 | Reset |
| 4 | 以 250 kbit/s 重新連線 | host 端 baud rate 也要同步改成 250 kbit/s |
修改 baud rate 後,若 host 端仍停在舊 baud rate,會看起來像裝置沒有回應。這通常不是 SDO 失敗,而是雙方 baud rate 已經不同。
TPDO 通道
| Channel | Frame ID | Parameter Index | 資料內容 |
|---|---|---|---|
| TPDO1 | 0x180 + NodeID | 0x1800 | Acceleration |
| TPDO2 | 0x280 + NodeID | 0x1801 | Angular Rate |
| TPDO3 | 0x380 + NodeID | 0x1802 | Euler Angles |
| TPDO4 | 0x480 + NodeID | 0x1803 | Quaternion |
| TPDO5 | 0x680 + NodeID | 0x1804 | Pressure |
TPDO 資料解析
以下為各 TPDO payload 的解析說明。
| Channel | DLC | 資料內容 | Payload 格式 | 單位 / 縮放 |
|---|---|---|---|---|
| TPDO1 | 6 | Acceleration | int16 x 3,低位元組在前,順序 X / Y / Z | mG,0.001 g |
| TPDO2 | 6 | Angular Rate | int16 x 3,低位元組在前,順序 X / Y / Z | 0.1 dps |
| TPDO3 | 6 | Euler Angles | int16 x 3,低位元組在前,順序 Roll / Pitch / Yaw | 0.01 deg |
| TPDO4 | 8 | Quaternion | int16 x 4,低位元組在前,順序 qw / qx / qy / qz | 單位四元數放大 10000 倍 |
| TPDO5 | 4 | Pressure | int32 x 1,低位元組在前 | Pa |
目前 CANopen EDS 與 DBC 以 Node ID 8 建模,對應 frame ID 為 TPDO1 0x188、TPDO2 0x288、TPDO3 0x388、TPDO4 0x488、TPDO5 0x688。TPDO5 是否實際輸出取決於裝置型號、韌體與輸出設定;若 bus 上沒有對應 frame,DBC 仍可保留作為解析定義。
例如 TPDO4 回傳 10 27 00 00 00 00 00 00 時,little-endian 解析為 10000, 0, 0, 0,對應四元數約為 1, 0, 0, 0。
TPDO 啟用、停用與 Heartbeat
TPDO communication parameter object 為 0x1800-0x1803。COB-ID 是該 PDO 使用的 CAN-ID;將 bit 31 設為 1 代表停用 TPDO,bit 31 設為 0 代表啟用 TPDO。
以下範例以 Node ID 8 計算,因此 TPDO1 的 Frame ID 為 0x188、TPDO2 為 0x288、TPDO3 為 0x388、TPDO4 為 0x488。
下表的 SDO Command 是 CAN frame 的 DATA bytes;發送時 CAN ID 使用 0x600 + NodeID,預設 Node ID 8 時為 ID=0x608, DLC=8。
| 目的 | SDO Command | 說明 |
|---|---|---|
停用 TPDO1 (0x188) | 23 00 18 01 00 00 00 80 | 寫入 0x80000000 至 0x1800:01 |
啟用 TPDO1 (0x188) | 23 00 18 01 88 01 00 00 | 寫入 0x00000188 至 0x1800:01 |
停用 TPDO2 (0x288) | 23 01 18 01 00 00 00 80 | 寫入 0x80000000 至 0x1801:01 |
啟用 TPDO2 (0x288) | 23 01 18 01 88 02 00 00 | 寫入 0x00000288 至 0x1801:01 |
停用 TPDO3 (0x388) | 23 02 18 01 00 00 00 80 | 寫入 0x80000000 至 0x1802:01 |
啟用 TPDO3 (0x388) | 23 02 18 01 88 03 00 00 | 寫入 0x00000388 至 0x1802:01 |
停用 TPDO4 (0x488) | 23 03 18 01 00 00 00 80 | 寫入 0x80000000 至 0x1803:01 |
啟用 TPDO4 (0x488) | 23 03 18 01 88 04 00 00 | 寫入 0x00000488 至 0x1803:01 |
| 停用 Heartbeat | 2B 17 10 00 00 00 00 00 | 寫入 0x0000 至 0x1017,Producer Heartbeat Time = Disable |
| Heartbeat 設為 1000 ms | 2B 17 10 00 E8 03 00 00 | 寫入 0x03E8 至 0x1017 |
| 儲存 Heartbeat rate | 23 10 10 01 73 61 76 65 | 特殊指令,用於保存 Heartbeat rate |
什麼時候改 COB-ID,什麼時候改輸出率
TPDO 有兩種常見停用方式:
| 方式 | 適合情境 | 特性 |
|---|---|---|
將輸出率設為 Disable / 0 ms | 暫時停止資料輸出,之後仍想用同一個 frame ID 恢復 | 操作直觀,只改 sub-index 0x05 |
將 COB-ID bit 31 設為 1 | 想明確停用某個 TPDO,或避免 master 將該 TPDO 視為有效 PDO | 符合 CANopen PDO communication parameter 的啟停方式 |
若只是調整資料頻率,通常改輸出率即可。若你正在整理 CANopen master 的 PDO mapping 或需要停用某個 PDO 物件,使用 COB-ID bit 31 會比較明確。
TPDO 輸出率設定
TPDO 輸出率設定使用 0x1800-0x1803 的 sub-index 0x05。資料欄位為輸出週期,單位為 ms。
| 輸出率 | 週期 |
|---|---|
| 200 Hz | 5 ms |
| 100 Hz | 10 ms |
| 50 Hz | 20 ms |
| 20 Hz | 50 ms |
| 10 Hz | 100 ms |
| Disable | 0 ms |
TPDO1 Acceleration Output Rate
| 輸出率 | CAN 指令 |
|---|---|
| Disable | ID=0x608, DATA=2B,00,18,05,00,00,00,00 |
| 200 Hz | ID=0x608, DATA=2B,00,18,05,05,00,00,00 |
| 100 Hz | ID=0x608, DATA=2B,00,18,05,0A,00,00,00 |
| 50 Hz | ID=0x608, DATA=2B,00,18,05,14,00,00,00 |
| 20 Hz | ID=0x608, DATA=2B,00,18,05,32,00,00,00 |
| 10 Hz | ID=0x608, DATA=2B,00,18,05,64,00,00,00 |
TPDO2 Angular Rate Output Rate
| 輸出率 | CAN 指令 |
|---|---|
| Disable | ID=0x608, DATA=2B,01,18,05,00,00,00,00 |
| 200 Hz | ID=0x608, DATA=2B,01,18,05,05,00,00,00 |
| 100 Hz | ID=0x608, DATA=2B,01,18,05,0A,00,00,00 |
| 50 Hz | ID=0x608, DATA=2B,01,18,05,14,00,00,00 |
| 20 Hz | ID=0x608, DATA=2B,01,18,05,32,00,00,00 |
| 10 Hz | ID=0x608, DATA=2B,01,18,05,64,00,00,00 |
TPDO3 Euler Angles Output Rate
| 輸出率 | CAN 指令 |
|---|---|
| Disable | ID=0x608, DATA=2B,02,18,05,00,00,00,00 |
| 200 Hz | ID=0x608, DATA=2B,02,18,05,05,00,00,00 |
| 100 Hz | ID=0x608, DATA=2B,02,18,05,0A,00,00,00 |
| 50 Hz | ID=0x608, DATA=2B,02,18,05,14,00,00,00 |
| 20 Hz | ID=0x608, DATA=2B,02,18,05,32,00,00,00 |
| 10 Hz | ID=0x608, DATA=2B,02,18,05,64,00,00,00 |
TPDO4 Quaternion Output Rate
| 輸出率 | CAN 指令 |
|---|---|
| Disable | ID=0x608, DATA=2B,03,18,05,00,00,00,00 |
| 200 Hz | ID=0x608, DATA=2B,03,18,05,05,00,00,00 |
| 100 Hz | ID=0x608, DATA=2B,03,18,05,0A,00,00,00 |
| 50 Hz | ID=0x608, DATA=2B,03,18,05,14,00,00,00 |
| 20 Hz | ID=0x608, DATA=2B,03,18,05,32,00,00,00 |
| 10 Hz | ID=0x608, DATA=2B,03,18,05,64,00,00,00 |
驗證與排查
SDO 沒有回應
先確認 CAN bus 上是否完全沒有回應,或只是沒有看到預期的 0x60 成功回應。
| 檢查項目 | 判斷方式 |
|---|---|
| CAN Baud Rate | host 與裝置 baud rate 必須一致;剛改過 baud rate 時尤其要確認 |
| Node ID | SDO Client CAN-ID 是 0x600 + NodeID,Node ID 改過後 CAN ID 也要改 |
| CAN frame 類型 | 使用標準 CAN frame,不使用 extended frame |
| DLC | SDO 寫入命令使用 DLC=8 |
| Endian | Object Index 與 data 都使用 little-endian |
| 接線 | 確認 CAN_H / CAN_L、GND 參考與終端電阻 |
寫入成功但重開機後設定不見
這通常代表設定只寫到目前執行狀態,沒有保存到 Flash。Node ID 與 CAN Baud Rate 修改後需送出:
ID=0x608, DATA=23,00,20,00,00,00,00,00
接著 reset 或重新上電。若 Node ID 已改變,reset 後要使用新的 0x600 + NodeID 與裝置通訊。
TPDO 沒有資料
依序檢查:
- Node ID 是否正確,TPDO frame ID 是否依
0x180/0x280/0x380/0x480 + NodeID計算。 - TPDO 輸出率是否被設為 Disable /
0 ms。 - TPDO COB-ID 的 bit 31 是否被設為
1,若是代表該 TPDO 被停用。 - CANopen master 或監看工具是否過濾了該 frame ID。
- 若剛改過 Node ID 或 baud rate,確認 host 已改用新的 CAN ID 或 baud rate。
指令中的逗號與空格
本文表格中的 DATA=23,A0,20,00,09,00,00,00 與 23 A0 20 00 09 00 00 00 表示同一組 8 bytes。實際輸入格式依 CAN 工具而定;重點是 byte 順序不能改。
最小整合流程
第一次把裝置接進 CANopen 系統時,可以用這個順序確認:
- 用目前 baud rate 與 Node ID 發送一筆 SDO,確認可收到
0x60回應。 - 匯入 EDS 到 CANopen 工具,或用 DBC 監看 TPDO frame。
- 確認 TPDO1-4 的 frame ID 是否符合目前 Node ID。
- 依需求設定 TPDO 輸出率。
- 若需要站號或 baud rate 與系統一致,修改 Node ID / CAN Baud Rate,保存後 reset。
- 重啟後用新的設定重新連線,確認 SDO 回應與 TPDO 輸出。