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

本文借鉴链接,请戳这里