歡迎關注《汽車軟件技術》公眾號,回復關鍵字獲取資料。
1.DBC定義
DBC(data base CAN)是汽車ECU間進行CAN通訊的報文內容,有了它相互之間才能聽懂。
2.DBC查看
DBC是文本文件,可以用記事本打開,一般都用CANdb++,可以更方便的查看和編輯。
3.DBC組成
DBC是由一系列的Message和Signal組成,文件定義了Message和Signal的屬性,可參考vector文檔(回復“DBC文檔”獲取)。下面介紹幾個重要的關鍵字:
1)BO_
BO_是對Message的定義。
- 格式:BO_ ID Name: DLC Transmiter
- 例子:BO_ 100 ESP_01: 8 ESP
- 釋義:發送方=ESP,幀名稱=ESP_01,幀ID=0x64,報文長度=8個字節
2)SG_
SG_是對Signal的定義。
- 格式:SG_ Name : StartBit | Length @ ByteOrder SignedFlag (Factor,Offset) [Minimum | Maximum] "Unit" Receiver1,Receiver2
- 例子:SG_ VehSpd : 7|16@0+ (0.01,0) [0|655.35] "km/h" ECM.TCM
- 釋義:信號名稱=VehSpd,起始地址=7,長度=16,字節順序=MSB(大端),符號位=無符號,系數=0.01,偏移=0,最小值=0,最大值=655.35,單位=km/h,接收方=ECM和TCM
3)VAL_
VAL_是對Signal枚舉值的定義。
- 格式:VAL_ ID Name key1 "value1" key2 "value2" ;
- 例子:VAL_ 100 VehSpdValid 1 "Valid" 0 "Invalid" ;
- 釋義:幀ID=0x64,信號名稱=VehSpdValid,枚舉值(0x0=Invalid,0x1=Valid)
4.DBC解析
上文已經介紹了DBC的格式,接下來介紹如何使用DBC從原始報文中解析出物理值。在此之前要先理解MSB(大端)和LSB(小端)。MSB是高位在前,LSB是低位在前,大多數都用的MSB。
1)原始值
假設有3個信號:signal1、signal2和signal3,長度分別是16、4、12。這3個信號包括了3種類型:完整字節,部分字節和跨字節。用Layout來比較。下面使用了位操作指令:&是按位與,<<是左移,>>是右移。
- MSB
MSB高位在前。
signal1:起始地址=7,值=Byte0<<8+Byte1。(Byte0是高位,Byte1是低位)
signal2:起始地址=23,值=(Byte2&0xf0)>>4。(取Byte2的高4位)
signal3:起始地址=19,值=(Byte2&0x0f)<<8+Byte3。(取Byte2的低4位,作為高位)
- LSB
LSB是低位在前。
signal1:起始地址=0,值=Byte0+Byte1<<8。(Byte0是低位,Byte1是高位)
signal2:起始地址=16,值=Byte2&0x0f。
signal3:起始地址=20,值=(Byte2&0xf0)>>4+Byte3<<4。(Byte2是低位,Byte3是高位)
2)物理值
物理值=原始值*Factor+Offset
3)代碼實現
以.NET(C#)為例,繪制layout,計算出數值。
(回復“DBC例子”獲取源代碼)
- MSB
- LSB
5.DBC開源資料
(回復“DBC開源”隨機獲取)