ANROT 教學文件

ANROT CANopen SDO 指令與 TPDO 設定教學

整理 CANopen SDO 格式、Node ID、波特率、TPDO 輸出率、TPDO 啟停與 Heartbeat 設定。

最後更新 2025年4月9日 對應產品 5
  • 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 輸出率設定
暫停或恢復某個 TPDOTPDO 啟用、停用與 Heartbeat
設定 HeartbeatTPDO 啟用、停用與 Heartbeat
導入既有 CANopen 工具EDS / DBC 附件

文件版本

本頁命令來源的版本資訊如下:

項目內容
Document date2025-04-09
FirmwareHI14R5-CAN-000 1.6.3
VendorSea 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-IDCANopen 物件使用的 CAN frame IDTPDO 啟用/停用時會寫入 COB-ID
Object IndexCANopen 物件字典的索引例如 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 IDCS CommandData Dictionary IndexSub-indexData
0x600 + NodeID0x23 寫入 4 byteslittle-endian子索引4 bytes,little-endian

裝置回應:

CAN IDSDO CommandData Dictionary IndexSub-indexData
0x580 + NodeID0x60 成功回應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 ID0x6080x600 + Node ID,範例 Node ID 為 8
Byte 023expedited SDO,寫入 4 bytes
Byte 1-2A0 20Object Index 0x20A0,little-endian
Byte 300Sub-index 0x00
Byte 4-709 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 有專用保存指令視專案需求

典型修改流程:

  1. 送出目標設定 SDO。
  2. 等待 0x60 成功回應。
  3. 若要永久保存,送出 Save to Flash 或對應的保存指令。
  4. 若是 Node ID 或 Baud Rate,送出 Reset 或重新上電。
  5. 使用新的 CAN ID 或新的 Baud Rate 重新連線驗證。

常用系統設定指令

修改 Node ID (0x20A0)

Node ID 的可設定範圍為 1-127。修改後需 Save to Flash,並 reset 或重新上電。

目的CAN 指令
修改 Node IDID=0x608, DATA=23,A0,20,00,[ID],00,00,00

Save Configuration to Flash (0x2000)

目的CAN 指令
儲存設定到 FlashID=0x608, DATA=23,00,20,00,00,00,00,00

Reset (0x2000)

目的CAN 指令
ResetID=0x608, DATA=23,00,20,00,FF,00,00,00

Restore Factory Settings (0x2000)

目的CAN 指令
還原出廠設定,包含 Node IDID=0x608, DATA=23,00,20,00,01,00,00,00

注意:還原出廠設定需重新上電後生效,請謹慎使用。

修改 CAN Baud Rate (0x209A)

修改 CAN Baud Rate 後,需 Save to Flash,並 reset 或重新上電。

CAN Baud RateCAN 指令
1000 kbit/sID=0x608, DATA=23,9A,20,00,00,00,00,00
500 kbit/sID=0x608, DATA=23,9A,20,00,02,00,00,00
250 kbit/sID=0x608, DATA=23,9A,20,00,03,00,00,00
125 kbit/sID=0x608, DATA=23,9A,20,00,04,00,00,00

實作範例

將 Node ID 從 8 改成 9

步驟發送 frame說明
1ID=0x608, DATA=23,A0,20,00,09,00,00,000x20A0:00 寫成 9
2ID=0x608, DATA=23,00,20,00,00,00,00,00Save Configuration to Flash
3ID=0x608, DATA=23,00,20,00,FF,00,00,00Reset
4ID=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說明
1ID=0x608, DATA=23,9A,20,00,03,00,00,00將 CAN Baud Rate 設為 250 kbit/s
2ID=0x608, DATA=23,00,20,00,00,00,00,00Save Configuration to Flash
3ID=0x608, DATA=23,00,20,00,FF,00,00,00Reset
4以 250 kbit/s 重新連線host 端 baud rate 也要同步改成 250 kbit/s

修改 baud rate 後,若 host 端仍停在舊 baud rate,會看起來像裝置沒有回應。這通常不是 SDO 失敗,而是雙方 baud rate 已經不同。

TPDO 通道

ChannelFrame IDParameter Index資料內容
TPDO10x180 + NodeID0x1800Acceleration
TPDO20x280 + NodeID0x1801Angular Rate
TPDO30x380 + NodeID0x1802Euler Angles
TPDO40x480 + NodeID0x1803Quaternion
TPDO50x680 + NodeID0x1804Pressure

TPDO 資料解析

以下為各 TPDO payload 的解析說明。

