DBC文件源碼解析
DBC(data base CAN)文件是由德國Victor公司發佈的,它被用來描述單一CAN網絡中各邏輯節點信息,依據該文件可以開發出來監視和分析CAN網絡中所有邏輯節點的運行狀態。DBC是一種文件格式,.dbc文件是一個ASCII格式的文件,其.dbc擴展名可用於定義CAN網絡。DBC由一系列的Message和Signal組成,文件定義了Message和Signal的屬性。簡單來說,DBC是汽車ECU間進行CAN通訊的報文內容,有了它相互之間才能聽懂。
上面提到,.dbc文件是一個ASCII格式的文件,所以很多時候,我們爲了修改更方便通常會選擇打開源碼來進行編輯,也有時候我們需要將它解析出來我們想要的東西,這個時候就需要我們來了解源碼的定義。一般dbc文件中包含了如下的8種信息:版本與新符號、波特率定義、網絡節點的定義、報文幀的定義、信號的定義、註解部分、屬性定義部分、數值表部分。接下來,我們將進行對源碼的一些基本的定義做一些簡單的介紹。
1、版本與新符號
- 版本號以VERSION開頭,引號裏面可以自己寫自己想定義的版本號。
- NS即new symbol,創建時自動生成。
2、波特率定義(必須項)
- 波特率格式 BS_:[baudrate:BTR1,BTR2]; 其中BS爲關鍵字,用於定義CAN網絡的波特率;[ ]內容表示爲可選部分,可以省略;但關鍵字”BS:”必須存在,省略則會出錯。
3、網絡節點的定義(必須項)
- 網絡節點格式如下:BU_:name1 ame2 name3 ……。其中BU爲關鍵字,表示網絡節點,格式中的name1、name2表示定義的網絡節點名字,由用戶自己定義,中間用空格分開,且節點名不能重複。
- 如圖所示的BU_: ECU TCM ;表示定義了ECU、TCM這兩個網絡節點。
4、報文幀的定義
- 報文幀格式:BO_ Message_id(10進制數表示) Message_name: Message_size Transmitter
(1)BO爲關鍵字,表示報文;
(2)Message_id爲定義的報文ID,是以10進制數表示的;
(3)Message_name表示該報文的名字,命名規則和C語言變量相同;
(4)Message_size 表示該報文數據域字節數,爲無符號整型數據;
(5)Transmitter表示發送該報文的網絡節點;如果該報文沒有指定發送節點,則該值需設置爲” Vector__XXX”。 - 如圖所示的BO_ 161 ADAS_01: 8 ECU ;表示定義了一條由ECU這個節點發送,數據域長度爲8字節,ID爲161(0xA1),名字命名爲ADAS_01的報文。
5、信號的定義
- 信號格式:
SG_ Signal_name : Start_bit|Signal_size@Byte_order Value_type (Factor,Offset) [Min|Max] Unit Receiver
(1)SG爲關鍵字,表示信號;
(2)Signal_name、 Start_bit、 Signal_size分別表示該信號的名字、起始位、信號長度;
(3)Byte_order表示信號的字節順序:0代表Motorola格式,1代表Inter格式;
(4)Value_type 表示該信號的數值類型:+表示無符號數,-表示有符號數;
(5)Factor表示因子,Offset表示偏移量;這兩個值於該信號的原始值與物理值之間的轉換。
轉換如下:物理值=原始值*因子+偏移量;
(6)Min|Max表示該信號的最小值和最大值,即指定了該信號值的範圍;這兩個值爲double類型;
(7)Unit表示該信號的單位,爲字符串類型;
(8)Receiver表示該信號的接收節點;若該信號沒有指定的接收節點,則必須設置爲” Vector__XXX”。 - 如圖所示的SG_ Spd : 47|15@0+ (0.015625,0) [0|511.984375] "km/h"TCM ;表示定義了一個命名爲Spd的信號,其起始位是第47位,信號長度15個位;信號是Motorola格式,數值類型爲無符號類型數;因子爲0.015625,偏移量爲0;信號取值範圍爲0到511.984375;信號單位爲字符串”km/h”;該信號接收節點爲TCM這個節點。
6、註解部分
- 註解格式CM_ Object Message_id/Node_name “Comment”
(1)CM爲關鍵字,表示註解信息;
(2)Object表示進行註解的對象類型,可以是節點“BU_”、報文“BO_”、消息”SG_”;
(3)Message_id/Node_name 表示進行註解的對象,若前面的對象類型是信號或者報文,則這裏的值應爲報文的ID(10進制數表示);若前面的對象類型爲節點,則這裏的值應爲節點的名字;
(4)Comment表示進行註解的文本信息; - 如圖所示的 CM_ SG_ 161 Spd “車速” ;表示對ID爲161(0xA1)這條報文下的名爲”Spd”的信號進行註解說明,說明的內容爲"車速"。
- 某些時候我們也會看到對節點、報文進行註解,格式不變,只是類型不同(“BU_”、報文“BO_”、消息”SG_”),具體情況根據具體判斷。
7、屬性定義部分
-
屬性定義格式:
BA_DEF_ Object Attribute_name Value_type Min Max;
BA_DEF_DEF_ Attribute_name Default_value;
(1)BA_DEF爲關鍵字,表示屬性定義;
(2)Object表示屬性定義的對象類型,可以是節點“BU_”、報文“BO_”、消息”SG_”、網絡節點” ”(用空格表示)等;
(3)Attribute_name 表示進行定義的屬性名字;
(4)Value_type 表示屬性值的類型,可以是整型、字符串、浮點型、枚舉類型等;
(5)Min/Max表示屬性值的上下最值,即指定了取值範圍(字符串類型沒有此項)。
(6)BA_DEF_DEF爲關鍵字,表示定義屬性的初始值;
(7)Default_value表示該屬性的初始值。 -
如圖所示的
BA_DEF_ BO_ “GenMsgStartDelayTime” INT 0 0;
BA_DEF_ “BusType” STRING ;
表示對定義了一個針對信號類型的屬性,屬性名爲”MyTry”,屬性值是整型數據,取值範圍在0到0之間,初始值爲0。
8、數值表部分
- 格式如下:VAL_ Message_id Signal_name N “xxx” N-1 “xxx”… 0 “xxx”;
(1)VAL爲關鍵字,表示數值表定義;
(2)Message_id表示該信號所屬的報文ID(10進制數表示);
(3)Signal_name表示信號名;
(4)N “xxx” N-1 “xxx”… 0 “xxx”表示N數值代表xxx,N-1數值代表xxx,0數值代表xxx。
- 如示例中的VAL_ 161 BrStat 1 " 非制動" 0 " 制動" ;表示對ID爲161(0xA1)的這條報文下的,一個命名爲”BrStat ”的信號,進行其數值表的定義; 0代表" 制動" ;1代表" 非制動"。
9、關鍵字對應含義
關鍵字 | 關鍵字含義 |
---|---|
VERSION | 版本號 |
NS | 新符號 |
BS | CAN網絡的波特率 |
BU | 網絡節點 |
BO | 報文 |
SG | 信號 |
CM | 註解信息 |
BA_DEF | 屬性定義 |
BA_DEF_DEF | 定義屬性的初始值 |
VAL | 數值表 |
瞭解了DBC的一些關鍵字,有助於我們能夠快速地分析DBC的結構,讓新建、修改、解析變得更加便捷,也能夠讓我們更直觀找到我們想要的信息並進行拷貝,總之作爲一個程序員更願意看到源碼信息,這能省去不少的麻煩,讓一切操作更加容易。