Bit_timing 波特率定義,必須部分,但通常為空nodes 定義網(wǎng)絡(luò)節(jié)點(diǎn)messages 定義消息和信號(hào)
2. 關(guān)鍵字
VERSION 版本
VERSION:
NS_ 為new symbol的縮寫,后面緊跟著一堆ns,一般是創(chuàng)建dbc時(shí)自動(dòng)生成,不用太關(guān)心
NS_:
BS_ 定義CAN網(wǎng)絡(luò)的波特率
BS_: [baudrate:BTR1,BTR2]
BU_ 網(wǎng)絡(luò)節(jié)點(diǎn)
BU_: Nodename1 Nodename2 Nodename3 ……
BO_ 報(bào)文
BO_: message_id message_name : message_size transmitter {signal}
SG_ 信號(hào)
SG_: signal_name multiplexer_indicator : start_bit | signal_size @ byte_order value_type ( factor , offset ) [ minimum | maximum ] unit receiver {, receiver}
CM_ 對報(bào)文/信號(hào)的注解
CM_: Object MessageId/NodeName “Comment”
BA_DEF_ 對報(bào)文/信號(hào)/節(jié)點(diǎn)等的屬性定義
BA_DEF: _ Object AttributeName ValueType Min Max;
BA_DEF_ DEF_ 對報(bào)文/信號(hào)/節(jié)點(diǎn)等的屬性初始值定義
BA_DEF_DEF_: AttributeName DefaultValue;
BA_ 對報(bào)文/信號(hào)/節(jié)點(diǎn)等的屬性設(shè)置值定義
BA_: AttributeName projectValue
VAL_ 數(shù)值表定義
VAL_: MessageId SignalName N “DefineN” …… 0 “Define0”
VAL_TABLE_ 全局信號(hào)值表,用來對信號(hào)值解碼
VAL_TABLE_: name value “value_description” …0 “value_description”
EV_ 環(huán)境變量
EV_:
3.本文出現(xiàn)的符號(hào)
‘ | ’ ——可選擇
‘ ; ’——結(jié)束定義
[。..]——內(nèi)容可選(0或1次)
{。..}——內(nèi)容重復(fù)(0或多次)
(。..)——注釋
unsigned_integer:無符號(hào)整型
signed_integer:有符號(hào)整型
double:雙精度小數(shù)
char_string:字符串
C_identifier:C語言變量命名
4. 波特率的結(jié)構(gòu)(BS_)
BS_: [baudrate:BTR1,BTR2];
其中BS_為關(guān)鍵字,用于定義CAN網(wǎng)絡(luò)的波特率;[ ]內(nèi)容表示為可選部分,可以省略(如下圖例子中即把該部分省略了);但關(guān)鍵字”BS_:”必須存在,省略則會(huì)出錯(cuò)?!禗BC File Format Document》規(guī)范中明確提醒,必須保留BS_: 標(biāo)簽。
5. 網(wǎng)絡(luò)節(jié)點(diǎn)的結(jié)構(gòu)(BU_)
BU_: Nodename1 Nodename2 Nodename3 ……
解釋:
BU_ 為關(guān)鍵字,表示網(wǎng)絡(luò)節(jié)點(diǎn)
Nodename1、Nodename2 網(wǎng)絡(luò)節(jié)點(diǎn)名字,由用戶自己定義;
注意事項(xiàng):需要保證節(jié)點(diǎn)命名的唯一性
如示例中的BU_: VCU_Vehicle_Control_Unit MotorCtrol SCU PC Vector__XXX :
表示定義了:
VCU_Vehicle_Control_Unit
MotorCtrol
SCU
PC
Vector__XXX這五個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)
其中:標(biāo)識(shí)為Vector__XXX時(shí)表示未指明具體節(jié)點(diǎn)
6. 消息的結(jié)構(gòu)(BO_)
BO_ message_id message_name : message_size transmitter {signal}
BO_ 306YRS2: 8 FVCM
解釋:
BO_ 為關(guān)鍵字,表示報(bào)文;
MessageId 報(bào)文ID,是以10進(jìn)制數(shù)表示的;
(如例子中的996,代表報(bào)文ID為0x3E4,是longlong類型,也就是CAN ID的值;)
MessageName 報(bào)文的名字,命名規(guī)則和C語言變量相同;
MessageSize 報(bào)文數(shù)據(jù)域字節(jié)數(shù),為無符號(hào)整型數(shù)據(jù),CAN 2.0為最大8字節(jié),CAN FD 最大64字節(jié);
Transmitter 該報(bào)文的網(wǎng)絡(luò)節(jié)點(diǎn);如果該報(bào)文沒有指定發(fā)送節(jié)點(diǎn),則該值需設(shè)置為” Vector__XXX”。
如示例中的BO_ 201959408 MSG1: 8 VCU_Vehicle_Control_Unit
報(bào)文ID:201959408(0xC09A7F0)
報(bào)文名:MSG1
分隔符 : “:”
報(bào)文長度:8字節(jié)
報(bào)文發(fā)送者:VCU_Vehicle_Control_Unit
(由VCU_Vehicle_Control_Unit這個(gè)節(jié)點(diǎn)發(fā)出的,數(shù)據(jù)域長度為8字節(jié),ID為201959408(0xC09A7F0),名字命名為MSG1的報(bào)文)
7. 信號(hào)的結(jié)構(gòu)(SG_)
SG_ signal_namemultiplexer_indicator : start_bit | signal_size @ byte_order value_type ( factor , offset ) [ minimum | maximum ] unit receiver {, receiver}
SG_ YRS2_Checksum : 7|8@0+ (1,0) [0|255] “bit” FRS
SG_ YRS_LongitSensorState : 15|2@0+ (1,0) [0|3] “bit” FRS
SG_ YRS_LongitAcce : 23|16@0+ (0.001,-2) [-2|2] “g” FRS
SG_ YRS_AliveCounter : 59|4@0+ (1,0) [0|15] “bit” FRS
解釋:
SG_ 為關(guān)鍵字,表示信號(hào);
SignalName(SigTypeDefinition) : 表示該信號(hào)的名字 和 多路選擇信號(hào)的定義;
SigTypeDefinition是可選項(xiàng),有3種格式:
a)空,表示普通信號(hào)。
b)M,表示多路選擇器信號(hào)。
c)m50,表示被多路選擇器選擇的信號(hào),50,表示當(dāng)M定義的信號(hào)的值等于50的時(shí)候,該報(bào)文使用此通路。
StartBit、 SignalSize 表示該信號(hào)起始位、信號(hào)長度;
ByteOrder 表示信號(hào)的字節(jié)順序:0代表Motorola格式,1代表Inter格式;
ValueType 表示該信號(hào)的數(shù)值類型:+表示無符號(hào)數(shù),-表示有符號(hào)數(shù);
Factor,Offset 表示因子,偏移量;這兩個(gè)值用于信號(hào)的原始值與物理值之間的轉(zhuǎn)換。
轉(zhuǎn)換如下:物理值=原始值*因子+偏移量;
Min|Max 表示該信號(hào)的最小值和最大值,即指定了該信號(hào)值的范圍;這兩個(gè)值為double類型;
Unit 表示該信號(hào)的物理單位,為字符串類型;
Receiver 表示該信號(hào)的接收節(jié)點(diǎn);若該信號(hào)沒有指定的接收節(jié)點(diǎn),則必須設(shè)置為” Vector__XXX”。
如示下面的例中:
第一個(gè)信號(hào) :
SG_ S_Check : 45|10@0+ (0.00625,0) [0|160] “M” EL3160_60,ESC
表示定義了一個(gè)命名為 S_Check的普通信號(hào),其起始位是第45位,信號(hào)長度10 bit;
信號(hào)是Motorola格式,數(shù)值類型為無符號(hào)類型數(shù);因子為0.00625,偏移量為0;信號(hào)取值范圍為0到160;
信號(hào)物理單位為字符串”M”;該信號(hào)接收節(jié)點(diǎn)為EL3160_60,ESC這兩個(gè)節(jié)點(diǎn)。
、
第二個(gè)信號(hào):
SG_ Send_Mux M : 7|8@0+ (1,0) [0|0] “” EL3160_60,ESC
表示定義了一個(gè)命名為 Send_Mux的多路選擇器信號(hào),其起始位是第7位,信號(hào)長度8 bit;
信號(hào)是Motorola格式,數(shù)值類型為無符號(hào)類型數(shù);因子為1,偏移量為0;信號(hào)取值范圍為0到0;
信號(hào)物理單位為字符串””;該信號(hào)接收節(jié)點(diǎn)為EL3160_60,ESC這兩個(gè)節(jié)點(diǎn)。
該信號(hào)做選擇通道使用。
第三個(gè)信號(hào):
SG_ S_Level_A_Voltage m50 : 15|16@0+ (0.00625,0) [0|160] “V” EL3160_60,ESC
表示定義了一個(gè)命名為S_Level_A_Voltage的被選擇信號(hào),其起始位是第15位,信號(hào)長度16 bit;
信號(hào)是Motorola格式,數(shù)值類型為無符號(hào)類型數(shù);因子為0.00625,偏移量為0;信號(hào)取值范圍為0到160;
信號(hào)物理單位為字符串”V”;該信號(hào)接收節(jié)點(diǎn)為EL3160_60,ESC這兩個(gè)節(jié)點(diǎn)。
其中byte_order分為motorola和intel兩種格式,motorola對應(yīng)0,intel對應(yīng)1。這兩種格式是區(qū)別如下:
如果在同一個(gè)字節(jié)內(nèi),則沒有區(qū)別,如果跨越多個(gè)字節(jié)則有區(qū)別,motorola格式是高位(msb)在低字節(jié)(說明:CAN消息的字節(jié)排列Byte0 Byte1 … Byte7,Byte0是低字節(jié)),intel格式是高位(msb)在高字節(jié)。
Intel格式
第一字節(jié)的bit0對應(yīng)的是lsb(第一行的紅色箭頭),第二字節(jié)的bit14對應(yīng)的是msb(第二行的紅色箭頭)。起始bit是lsb對應(yīng)的bit0。
Motorola格式
第二字節(jié)的bit9對應(yīng)的是lsb(第二行的紅色箭頭),第一字節(jié)的bit7對應(yīng)的是msb(第一行的紅色箭頭)。起始bit是lsb對應(yīng)的bit9。當(dāng)然也可以修改起始位置,例如將起始位置改為bit8,如下圖:
55~58行定義的是信號(hào)的選項(xiàng)值,其結(jié)構(gòu)如下:‘VAL_’ message_id signal_name { value_description } ‘;’
注意,行結(jié)尾有一個(gè)分號(hào)。其中value_description的定義如下:value_description = double char_string ;
以上是需要解析的部分,注意字符部分都限制在32字節(jié)內(nèi),不太方便。
8. 注解的結(jié)構(gòu)(CM_)
CM_ Object MessageId/NodeName “Comment”
解釋:
CM_ 為關(guān)鍵字,表示注解信息;
Object 表示進(jìn)行注解的對象類型,可以是節(jié)點(diǎn)“BU_”、報(bào)文“BO_”、消息”SG_”;
MessageId/NodeName 表示進(jìn)行注解的對象,若前面的對象類型是信號(hào)或者報(bào)文,則這里的值應(yīng)為報(bào)文的ID(10進(jìn)制數(shù)表示);若前面的對象類型為節(jié)點(diǎn),則這里的值應(yīng)為節(jié)點(diǎn)的名字;
Comment 表示進(jìn)行注解的文本信息;
如示例中的 CM_ SG_ 996 HUD_HeightLv “Control hud height level”;
表示對ID為996(0x3E4)這條報(bào)文下的名為”HUD_HeightLv ”的信號(hào)進(jìn)行注解說明,說明的內(nèi)容為“Control hud height level”。
又如 CM_ BU_ HUD “Head Up Display“;表示對HUD這個(gè)節(jié)點(diǎn)進(jìn)行注解說明,說明的內(nèi)容為” Head Up Display “。
注釋以 “” 包圍,注釋內(nèi)部不允許出現(xiàn)“號(hào)。
9. 特征(屬性)的結(jié)構(gòu)(BA_DEF_ BA_DEF_DEF_ BA_)
和特征相關(guān)的Tag一共有三條:
9.1 報(bào)文/信號(hào)/節(jié)點(diǎn)等的屬性定義(BA_DEF_)
特征名稱類型定義。格式如下:
BA_DEF_ ObjectAttributeNameValueTypeMin Max;
解釋:
BA_DEF 標(biāo)簽
Object 特征類型,可以是BU_(節(jié)點(diǎn)特征定義)、BO_(報(bào)文特征定義)、SG_(信號(hào)特征定義)、空格(項(xiàng)目特征定義);
AttributeName 特征名稱(C語言變量格式)
ValueType 特征值類型(只能是十進(jìn)制、十六進(jìn)制、浮點(diǎn)數(shù)、枚舉、字符5種類型)
Min Max 數(shù)值類型這里出現(xiàn)范圍,枚舉類型這里是枚舉值,字符類型,這里是空。
9.2 報(bào)文/信號(hào)/節(jié)點(diǎn)等的屬性初始值定義(BA_DEF_DEF_) 特征默認(rèn)值定義。格式如下:
BA_DEF_DEF_ AttributeNameDefaultValue;
解釋:
BA_DEF_DEF_ 標(biāo)簽
AttributeName 特征名稱(C語言變量格式)
DefaultValue 該特征的默認(rèn)設(shè)置值
9.3 報(bào)文/信號(hào)/節(jié)點(diǎn)等的屬性設(shè)置值定義(BA_)特征項(xiàng)目設(shè)置值定義,格式如下:
BA_ AttributeName projectValue;
解釋:
BA_ 標(biāo)簽
AttributeName 特征名稱(C語言變量格式)
projectValue 該特征的設(shè)置值
舉例:
BA_DEF_ BO_ “GenMsgCycleTime” INT 0 65535;
BA_DEF_DEF_ “GenMsgCycleTime” 2200;
BA_ “GenMsgCycleTime” BO_ 400 100;
表示對定義了一個(gè)針對消息類型的特征,特征名為”GenMsgCycleTime”,特征值是整型數(shù)據(jù),取值范圍在0到65535之間;
默認(rèn)值為2200;
項(xiàng)目設(shè)置值 CAN ID ==400的消息的該特征值設(shè)置為100
在DBCView4.3里面是把BA_DEF_ 和 BA_DEF_DEF_合并在一起了,用了特征視圖來管理,如下圖。
然后把 特征項(xiàng)目設(shè)置值定義 BA_ AttributeName projectValue; 和元素合并在一起了。
10. 數(shù)值表的結(jié)構(gòu)(VAL_)格式如下:
VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;
解釋:
VAL_ 為關(guān)鍵字,表示數(shù)值表定義;
MessageId 表示該信號(hào)所屬的報(bào)文ID(10進(jìn)制數(shù)表示);
SignalName 表示信號(hào)名;
N “DefineN” …… 0 “Define0” 表示定義的數(shù)值表內(nèi)容,即該信號(hào)的有效值分別用什么符號(hào)表示 。
如示例中的 VAL_ 996 HUD_OffSt 1 “Active” 0 “Not Active”;
表示對ID為996(0x3E4)的這條報(bào)文下的,一個(gè)命名為”HUD_OffSt”的信號(hào),進(jìn)行其數(shù)值表的定義;
用”Active”取代1;用”Not Active”取代0。只有自然數(shù)類型的信號(hào)才可以使用數(shù)值表表示。
信號(hào)的值的表示方法有兩種:
1) 物理值=原始值*因子+偏移量;(常規(guī)表示,前面有提到)
2) 數(shù)字表,用來表示邏輯值;
11. 全局信號(hào)值表(用來對信號(hào)值解碼)的結(jié)構(gòu)(VAL_TABLE_) 格式如下:
VAL_TABLE_ value_table_namevalue_table_value “value_description” … 0 “value_description”;
描述:
a)一個(gè)value table中以“空格”分隔;
b)value_table_name表示value table的名稱, 命名必須滿足“符號(hào)字符串”要求;
c) value_table_value表示value table的值,十進(jìn)制表示;
d) value_description表示value table的值描述;
e)當(dāng)一個(gè)value table存在多個(gè)值描述時(shí),以(value_table_value “value_description”)的形式接著追加,value table內(nèi)的兩個(gè)值描述以“空格”分隔;
f)完成一個(gè)value table定義,需以“分號(hào);”結(jié)尾;
g)多個(gè)value table需要換行。
VAL_TABLE_ ESC_QDCFRS 1 ”ERROR“ 0 ”NO_ERROR“ ;
VAL_TABLE_ ESC_BrakeTempTooHigh 1 ”ABNORMAL“ 0 ”NORMAL“ ;
VAL_TABLE_ ESC_DTC_Active 1 ”ACTIVE“ 0 ”INACTIVE“ ;
VAL_TABLE_ ESC_Vehiclestandstill 3 ”RESERVED“ 2 ”INVALID“ 1 ”STANDSTILL“ 0 ”NOT_STANDSTILL“ ;
審核編輯:黃飛
-
DBC
+關(guān)注
關(guān)注
2文章
55瀏覽量
7768
原文標(biāo)題:DBC的結(jié)構(gòu)詳細(xì)分析
文章出處:【微信號(hào):eng2mot,微信公眾號(hào):汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論