【DBC專題】-5-DBC文件格式解析

目錄

0 DBC文件中“符號字符串”命名要求

1 DBC文件的標頭

2 Bit Timing波特率定義

3 Node節點定義

4 Value Table值表定義

5 Message消息定義

5.1 標準幀Message定義舉例

5.2 擴展幀Message定義舉例

6 Signal信號定義

7 Value Table指標的綁定Signal信號

8 Comment註釋定義

8.1 Node節點的註釋舉例

8.2 Message消息的註釋舉例

8.3 Signal信號的註釋舉例

9 User Defined Attribute用戶定義的屬性定義

9.1 Attribute屬性定義

9.2 Attribute屬性值

10 本文使用的DBC文件內容附錄

11 結尾


關鍵字:

DBC:CANdb network file (Data Base for CAN)

描述CAN網絡所需的所有信息都存儲在CANdb network file中。CANdb network file的文件擴展名爲DBC,可以使用CANdb編輯器(CAN數據庫編輯器)或CANdb ++編輯器創建。

 

推薦閱讀(單擊下方文字即可跳轉至對應博文):

1、【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC

2、【DBC專題】-2-CAN Signal信號的Multiplexor多路複用在DBC中實現

3、【DBC專題】-3-利用CANdb++ Editor在DBC文件添加幀CAN_ID和信號CAN_Signal

4、【DBC專題】-4-DBC文件中的Signal信號字節順序Motorola和Intel介紹

 

通過前兩個【DBC專題】中,我們已經掌握了DBC的創建和製作。在一些高階應用(如DBCExcelDBCXMLDBCARXML等等)中,瞭解這些顯然是不夠的,需要熟知其文件格式,畢竟“CANdb++ Editor”是參照某個標準,生成DBC文件的一個工具而已。

 

DBC文件描述單個CAN網絡的通信。完成“【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC”一文中的第2章節,我們會得到一個Classic CAN的數據庫DBC文件空模板(見下圖左側);完成第9章節,我們會得到一個較爲完成DBC文件(見下圖右側),二者的差異下圖。

 

一眼看去感覺有點“蒙”,下面我們就逐一來介紹這些“關鍵字”。

 

0 DBC文件中“符號字符串”命名要求

 

DBC文件中除了固定格式的關鍵字外,還有一些用戶自定義的“符號字符串”,像Node,Message,Signal…的命名,其要求爲:

  • 以字母字符或下劃線開頭,並且可能進一步由字母數字字符和下劃線組成
  • 長度最多爲128個字符。爲了與較舊的工具兼容,長度不得超過32個字符。

 

1 DBC文件的標頭

 

關鍵字VERSION

關鍵字NS_   ,全稱:new symbols

 

描述:

DBC文件包含帶有版本(關鍵字VERSION)和新符號條目(關鍵字NS_)的標頭。關鍵字VERSION後面的雙引號中通常是空的,或者是CANdb++編輯器使用的字符串。

 

該部分基本是固定的。

 

2 Bit Timing波特率定義

 

關鍵字BS_

 

Bit Timing定義了網絡的波特率和BTR寄存器的設置。該部分已過時,不再使用。但是,關鍵字“BS_”必須出現在DBC文件中。

 

舉例:

BS_:

 

3 Node節點定義

 

關鍵字BU_

 

格式:

BU_: node_1_name node_2_name…

 

描述:

a)CAN網絡匯中所有節點的名稱在此處定義,且定義的名稱必須唯一;

b)節點與節點之間以“空格”分隔;

c)節點的命名必須滿足“符號字符串”要求。

 

舉例:

在“【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC”一文的第3章節我們定義兩個節點:VCU和OBD,其在DBC文件中的描述爲:

BU_: VCU OBD

 

4 Value Table值表定義

 

關鍵字VAL_TABLE_

 

格式:

VAL_TABLE_ value_table_name value_table_value “value_description” …0 “value_description”;

 

描述:

a)一個value table中以“空格”分隔;

b)value_table_name表示value table的名稱, 命名必須滿足“符號字符串”要求;

