DBC文件源碼解析

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的結構,讓新建、修改、解析變得更加便捷,也能夠讓我們更直觀找到我們想要的信息並進行拷貝,總之作爲一個程序員更願意看到源碼信息,這能省去不少的麻煩,讓一切操作更加容易。

本文借鑑鏈接,請戳這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章