DBC是vector公司定义的can网络通信文件格式,vector的规范《DBC File Format Document》从下面链接获得
百度网盘:https://pan.baidu.com/s/1GUvfEHv1NQbJ2bL2e7ZL5w
提取码:d622
DBC文件是以Tag(标签)来标识每一个元素。
格式如下:
BS_:[baudrate:BTR1,BTR2];
其中BS_为关键字,用于定义CAN网络的波特率;[ ]内容表示为可选部分,可以省略(如下图例子中即把该部分省略了);
但关键字”BS_:”必须存在,省略则会出错。《DBC File Format Document》规范中明确提醒,必须保留BS_: 标签。
格式如下:
BU_:Nodename1 Nodename2 Nodename3 ……
其中BU_为关键字,表示网络节点,格式中的Nodename1、Nodename2表示定义的网络节点名字,由用户自己定义;但需保证节点命名的唯一性
如示例中的BU_: VCU_Vehicle_Control_Unit MotorCtrol SCU PC Vector__XXX :
表示定义了:
VCU_Vehicle_Control_Unit
MotorCtrol
SCU
PC
Vector__XXX这五个网络节点
格式如下:
BO_ MessageId(10进制数表示) MessageName: MessageSize Transmitter
(1)、BO_为关键字,表示报文;
(2)、MessageId为定义的报文ID,是以10进制数表示的;如例子中的996,代表报文ID为0x3E4,是longlong类型,也就是CAN ID的值;
(3)、MessageName表示该报文的名字,命名规则和C语言变量相同;
(4)、MessageSize表示该报文数据域字节数,为无符号整型数据,CAN 2.0为最大8字节,CAN FD 最大64字节;
(5)、Transmitter表示发送该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”。
如示例中的BO_ 201959408 MSG1: 8 VCU_Vehicle_Control_Unit -->表示定义了一条由VCU_Vehicle_Control_Unit这个节点发送,数据域长度为8字节,ID为201959408(0xC09A7F0),名字命名为MSG1的报文
格式如下:
SG_ SignalName (SigTypeDefinition) : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver
(1)、SG_为关键字,表示信号;
(2)、SignalName(SigTypeDefinition) :表示该信号的名字 和 多路选择信号的定义;
(2.1) MuxSigDefinition 是可选项,有3种格式:
a)空,表示普通信号。
b)M,表示多路选择器信号。
c)m50,表示被多路选择器选择的信号,50,表示当M定义的信号的值等于50的时候,该报文使用此通路。
(3)、StartBit、 SignalSize表示该信号起始位、信号长度;
(4)、ByteOrder表示信号的字节顺序:0代表Motorola格式,1代表Inter格式;
(5)、 ValueType 表示该信号的数值类型:+表示无符号数,-表示有符号数;
(6)、Factor表示因子,Offset表示偏移量;这两个值于该信号的原始值与物理值之间的转换。
转换如下:物理值=原始值*因子+偏移量;
(7)、Min|Max表示该信号的最小值和最大值,即指定了该信号值的范围;这两个值为double类型;
(8)、Unit表示该信号的物理单位,为字符串类型;
(9)、Receiver表示该信号的接收节点;若该信号没有指定的接收节点,则必须设置为” Vector__XXX”。
如示下面的例中:
第一个信号 SG_ S_Check : 45|10@0+ (0.00625,0) [0|160] “M” EL3160_60,ESC
表示定义了一个命名为 S_Check的普通信号,其起始位是第45位,信号长度10 bit;
信号是Motorola格式,数值类型为无符号类型数;因子为0.00625,偏移量为0;信号取值范围为0到160;
信号物理单位为字符串”M”;该信号接收节点为EL3160_60,ESC这两个节点。
、
第二个信号SG_ Send_Mux M : 7|8@0+ (1,0) [0|0] “” EL3160_60,ESC
表示定义了一个命名为 Send_Mux的多路选择器信号,其起始位是第7位,信号长度8 bit;
信号是Motorola格式,数值类型为无符号类型数;因子为1,偏移量为0;信号取值范围为0到0;
信号物理单位为字符串””;该信号接收节点为EL3160_60,ESC这两个节点。
该信号做选择通道使用。
、
第三个信号SG_ S_Level_A_Voltage m50 : 15|16@0+ (0.00625,0) [0|160] “V” EL3160_60,ESC
表示定义了一个命名为S_Level_A_Voltage的被选择信号,其起始位是第15位,信号长度16 bit;
信号是Motorola格式,数值类型为无符号类型数;因子为0.00625,偏移量为0;信号取值范围为0到160;
信号物理单位为字符串”V”;该信号接收节点为EL3160_60,ESC这两个节点。
Send_Mux 作为选择通路使用,这个例子中,当Send_Mux 等于50、51、52、54时,代表后面的选择的通路。
DBCView的下载地址:
百度网盘:https://pan.baidu.com/s/1IePGXv9K_rloG6ewgbwEYQ
提取码:qq62
格式如下:
CM_ Object MessageId/NodeName “Comment”
(1)、 CM_为关键字,表示注解信息;
(2)、 Object表示进行注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”;
(3)、 MessageId/NodeName 表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);若前面的对象类型为节点,则这里的值应为节点的名字;
(4)、 Comment表示进行注解的文本信息;
如示例中的 CM_ SG_ 996 HUD_HeightLv “Control hud height level”;
表示对ID为996(0x3E4)这条报文下的名为”HUD_HeightLv ”的信号进行注解说明,说明的内容为"Control hud height level"。
又如 CM_ BU_ HUD “Head Up Display";表示对HUD这个节点进行注解说明,说明的内容为" Head Up Display "。
特征定义一共有三条,格式如下:
1)特征名称类型定义 BA_DEF_ Object AttributeName ValueType Min Max;
2)特征默认值定义 BA_DEF_DEF_ AttributeName DefaultValue;
3)特征项目设置值定义 BA_ AttributeName projectValue;
(1)、 BA_DEF_ / BA_DEF_DEF_ / BA_ 为关键字,表示特征定义,特征默认值定义,特征项目设置值定义;
(2)、 Object表示特征定义的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”、网络节点” ”(用空格表示)等;
(3)、 AttributeName表示进行定义的特征名字;
(4)、 ValueType表示特征值的类型,只能是整型(十进制、十六进制)、字符串、浮点型、枚举类型;
(5)、Min/Max表示特征值的上下最值,即指定了取值范围(字符串类型没有此项);
(6)、 DefaultValue表示该属性的初始值。
如示例中的
BA_DEF_ BO_ “GenMsgCycleTime” INT 0 65535;
BA_DEF_DEF_ “GenMsgCycleTime” 2200;
BA_ “GenMsgCycleTime” BO_ 400 100;
表示对定义了一个针对消息类型的特征,特征名为”GenMsgCycleTime”,特征值是整型数据,取值范围在0到65535之间;
默认值为2200;
项目设置值 CAN ID ==400的消息的该特征值设置为100
在DBCView4.3里面是把BA_DEF_ 和 BA_DEF_DEF_合并在一起了,用了特征视图来管理,如下图。
然后把 特征项目设置值定义 BA_ AttributeName projectValue; 和元素合并在一起了。
格式如下:
VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;
(1)、VAL_为关键字,表示数值表定义;
(2)、 MessageId表示该信号所属的报文ID(10进制数表示);
(3)、 SignalName表示信号名;
(4)、 N “DefineN” …… 0 “Define0”表示定义的数值表内容,即该信号的有效值分别用什么符号表示 。
如示例中的 VAL_ 996 HUD_OffSt 1 “Active” 0 “Not Active”;
表示对ID为996(0x3E4)的这条报文下的,一个命名为”HUD_OffSt”的信号,进行其数值表的定义;
用”Active”取代1;用”Not Active”取代0。只有自然数类型的信号才可以使用数值表表示。
信号的值的表示方法有两种:
1) 物理值=原始值*因子+偏移量;(常规表示,前面有提到)
2) 数字表,用来表示逻辑值;