c) value_table_value表示value table的值,十進制表示;

d) value_description表示value table的值描述;

e)當一個value table存在多個值描述時,以(value_table_value “value_description”)的形式接着追加,value table內的兩個值描述以“空格”分隔;

f)完成一個value table定義,需以“分號;”結尾;

g)多個value table需要換行。

 

舉例:

在“【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC”一文的第7章節我們定義兩個value table:Voltage_state和OBD_status_description,其在DBC文件中的描述爲:

VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ;

VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;

 

5 Message消息定義

 

關鍵字BO_

 

格式

BO_ message_id message_name: message_size transmitter

 

描述:

a)message_id表示CAN_ID,以十進制表示。在DBC文件中,CAN-ID必須唯一。如果CAN_ID的類型是“CAN Extended”,則在DBC文件中表示是“0x8000 0000 + 十六進制CAN_ID”的十進制轉換;

b)message_name表示CAN_ID的消息名稱,在在Message中必須是唯一, 命名必須滿足“符號字符串”要求;

c) “: ” 冒號不能少;

d)message_size表示Message消息的長度,以字節爲單位,十進制表示;

e)transmitter表示該Message的發送節點, 如果Message沒有定義發送節點,則必須在此處輸入字符串“Vector__XXX”;

 

5.1 標準幀Message定義舉例

 

在“【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC”一文的第4章節我們定義一個Message:Test_ID_211,其在DBC文件中的描述爲:

BO_ 530 Test_ID_212: 8 OBD

 

 

5.2 擴展幀Message定義舉例

 

與4.1章節的差異是Type中選擇了CAN Extended,注意在DBC文件中CAN_ID描述:

 

BO_ 2147484177 Test_ID_211: 8 OBD

 

 

6 Signal信號定義

 

關鍵字SG_

 

格式

SG_ signal_name multiplexer_indicator : start_bit|signal_size@byte_order+value_type (factor,offset) [minimum|maximum] “unit” receiver

 

描述:

a) signal_name表示信號的名稱。一個Message消息中的信號名稱必須唯一。多個Message消息之間可以存在相同名稱信號。命名必須滿足“符號字符串”要求;

b) multiplexer_indicator含義:

  1. “ M”(大寫)將信號定義爲Multiplexor Signal。一個消息中只有一個信號可以是Multiplexor Signal;
  2. “m”(小寫)後跟無符號整數,將信號定義爲Multiplexed Signal;
  3. “空格”將信號定義爲普通的Signal,表示沒有複用。

c)“:”冒號不能少;

d)start_bit值指定信號在幀的數據域內的位置:Intel(小端)模式這裏表示信號的LSB;Motorola(大端)模式這裏表示信號的MSB;

e)signal_size表示信號的長度,以位爲單位,十進制表示;

f)“@”不能少;

g)byte_order表示字節順序。如果信號的字節順序爲Intel(小端),則byte_order爲1;如果字節順序爲Motorola(大端),則byte_order爲0;

h)value_type表示值類型。“+”表示無符號;“-”表示有符號;

i)(factor,offset)表示分辨率(不能爲0)和偏移量,這兩個值於該信號的原始值與物理值之間的轉換。轉換如下:物理值=原始值* factor + offset;

j)[minimum|maximum]表示最小值和最大值,定義了信號的有效物理值的範圍;

k) unit表示信號的單位,爲字符串類型;

l) receiver表示信號的接收方,信號的接收方可以是多個節點,接收方節點名稱必須在關鍵字BU_中定義。如果信號沒有定義接收方,則必須在此處輸入字符串“Vector__XXX”。

 

舉例:

在“【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC”一文的第6章節我們定義三個信號:OBD_status、Current_value和Voltage_value,其在DBC文件中的描述爲:

 

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  VCU

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  VCU

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 

其在第5章生成的DBC文件效果如下:

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-" Vector__XXX

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A" Vector__XXX

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V" Vector__XXX

 

