ANROT CAN J1939 DBC 解析教學
說明 ANROT CAN J1939 的 29-bit extended frame、PGN / Source Address、DBC 匯入方式,以及 IMU、姿態、GNSS / INS 訊號解析。
- j1939
- can
- dbc
- tutorial
CAN J1939 DBC 解析教學
協議支援
| 協議 / frame | 支援狀態 | 本教學的範圍 |
|---|---|---|
| SAE J1939 / CAN DBC | 支援 | DBC 描述 CAN PGN/SPN 訊號,供 J1939 工具解析。 |
ANROT UART binary (0x91, 0x62, 0x63) | 不適用 | 這些是 UART binary frame,不屬於 J1939。 |
| CANopen | 不適用 | 請改看 CANopen 教學。 |
本頁說明如何使用 J1939.dbc 解析 ANROT 裝置輸出的 CAN J1939 資料。DBC 適合匯入 CANdb++、CANalyzer、PCAN-View 或其他支援 DBC 的 CAN 分析工具,用來把原始 CAN frame 轉換成經緯度、速度、加速度、角速度、姿態角、四元數等物理量。
DBC 只負責資料解析,不包含裝置控制、參數設定或輸出切換指令。若需要設定裝置輸出模式、Node ID、baud rate 或 CANopen TPDO,請搭配對應設定文件與 CANopen 教學使用。
下載
J1939 frame 結構
J1939 使用 29-bit extended CAN frame。ANROT J1939 DBC 中的訊息 ID 以 DBC extended-frame 表示法儲存,因此 DBC 內 BO_ 的十進位 ID 會包含 extended flag;實際 bus 上看到的 29-bit CAN ID 需看低 29 bit。
以 PGN65332_FF34_Accel 為例:
| 項目 | 值 |
|---|---|
| DBC 內 BO_ ID | 2365535240 |
| DBC 內十六進位 | 0x8CFF3408 |
| 實際 29-bit CAN ID | 0x0CFF3408 |
| Priority | 3 |
| PGN | 0xFF34 |
| Source Address | 0x08 |
0x8CFF3408 最前面的 extended flag 是 DBC 格式用來標示 extended frame 的資訊;實際 CAN bus frame ID 是 0x0CFF3408。如果你的 CAN 工具已正確載入 DBC,通常不需要手動轉換;如果你用 raw log 或程式自行比對 ID,必須注意這個差異。
DBC 使用流程
- 確認 CAN adapter 支援 29-bit extended frame。
- 設定 CAN baud rate 與裝置輸出設定一致。
- 在 CAN 分析工具中匯入
J1939.dbc。 - 開始接收 CAN frame,確認工具能看到
0x0CFFxxxx類型的 extended ID。 - 依訊號名稱查看物理量,例如
Acc_X、Gyr_Z、Roll、Latitude。
訊息總覽
DBC 以 Source Address 0x08 建模。若裝置 Source Address 改變,實際 CAN ID 的最後一個 byte 會跟著改變,DBC 可能需要在工具中調整節點 / ID 或另存一份對應 source address 的 DBC。
| DBC 訊息 | 實際 29-bit CAN ID | PGN | 主要資料 |
|---|---|---|---|
PGN65296_FF10_LonLat | 0x0CFF1008 | 0xFF10 | Latitude、Longitude |
PGN65300_FF14_AltUnduDiffAge | 0x0CFF1408 | 0xFF14 | Altitude、Undulation、Diff Age |
PGN65304_FF18_StatusSats | 0x0CFF1808 | 0xFF18 | GNSS / INS 狀態與衛星數 |
PGN65318_FF26_Velocity | 0x0CFF2608 | 0xFF26 | East / North / Up velocity、Ground Speed |
PGN65327_FF2F_Time | 0x0CFF2F08 | 0xFF2F | UTC 時間 |
PGN65332_FF34_Accel | 0x0CFF3408 | 0xFF34 | X / Y / Z 加速度 |
PGN65335_FF37_Gyro | 0x0CFF3708 | 0xFF37 | X / Y / Z 角速度 |
PGN65338_FF3A_Mag | 0x0CFF3A08 | 0xFF3A | X / Y / Z 磁場 |
PGN65341_FF3D_RollPitch | 0x0CFF3D08 | 0xFF3D | Roll、Pitch |
PGN65345_FF41_YawDual | 0x0CFF4108 | 0xFF41 | Yaw 0-360、Yaw -180-180 |
PGN65347_FF43_TempPressure | 0x0CFF4308 | 0xFF43 | Temperature、Pressure |
PGN65350_FF46_Quaternion | 0x0CFF4608 | 0xFF46 | Quaternion W / X / Y / Z |
PGN65354_FF4A_Inclinometer | 0x0CFF4A08 | 0xFF4A | Inclinometer X / Y |
訊號與縮放
所有多位元組訊號皆以 little-endian 解析。DBC 已內建 scale / offset;使用 CAN 分析工具載入 DBC 後,工具會自動把 raw value 轉成物理量。
GNSS / INS 位置與狀態
| PGN | 訊號 | 型別 | 縮放 | 單位 |
|---|---|---|---|---|
0xFF10 | Latitude | signed 32-bit | 1e-7 | deg |
0xFF10 | Longitude | signed 32-bit | 1e-7 | deg |
0xFF14 | Altitude | signed 32-bit | 0.01 | m |
0xFF14 | Undulation | signed 16-bit | 0.01 | m |
0xFF14 | Diff_Age | signed 16-bit | 0.01 | s |
0xFF18 | GNSS_Pos_Quality | unsigned 8-bit | 1 | - |
0xFF18 | GNSS_Heading_Quality | unsigned 8-bit | 1 | - |
0xFF18 | Sat_Pos_Count | unsigned 8-bit | 1 | - |
0xFF18 | Sat_Heading_Count | unsigned 8-bit | 1 | - |
0xFF18 | INS_Status | unsigned 8-bit | 1 | - |
速度與時間
| PGN | 訊號 | 型別 | 縮放 | 單位 |
|---|---|---|---|---|
0xFF26 | Vel_East | signed 16-bit | 0.01 | m/s |
0xFF26 | Vel_North | signed 16-bit | 0.01 | m/s |
0xFF26 | Vel_Up | signed 16-bit | 0.01 | m/s |
0xFF26 | Ground_Speed | signed 16-bit | 0.01 | m/s |
0xFF2F | UTC_Year / UTC_Month / UTC_Day | unsigned 8-bit | 1 | - |
0xFF2F | UTC_Hour / UTC_Minute / UTC_Second | unsigned 8-bit | 1 | - |
0xFF2F | UTC_Millisecond | unsigned 16-bit | 1 | ms |
IMU 與姿態
| PGN | 訊號 | 型別 | 縮放 | 單位 |
|---|---|---|---|---|
0xFF34 | Acc_X / Acc_Y / Acc_Z | signed 16-bit | 0.00048828 | G |
0xFF37 | Gyr_X / Gyr_Y / Gyr_Z | signed 16-bit | 0.061035 | deg/s |
0xFF3A | Mag_X / Mag_Y / Mag_Z | signed 16-bit | 0.030517 | uT |
0xFF3D | Roll / Pitch | signed 32-bit | 0.001 | deg |
0xFF41 | Yaw_360 | unsigned 32-bit | 0.001 | deg |
0xFF41 | Yaw_pm180 | signed 32-bit | 0.001 | deg |
0xFF43 | Temperature | signed 16-bit | 0.01 | degC |
0xFF43 | Pressure | signed 32-bit | 0.01 | Pa |
0xFF46 | Quat_W / Quat_X / Quat_Y / Quat_Z | signed 16-bit | 0.0001 | - |
0xFF4A | Incli_X / Incli_Y | signed 32-bit | 0.001 | deg |
手動解析範例
如果不透過 DBC 工具,而是用程式自行解析,公式為:
physical value = raw value * scale + offset
例如 PGN65332_FF34_Accel 的 Acc_X 位於 byte 0-1,signed 16-bit little-endian,scale 為 0.00048828 G。若 raw bytes 為 00 08,little-endian raw value 為 0x0800 = 2048:
2048 * 0.00048828 = 0.99999744 G
因此 Acc_X 約為 1.0 G。
與 CANopen DBC 的差異
| 項目 | J1939 DBC | CANopen DBC |
|---|---|---|
| CAN frame | 29-bit extended frame | 11-bit standard frame |
| 主要識別方式 | PGN + Source Address | TPDO frame ID + Node ID |
| 用途 | IMU、姿態、INS / GNSS 資料解析 | CANopen TPDO 資料解析 |
| 控制 / 設定 | 不包含 | DBC 不包含,設定需用 SDO / NMT |
| 常見 ID 範例 | 0x0CFF3408 | 0x188 |
若工具沒有顯示解析後的物理量,先確認匯入的是 J1939 DBC,且 CAN log 中的 frame 是 extended frame。把 J1939 extended frame 當成 standard CAN frame 解析,通常會完全對不上。
排查
| 現象 | 優先檢查 |
|---|---|
| 完全收不到 frame | CAN baud rate、接線、終端電阻、裝置是否已啟用 CAN J1939 輸出 |
| 收得到 frame 但 DBC 不解析 | 是否為 29-bit extended frame、DBC 是否已正確匯入、Source Address 是否仍為 0x08 |
| 只有部分訊號沒有值 | 該 PGN 可能未輸出,或目前裝置型號 / 設定不包含該資料 |
| 物理量明顯不合理 | 檢查 endian、signed / unsigned、scale,以及工具是否使用 raw ID 而非 DBC extended ID |
| 改過 Source Address 後無法解析 | DBC 以 SA 0x08 建模,需要調整工具對應 ID 或產生新的 DBC |