文章目录
前言
DBC(Database CAN)文件是由德国Vector公司发布的,用来描述CAN网络上所有ECU节点之间CAN通讯信息的数据的一种文件,包含了CAN总线中协议数据及其所代表的具体意义。前面介绍了如何使用CANdb++可始化工具编辑dbc文件,但其本质仍是文本文件,本文将以Notepad++打开展开论述。
一、DBC文件解析:
首先展示dbc文件的全景,如下图所示
二、版本与新符号(默认即可)
”version”信息可以为空,也可以由用户自定定义;
”new symbol”信息在我们创建dbc文件时就已经自动生成;
三、波特率定义(此部分已弃置不再使用,但BS_关键字必须存在,省略则会报错)
格式如下:
BS_:[baudrate:BTR1,BTR2];
BS_为关键字,用于定义CAN网络的波特率;
[]内容表示为可选部分,可以省略;
四、网络节点的定义
格式如下:
BU_:Nodename1 Nodename2 Nodename3 ……
其中BU_为关键字,表示网络节点,格式中的Nodename1、Nodename2表示定义的网络节点名字,由用户自己定义;但需保证节点命名的唯一性。
如示例中的BU_: AVNT ACU IHU AAC :表示定义了AVNT、ACU、IHU、AAC这四个网络节点。
※以字母字符或下划线开头,并且可能进一步由字母数字字符和下划线组成。
※长度最多为128个字符。为了与较旧的工具兼容,长度不得超过32个字符。
五、VAL_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需要换行。
六、报文帧的定义
格式如下:
BO_ MessageId(10进制数表示) MessageName: MessageSize Transmitter
(1)、BO_为关键字,表示报文;
(2)、MessageId为定义的报文ID,是以10进制数表示的;在DBC文件中,CAN-ID必须唯一。如例子中的1559,代表报文ID为0x617(如果CAN_ID的类型是“CAN Extended”,则在DBC文件中表示是“0x8000 0000 + 十六进制CAN_ID”的十进制转换)
(3)、MessageName表示该报文的名字,命名规则和C语言变量相同;
(4)、MessageSize表示该报文数据域字节数,为无符号整型数据;
(5)、Transmitter表示发送该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”。
“: ” 冒号不能少
如示例中的BO_ 1559 AirCondition: 8 AAC:表示定义了一条由AAC这个节点发送,数据域长度为8字节,ID为1559(0x617),名字命名为AirCondition的报文。
七、信号的定义
格式如下:
SG_ SignalName [multiplexer_indicator]: StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] “Unit” Receiver
(1)SG_为关键字,表示信号;
(2)SignalName表示信号的名称。一个Message消息中的信号名称必须唯一。多个Message消息之间可以存在相同名称信号。命名必须满足“符号字符串”要求;
(3)multiplexer_indicator含义:
“ M”(大写)将信号定义为Multiplexor Signal。一个消息中只有一个信号可以是Multiplexor Signal;
“m”(小写)后跟无符号整数,将信号定义为Multiplexed Signal;
“空格”将信号定义为普通的Signal,表示没有复用。
(4)“:”冒号不能少;
(5)start_bit值指定信号在帧的数据域内的位置:
Intel(小端)模式这里表示信号的LSB;
Motorola(大端)模式这里表示信号的MSB;
(6)signal_size表示信号的长度,
以位为单位,十进制表示;
(7)“@”不能少;
(8)ByteOrder表示字节顺序。如果信号的字节顺序为Intel(小端),则byte_order为1;
如果字节顺序为Motorola(大端),则byte_order为0;
(9) ValueType 表示该信号的数值类型:+表示无符号数,-表示有符号数;
(10)Factor表示因子(分辨率,不能为0),Offset表示偏移量;这两个值于该信号的原始值与物理值之间的转换。
转换如下:物理值=原始值*因子+偏移量;
(11)Min|Max表示该信号的最小值和最大值,定义了信号的有效物理值的范围;这两个值为double类型;
(12)Unit表示该信号的单位,为字符串类型;没有单位即为“”
(13)Receiver表示该信号的接收节点;信号的接收方可以是多个节点,接收方节点名称必须在关键字BU_中定义。若该信号没有指定的接收节点,则必须设置为” Vector__XXX”。
注:当信号被多个节点接收时,在DBC中的描述,节点与节点之间用“逗号,”隔开。
信号单位的添加
如示例中的 SG_ IHU_BrightnessLv : 15|4@0- (1,0) [0|15] “lv” AVNT,ACU
表示定义了一个命名为IHU_BrightnessLv的信号,其起始位是第15位,信号长度4个位;信号是Motorola格式,数值类型为有符号类型数;因子为1,偏移量为0;信号取值范围为0到15;信号单位为字符串”lv”;该信号接收节点为ACU、AVNT这两个节点。
八、注释部分
格式如下:
CM_ Object MessageId/NodeName “Comment”
(1)、 CM_为关键字,表示注解信息;
(2)、 Object表示进行注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”;
(3)、 MessageId/NodeName 表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);若前面的对象类型为节点,则这里的值应为节点的名字;
(4)、 Comment表示进行注解的文本信息;
对信号内容进行注释
对报文内容进行注释
对网络节点内容进行注释
打开Notepad++可查阅,多出了CM部分
Dbc编辑中文出现乱码,在notepad++中编辑英文,保存,再次打开CANdb++ Editor
九、属性
①属性定义部分
格式如下:
BA_DEF_ Object “AttributeName” ValueType Min Max;
BA_DEF_DEF_ “AttributeName” DefaultValue;
(1)、 BA_DEF_为关键字,表示属性定义;
(2)、 Object表示属性定义的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”、网络节点” ”(用空格表示)等;
(3)、 AttributeName表示进行定义的属性名字(一般比较固定,参照相应的标准);
(4)、 ValueType表示属性值的类型,可以是整型、字符串、浮点型、枚举类型等;
(5)、Min/Max表示属性值的上下最值,即指定了取值范围(字符串类型没有此项)。
(6)、 BA_DEF_DEF_为关键字,表示定义属性的初始值;
(7)、 DefaultValue表示该属性的初始值。
②属性值部分
格式:
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;
十、数值表部分
格式如下:
VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;
(1)、VAL_为关键字,表示数值表定义;
(2)、 MessageId表示该信号所属的报文ID(10进制数表示);
(3)、 SignalName表示信号名;
(4)、 N “DefineN” …… 0 “Define0”表示定义的数值表内容,即该信号的有效值分别用什么符号表示 。
总结
DBC文件本质上是以Tag来标识不同元素最终被机器所读的!
版权归原作者 诊断协议那些事儿 所有, 如有侵权,请联系我们删除。