以第6章爲基礎,拓展一下,新定義一個DCDC節點,同時DCDC也接收者三個信號:OBD_status、Current_value和Voltage_value,其在DBC文件效果如下:當信號被多個節點接收時,在DBC中的描述,節點與節點之間用“逗號,”隔開。

BU_: DCDC VCU OBD

 

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  DCDC,VCU

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  DCDC,VCU

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  DCDC,VCU

 

在“【DBC專題】-2-CAN Signal信號的Multiplexor多路複用在DBC中實現”多路複用信號在DBC文件中的描述如下:

VAL_TABLE_ Package_Num_Value 1 "No.2" 0 "N0.1" ;

 

BO_ 530 Test_ID_212: 8 OBD

 SG_ Voltage_6_Value m1 : 55|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_5_Value m1 : 39|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_4_Value m1 : 23|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_3_Value m0 : 55|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_2_Value m0 : 39|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_1_Value m0 : 23|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Package_Num M : 7|8@0+ (1,0) [0|1] "-"  VCU

 

7 Value Table指標的綁定Signal信號

 

關鍵字VAL_

 

格式:

VAL_ message_id signal_name  value_table_value “value_description” …… 0 “value_description”;

 

描述:

a) message_id同Message中的關鍵字描述;

b) signal_name同Signal中的關鍵字描述;

c) value_table_value “value_description” …… 0 “value_description”同Value Table中的關鍵字描述。

d)完成一個value table與信號綁定,需以“分號;”結尾;

f)多個value table與信號綁定需要換行。

 

舉例:

在“【DBC專題】-1-如何使用CANdb++ Editor創建並製作一個DBC”一文的第8章節我們將Value Table綁定了信號,其在DBC文件中的描述爲:

 

VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ;

VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;

 

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  VCU

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  VCU

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 

VAL_ 529 OBD_status 2 "Shutdown" 1 "Run" 0 "Initialization" ;

VAL_ 529 Voltage_value 65535 "Invalid voltage" ;

8 Comment註釋定義

 

關鍵字CM_

 

8.1 Node節點的註釋舉例

 

格式:

CM_ BU_ node_name “Comment”;

 

舉例

CM_ BU_ VCU "VCU node in can network";

CM_ BU_ OBD "OBD node in CAN network";

 

 

 

8.2 Message消息的註釋舉例

 

格式:

CM_ BO_ message_id “Comment”;

 

舉例

CM_ BO_ 529 "The CAN_ID of the test message is 0x211.";

 

 

8.3 Signal信號的註釋舉例

 

格式:

CM_ SG_ message_id signal_name “Comment”;

 

舉例

CM_ SG_ 529 OBD_status "OBD working status signal";

CM_ SG_ 529 Current_value "OBD current signal.";

CM_ SG_ 529 Voltage_value "OBD voltage signal.";

 

9 User Defined Attribute用戶定義的屬性定義

 

User defined attributes是擴展DBC文件的對象屬性的一種方法。這些附加屬性必須使用具有屬性默認值的屬性定義來定義。對於具有爲屬性定義的值的每個對象,必須定義一個屬性值。 如果未對對象定義屬性值,則該對象的屬性值爲該屬性的默認值。

 

9.1 Attribute屬性定義

 

關鍵字BA_DEF_

關鍵字BA_DEF_DEF_

 

格式

BA_DEF_ object_type “attribute_name”attribute_value_type ;

BA_DEF_DEF_ attribute_name attribute_value ;

 

描述:

a) object_type表示BU_、BO_、SG_、EV_等關鍵字;

b) attribute_name表示屬性的名稱,一般比較固定,參照相應的標準;

c) attribute_value_type表示INT、FLOAT、STRING、ENUM、HEX等類型,各自的表示發如下:

  1. INT signed_integer signed_integer;
  2. HEX signed_integer signed_integer;
  3. FLOAT double double;
  4. STRING ;
  5. ENUM “char_1_string ”, “char_2_string”, “char_3_string”;

d) attribute_name同b);

e) attribute_value表示unsigned_integer 、 signed_integer、double |char_string