ChannelDLC資料內容Payload 格式單位 / 縮放
TPDO16Accelerationint16 x 3,低位元組在前,順序 X / Y / ZmG,0.001 g
TPDO26Angular Rateint16 x 3,低位元組在前,順序 X / Y / Z0.1 dps
TPDO36Euler Anglesint16 x 3,低位元組在前,順序 Roll / Pitch / Yaw0.01 deg
TPDO48Quaternionint16 x 4,低位元組在前,順序 qw / qx / qy / qz單位四元數放大 10000
TPDO54Pressureint32 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寫入 0x800000000x1800:01
啟用 TPDO1 (0x188)23 00 18 01 88 01 00 00寫入 0x000001880x1800:01
停用 TPDO2 (0x288)23 01 18 01 00 00 00 80寫入 0x800000000x1801:01
啟用 TPDO2 (0x288)23 01 18 01 88 02 00 00寫入 0x000002880x1801:01
停用 TPDO3 (0x388)23 02 18 01 00 00 00 80寫入 0x800000000x1802:01
啟用 TPDO3 (0x388)23 02 18 01 88 03 00 00寫入 0x000003880x1802:01
停用 TPDO4 (0x488)23 03 18 01 00 00 00 80寫入 0x800000000x1803:01
啟用 TPDO4 (0x488)23 03 18 01 88 04 00 00寫入 0x000004880x1803:01
停用 Heartbeat2B 17 10 00 00 00 00 00寫入 0x00000x1017,Producer Heartbeat Time = Disable
Heartbeat 設為 1000 ms2B 17 10 00 E8 03 00 00寫入 0x03E80x1017
儲存 Heartbeat rate23 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 Hz5 ms
100 Hz10 ms
50 Hz20 ms
20 Hz50 ms
10 Hz100 ms
Disable0 ms

TPDO1 Acceleration Output Rate

輸出率CAN 指令
DisableID=0x608, DATA=2B,00,18,05,00,00,00,00
200 HzID=0x608, DATA=2B,00,18,05,05,00,00,00
100 HzID=0x608, DATA=2B,00,18,05,0A,00,00,00
50 HzID=0x608, DATA=2B,00,18,05,14,00,00,00
20 HzID=0x608, DATA=2B,00,18,05,32,00,00,00
10 HzID=0x608, DATA=2B,00,18,05,64,00,00,00

TPDO2 Angular Rate Output Rate

輸出率CAN 指令
DisableID=0x608, DATA=2B,01,18,05,00,00,00,00
200 HzID=0x608, DATA=2B,01,18,05,05,00,00,00
100 HzID=0x608, DATA=2B,01,18,05,0A,00,00,00
50 HzID=0x608, DATA=2B,01,18,05,14,00,00,00
20 HzID=0x608, DATA=2B,01,18,05,32,00,00,00
10 HzID=0x608, DATA=2B,01,18,05,64,00,00,00

TPDO3 Euler Angles Output Rate

輸出率CAN 指令
DisableID=0x608, DATA=2B,02,18,05,00,00,00,00
200 HzID=0x608, DATA=2B,02,18,05,05,00,00,00
100 HzID=0x608, DATA=2B,02,18,05,0A,00,00,00
50 HzID=0x608, DATA=2B,02,18,05,14,00,00,00
20 HzID=0x608, DATA=2B,02,18,05,32,00,00,00
10 HzID=0x608, DATA=2B,02,18,05,64,00,00,00

TPDO4 Quaternion Output Rate

輸出率CAN 指令
DisableID=0x608, DATA=2B,03,18,05,00,00,00,00
200 HzID=0x608, DATA=2B,03,18,05,05,00,00,00
100 HzID=0x608, DATA=2B,03,18,05,0A,00,00,00
50 HzID=0x608, DATA=2B,03,18,05,14,00,00,00
20 HzID=0x608, DATA=2B,03,18,05,32,00,00,00
10 HzID=0x608, DATA=2B,03,18,05,64,00,00,00

驗證與排查

SDO 沒有回應

先確認 CAN bus 上是否完全沒有回應,或只是沒有看到預期的 0x60 成功回應。

檢查項目判斷方式
CAN Baud Ratehost 與裝置 baud rate 必須一致;剛改過 baud rate 時尤其要確認
Node IDSDO Client CAN-ID 是 0x600 + NodeID,Node ID 改過後 CAN ID 也要改
CAN frame 類型使用標準 CAN frame,不使用 extended frame
DLCSDO 寫入命令使用 DLC=8
EndianObject 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 沒有資料

依序檢查:

  1. Node ID 是否正確,TPDO frame ID 是否依 0x180/0x280/0x380/0x480 + NodeID 計算。
  2. TPDO 輸出率是否被設為 Disable / 0 ms
  3. TPDO COB-ID 的 bit 31 是否被設為 1,若是代表該 TPDO 被停用。
  4. CANopen master 或監看工具是否過濾了該 frame ID。
  5. 若剛改過 Node ID 或 baud rate,確認 host 已改用新的 CAN ID 或 baud rate。

指令中的逗號與空格

本文表格中的 DATA=23,A0,20,00,09,00,00,0023 A0 20 00 09 00 00 00 表示同一組 8 bytes。實際輸入格式依 CAN 工具而定;重點是 byte 順序不能改。

最小整合流程

第一次把裝置接進 CANopen 系統時,可以用這個順序確認:

  1. 用目前 baud rate 與 Node ID 發送一筆 SDO,確認可收到 0x60 回應。
  2. 匯入 EDS 到 CANopen 工具,或用 DBC 監看 TPDO frame。
  3. 確認 TPDO1-4 的 frame ID 是否符合目前 Node ID。
  4. 依需求設定 TPDO 輸出率。
  5. 若需要站號或 baud rate 與系統一致,修改 Node ID / CAN Baud Rate,保存後 reset。
  6. 重啟後用新的設定重新連線,確認 SDO 回應與 TPDO 輸出。