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|[email protected]_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|[email protected]+ (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的结构,让新建、修改、解析变得更加便捷,也能够让我们更直观找到我们想要的信息并进行拷贝,总之作为一个程序员更愿意看到源码信息,这能省去不少的麻烦,让一切操作更加容易。