f)完成一個Attribute,需以“分號;”結尾;

g)多個Attribute與信號綁定需要換行。

 

舉例:

BA_DEF_ SG_  "ProjectSignalRequirementNb" STRING ;

BA_DEF_ SG_  "GenSigStartValue" HEX 0 0;

BA_DEF_ SG_  "GenericSignalRequirementNb" STRING ;

BA_DEF_  "Manufacturer" STRING ;

BA_DEF_ BO_  "ProjectFrameRequirementNb" STRING ;

BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cyclic","OnEvent","Cyclic_And_OnEvent";

BA_DEF_ BO_  "GenMsgCycleTime" INT 0 65535;

BA_DEF_ BO_  "GenericFrameRequirementNb" STRING ;

BA_DEF_DEF_  "ProjectSignalRequirementNb" "";

BA_DEF_DEF_  "GenSigStartValue" 0;

BA_DEF_DEF_  "GenericSignalRequirementNb" "";

BA_DEF_DEF_  "Manufacturer" "BMW";

BA_DEF_DEF_  "ProjectFrameRequirementNb" "";

BA_DEF_DEF_  "GenMsgSendType" "Cyclic";

BA_DEF_DEF_  "GenMsgCycleTime" 0;

BA_DEF_DEF_  "GenericFrameRequirementNb" "";

 

9.2 Attribute屬性值

 

關鍵字BA_

 

格式

BA_ attribute_name BU_ node_name attribute_value;

BA_ attribute_name BO_ message_id attribute_value;

BA_ attribute_name SG_ message_id signal_name attribute_value;

BA_ attribute_name EV_ env_var_name attribute_value;

 

舉例

BA_ "GenMsgSendType" BO_ 530 2;

BA_ "GenMsgCycleTime" BO_ 530 1000;

BA_ "GenMsgSendType" BO_ 529 1;

BA_ "GenMsgCycleTime" BO_ 529 100;

BA_ "GenSigStartValue" SG_ 530 Voltage_6_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_5_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_4_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_3_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_2_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_1_Value 3000;

BA_ "GenSigStartValue" SG_ 529 OBD_status 2;

BA_ "GenSigStartValue" SG_ 529 Current_value 0;

BA_ "GenSigStartValue" SG_ 529 Voltage_value 768;

 

10 本文使用的DBC文件內容附錄

VERSION ""


NS_ : 
	NS_DESC_
	CM_
	BA_DEF_
	BA_
	VAL_
	CAT_DEF_
	CAT_
	FILTER
	BA_DEF_DEF_
	EV_DATA_
	ENVVAR_DATA_
	SGTYPE_
	SGTYPE_VAL_
	BA_DEF_SGTYPE_
	BA_SGTYPE_
	SIG_TYPE_REF_
	VAL_TABLE_
	SIG_GROUP_
	SIG_VALTYPE_
	SIGTYPE_VALTYPE_
	BO_TX_BU_
	BA_DEF_REL_
	BA_REL_
	BA_DEF_DEF_REL_
	BU_SG_REL_
	BU_EV_REL_
	BU_BO_REL_
	SG_MUL_VAL_

BS_:

BU_: DCDC VCU OBD
VAL_TABLE_ Package_Num_Value 1 "No.2" 0 "N0.1" ;
VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ;
VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;


BO_ 530 Test_ID_212: 8 OBD
 SG_ Voltage_6_Value m1 : 55|16@0+ (0.1,0) [0|6553.5] "V"  VCU
 SG_ Voltage_5_Value m1 : 39|16@0+ (0.1,0) [0|6553.5] "V"  VCU
 SG_ Voltage_4_Value m1 : 23|16@0+ (0.1,0) [0|6553.5] "V"  VCU
 SG_ Voltage_3_Value m0 : 55|16@0+ (0.1,0) [0|6553.5] "V"  VCU
 SG_ Voltage_2_Value m0 : 39|16@0+ (0.1,0) [0|6553.5] "V"  VCU
 SG_ Voltage_1_Value m0 : 23|16@0+ (0.1,0) [0|6553.5] "V"  VCU
 SG_ Package_Num M : 7|8@0+ (1,0) [0|1] "-"  VCU

BO_ 529 Test_ID_211: 8 OBD
 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  DCDC,VCU
 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  DCDC,VCU
 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  DCDC,VCU



CM_ BU_ DCDC "DCDC node in CAN network";
CM_ BU_ VCU "VCU node in can network";
CM_ BU_ OBD "OBD node in CAN network";
CM_ BO_ 530 "The CAN_ID of the test message is 0x212.";
CM_ SG_ 530 Voltage_6_Value "Value of Voltage_6.";
CM_ SG_ 530 Voltage_5_Value "Value of Voltage_5.";
CM_ SG_ 530 Voltage_4_Value "Value of Voltage_4.";
CM_ SG_ 530 Voltage_3_Value "Value of Voltage_3.";
CM_ SG_ 530 Voltage_2_Value "Value of Voltage_2.";
CM_ SG_ 530 Voltage_1_Value "Value of Voltage_1.";
CM_ SG_ 530 Package_Num "Number of Voltage.";
CM_ BO_ 529 "The CAN_ID of the test message is 0x211.";
CM_ SG_ 529 OBD_status "OBD working status signal.";
CM_ SG_ 529 Current_value "OBD current signal.";
CM_ SG_ 529 Voltage_value "OBD voltage signal.";
BA_DEF_ SG_  "ProjectSignalRequirementNb" STRING ;
BA_DEF_ SG_  "GenSigStartValue" HEX 0 0;
BA_DEF_ SG_  "GenericSignalRequirementNb" STRING ;
BA_DEF_  "Manufacturer" STRING ;
BA_DEF_ BO_  "ProjectFrameRequirementNb" STRING ;
BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cyclic","OnEvent","Cyclic_And_OnEvent";
BA_DEF_ BO_  "GenMsgCycleTime" INT 0 65535;
BA_DEF_ BO_  "GenericFrameRequirementNb" STRING ;
BA_DEF_  "BusType" STRING ;
BA_DEF_DEF_  "ProjectSignalRequirementNb" "";
BA_DEF_DEF_  "GenSigStartValue" 0;
BA_DEF_DEF_  "GenericSignalRequirementNb" "";
BA_DEF_DEF_  "Manufacturer" "BMW";
BA_DEF_DEF_  "ProjectFrameRequirementNb" "";
BA_DEF_DEF_  "GenMsgSendType" "Cyclic";
BA_DEF_DEF_  "GenMsgCycleTime" 0;
BA_DEF_DEF_  "GenericFrameRequirementNb" "";
BA_DEF_DEF_  "BusType" "CAN";
BA_ "GenMsgSendType" BO_ 530 2;
BA_ "GenMsgCycleTime" BO_ 530 1000;
BA_ "GenMsgSendType" BO_ 529 1;
BA_ "GenMsgCycleTime" BO_ 529 100;
BA_ "GenSigStartValue" SG_ 530 Voltage_6_Value 3000;
BA_ "GenSigStartValue" SG_ 530 Voltage_5_Value 3000;
BA_ "GenSigStartValue" SG_ 530 Voltage_4_Value 3000;
BA_ "GenSigStartValue" SG_ 530 Voltage_3_Value 3000;
BA_ "GenSigStartValue" SG_ 530 Voltage_2_Value 3000;
BA_ "GenSigStartValue" SG_ 530 Voltage_1_Value 3000;
BA_ "GenSigStartValue" SG_ 529 OBD_status 2;
BA_ "GenSigStartValue" SG_ 529 Current_value 0;
BA_ "GenSigStartValue" SG_ 529 Voltage_value 768;
VAL_ 530 Package_Num 1 "No.2" 0 "N0.1" ;
VAL_ 529 OBD_status 2 "Shutdown" 1 "Run" 0 "Initialization" ;
VAL_ 529 Voltage_value 65535 "Invalid voltage" ;

 

11 結尾

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