解析.DBC文件, 讀懂CAN通信矩陣,實現車內信號仿真


 通常我們拿到某個ECU的通信矩陣數據庫文件,.dbc后綴名的文件。 直接使用CANdb++ Editor打開,可以很直觀的讀懂信號矩陣的信息,例如下圖:

現在要把上圖呈現的信號從.dbc文件中解析出來,供實現自動化仿真總線信號使用,比如使用python+支持can收發的硬件即可替代canoe實現信號仿真(性能上不夠用,可滿足功能測試所需)。

一個標准CAN幀中包含的信息有,消息ID、報文發送周期、 報文長度、信號信息等。

開始解析前,先了解一下報文幀。下表體現了摩托羅拉字節位序的報文發送時的字節序和bit序,一會兒可以幫助我們理解dbc中的定義

 

 我使用了notepad++打開數據庫文件,提取數據庫文件中的關鍵信息。此處隨意選取了其中一個ID=1015(dec)作為例子講解。全文本搜索1015,結果如下:

Line 62: BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
Line 883: CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
Line 884: CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
Line 1265: BA_ "GenMsgCycleTime" BO_ 1015 1000;
Line 1463: BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
Line 1967: VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;

挨個戳開每條搜索結果查看詳細內容,逐句解釋:

說明:dbc文件以空格符拆分數據信息,類似於csv文件以","拆分數據的意思," "屬於分隔符。還有其他分割信息的符號,如 "|",",","()","[]"等

1、報文消息數據格式解讀

舉例:以下是DBC中代表一條消息的描述信息

BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX 

解釋:

BO_              代表一條消息的起始標識

1015          消息ID的十進制形式,=0x3f7

IPK_ODO_Consump   消息名

:            分割符號

8           消息報文長度,幀字節數

Vector__XXX       發出該消息的網絡節點,標識為Vector__XXX時未指明具體節點

2、信號信息數據格式解讀

每條報文消息里面有多個報文信號,報文信號的信息的起始標識為"SG_", 它以一個"BO_"開始至下一"BO_"之間的內容止,詳細報文消息以縮進1或2個空格符形式類似樹圖子節點的方式呈現。

舉例:一條消息下的一個信號的信息,此處縮進一個空格

 SG_ IPK_EVDTEodometer : 7|12@0+ (1,0) [0|999] "km"  TBOX

解釋:

SG_           代表一個信號信息的起始標識

IPK_EVDTEodometer    信號名,分長名與短名,此處是短名。長名非必須存在,可以不定義

 :             分割符號

7             信號起始bit

|             分割符號

12            信號總長度

@0+            @0表示是Motorola格式(Intel格式是1),+表示是無符號數據

(1,0)          (精度值,偏移值)

[0|999]          [最小值|最大值], 物理意義的最小與最大,現實世界的有物理意義的值,比如此處儀表續航里程最大999KM

"km"           "單位"

TBOX          接收處理此信號的節點,同樣可以不指明,寫為Vector__XXX

1)Motorola格式與Intel格式

這個決定了信號起始bit, 生成報文計算信號值時的大小端算法。

Motorola格式:

 信號以高字節低位起始,此處占了12bit, 以第二字節的低bit 12位算起,計12個bit總長度,信號是連續的(此處連續針對低字節在前的字節發送序,參看LSB與MSB)。

比如我設置續航里程998KM, 它的信號值在整條報文中表現為 3E,60,00,00,00,00,00,00

發送字節序

 信號布局圖 (橫軸bit序,縱軸字節序;先從左至右,再由上至下閱讀信號)

 

Intel格式:

信號以低字節低位起始,此處占了12bit, 以第一字節的低bit 0位算起,計12個bit總長度,信號是非連續的(發送的字節序體現出的信號值非連續,但是bit位是由低到高連續的)。

比如我設置續航里程998KM, 信號值在報文中為 E6,03,00,00,00,00,00,00

 信號布局圖(橫軸bit序,縱軸字節序;先從右至左,再由上至下閱讀信號)

 

 

2)精度值與偏移量,物理值與信號值的關系公式:

  信號值*精度值 + 偏移量 = 物理值

總線上報文消息中傳遞的是信號值,當此信號傳遞到ECU時,需轉換為物理意義的值在輸出接口顯示。

舉例:

SG_ TCU_TransOilTemp : 7|8@0+ (1,-40) [-40|214] "°C"  TBOX

若傳感器顯示16度,則 信號值=(物理值-偏移量)/精度值 = (16 - (-40))/1 = 56(dec) = 0x38, 報文呈現為“38,00,00,00,00,00,00,00”  (此處00表示未設置信號,","分割字節,以上同)

 3、消息與信號的詳細描述

CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";

解釋:

CM_    起始標識,我猜測CM_為comment縮寫

4、消息發送周期

BA_ "GenMsgCycleTime" BO_ 1015 1000;

解釋:

BA_  起始標識,描述消息與信號更詳盡的信息。 以上語句描述了消息的周期,單位ms

5、信號默認值,起始值

BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;

解釋:

BA_   起始標識,描述消息與信號更詳盡的信息。 以上語句描述了消息中具體信號的初始值,十進制表示

6、值枚舉或特殊值列舉或取值范圍描述

VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;

 解釋:

VAL_  起始標識符,對信號值的描述

以上是DBC解析的的完整內容,轉載注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM