通常我們拿到某個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解析的的完整內容,轉載注明出處。