dbc文件的格式以及创建详解

来源:公众号“汽车ECU开发”
2021-10-22
1791


摘要:



dbc数据库文件是用来描述CAN网络节点间数据通讯的一种文件,包含了CAN总线协议中协议数据及其所代表的具体意义。它可以用来监测与分析CAN网络上的报文数据,也可以用来模拟某个CAN节点。



01



dbc文件格式

首先我们来看看dbc文件的格式,我们通过记事本打开在dbc文件,此时界面如下图所示:


图片
如上图所示,一般dbc文件中包含了如下的8种信息:


1、版本与新符号

2、波特率定义

3、网络节点的定义

4、报文帧的定义

5、信号的定义

6、注解部分

7、属性定义部分


8、数值表部分
其中第2点、第3点是必须项,缺少这两项的dbc文件是不能用CANdb++ Editor软件打开的;接下来我们结合例子对dbc文件的这几项信息进行逐步解析介绍。
1、版本与新符号
如下图,Dbc文件头部包含着”version”与”new symbol”的信息;
(1)、 ”version”信息可以为空,也可以由用户自定定义;
(2)、 ”new symbol”信息在我们创建dbc文件时就已经自动生成;
所以这一部分的信息我们无需过多留意,一般默认即可。
图片
2、波特率定义
格式如下:
BS_:[baudrate:BTR1,BTR2];
其中BS_为关键字,用于定义CAN网络的波特率;[ ]内容表示为可选部分,可以省略(如下图例子中即把该部分省略了);但关键字”BS_:”必须存在,省略则会出错。
图片
3、网络节点的定义
格式如下:
BU_:Nodename1 Nodename2 Nodename3 ……
其中BU_为关键字,表示网络节点,格式中的Nodename1、Nodename2表示定义的网络节点名字,由用户自己定义;但需保证节点命名的唯一性。
如示例中的BU_: AVNT ACU HUD :表示定义了AVNT、ACU、HUD这三个网络节点。
4、报文帧的定义
格式如下:
BO_ MessageId(10进制数表示) MessageName: MessageSize Transmitter
(1)、BO_为关键字,表示报文;
(2)、MessageId为定义的报文ID,是以10进制数表示的;如例子中的996,代表报文ID为0x3E4;
(3)、MessageName表示该报文的名字,命名规则和C语言变量相同;
(4)、MessageSize表示该报文数据域字节数,为无符号整型数据;
(5)、Transmitter表示发送该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”。
 如示例中的BO_ 996 HUD_1_B: 8 HUD:表示定义了一条由HUD这个节点发送,数据域长度为8字节,ID为996(0x3E4),名字命名为HUD_1_B的报文。
5、信号的定义
格式如下:
SG_ SignalName : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver
(1)、SG_为关键字,表示信号;
(2)、SignalName、 StartBit、 SignalSize分别表示该信号的名字、起始位、信号长度;
(3)、ByteOrder表示信号的字节顺序:0代表Motorola格式,1代表Inter格式;
(4)、 ValueType 表示该信号的数值类型:+表示无符号数,-表示有符号数;
(5)、Factor表示因子,Offset表示偏移量;这两个值于该信号的原始值与物理值之间的转换。
     转换如下:物理值=原始值*因子+偏移量;
(6)、Min|Max表示该信号的最小值和最大值,即指定了该信号值的范围;这两个值为double类型;
(7)、Unit表示该信号的单位,为字符串类型;
(8)、Receiver表示该信号的接收节点;若该信号没有指定的接收节点,则必须设置为” Vector__XXX”。
如示例中的 SG_ HUD_BrightnessLv : 15|4@0+ (1,0) [0|15] “lv” ACU,AVNT
表示定义了一个命名为HUD_BrightnessLv的信号,其起始位是第15位,信号长度4个位;信号是Motorola格式,数值类型为无符号类型数;因子为1,偏移量为0;信号取值范围为0到15;信号单位为字符串”lv”;该信号接收节点为ACU、AVNT这两个节点。
6、注解部分
格式如下:
 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 "。
7、属性定义部分
格式如下:
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_DEF_ SG_ “MyTry” INT 0 11;
                    BA_DEF_DEF_ “MyTry” 0;
表示对定义了一个针对信号类型的属性,属性名为”MyTry”,属性值是整型数据,取值范围在0到11之间,初始值为0。
8、数值表部分
格式如下:
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。
小结
        以上通过示例将常见dbc文件的格式分成了以下八点进行了阐述介绍。
        1、版本与新符号
        2、波特率定义
        3、网络节点的定义
        4、报文帧的定义
        5、信号的定义
        6、注解部分
        7、属性定义部分
        8、数值表部分
其中第2点、第3点是必须项,其他项不一定都有。当我们对dbc文件的结构比较熟悉之后,可以在文本模式下直接对dbc文件进行修改编辑;例如直接拷贝数值表进行修改定义等操作,会比在"CANdb ++ Editor"界面下操作更方便。

02



dbc文件的创建


dbc文件的创建过程一般可分为以下几个部分:
1、新建一个CAN数据库文件
2、创建信号要用到的数值表Value Tables
3、创建信号Signals,关联该信号的数值表
4、创建报文Messages
5、创建网络节点Network nodes
6、将信号、报文及网络节点进行关联链接
7、创建或导入自定义属性,并进行修改
8、一致性检查
Ps:关于上面提到的第2点到第5点的信息,一般车厂都会通过通讯矩阵更新给出。我们按照通讯矩阵中的信息进行信号、报文、网络节点等信息的创建关联。
创建步骤
接下来以如下的一条报文为例,介绍下在CANdb++ Editor工具下创建编辑dbc文件的详细步骤。
图片
我们先对上图例子中的报文进行分析,其ID是0x3E4;报文中包含了3个信号值(还要注意每个信号值其数值的代表意义,用于做该信号的数值表),是由HUD这个网络节点发送的,然后由ACU、AVNT这两个网络节点接收。也就是说,在我们这个操作示例中,我们需要新建3个信号、1条报文、3个网络节点,并对其进行链接关联。好,那接下来我们分布进行详细介绍
1、新建一个CAN数据库文件
打开CANdb++ Editor软件,点击工具栏”File”下的”Create Database”,此时界面如图1所示。按需求选择模板,点击ok,即完成dbc数据库文件的创建了。


图片


图1
2、创建信号要用到的数值表Value Tables
数值表的创建,其实是用符号标识符来表示信号值或环境变量值,避免信号值意义不明确。具体操作如下:
点击工具栏”View”下的”Value Tables”,此时界面如图2.1所示。右键空白部分,选择”New”进行新建。此时界面如图2.2所示,完成数值表名字及数值定义后,点击确定即完成该信号数值表的创建了,依次再将其他的两个信号的数值表完成创建。此时再看”Value Tables”的界面已经如图2.3所示了。


图片


图2.1

 图片                             

图2.2

图片
图2.3
3、创建信号Signals,关联该信号的数值表
如图3.1所示,右击”Signals”选择”New”进行信号的新建,此时界面如图3.2所示。根据通讯矩阵中对于该信号的定义进行设置,并关联上我们上一步创建的该信号的数值表,点击确定即完成了信号的创建(其他列的信息我们这里先不用进行设置),依次完成其他两个信号的创建工作(可以直接New新建,也可以以前面建好的信号为模板选择Copy/Paste,再双击进行修改完成创建)。完成三个信号创建后的界面如图3.3所示


图片


图3.1

图片


图3.2


图片


图3.3
4、创建报文Messages
右击”Message”,选择”New”,此时的设置界面如图4所示,按通讯矩阵定义的报文信息进行设置,点击确定即完成当前报文的建立工作。在建立其他报文时,可以以这个为模板进行Copy操作再进行修改;也可以新New创建。


图片


图4
5、创建网络节点Network nodes
右击”Network nodes”,选择”New”,此时的设置界面如图5.1所示,这里我们只需输入创建的网络节点名字进行新建操作就行;其他关联操作在下一小节再进行描述。依次完成另外两个接收节点的创建。完成后的界面如图5.2所示


图片


图5.1


图片


图5.2
6、将信号、报文及网络节点进行关联链接
在前面的小节里,我们已经完成了信号、报文、网络节点的创建工作。在这一小节,我们将介绍如何将他们进行链接关联。
6.1、信号与报文的关联工作
6.1.1 方法一:鼠标直接拖放
(1)、鼠标点击”Message”下要进行关联操作的报文;
(2)、将要关联到该报文的信号直接拖拽到右侧的空白区,或者拖拽到该报文位置(即下图6.1.1示例中的”HUD_1_B(0x3E4)的位置”)


图片


图6.1.1
6.1.2 方法二:在该报文的”Signals”配置下进行添加关联
(1)、双击“Message”下要进行关联工作的报文,在弹出的设置界面下切换到”Signals”设置项;
(2)、点击”Add”,选择要关联到该报文的信号,点击OK即完成了关联工作(可以一次添加多个关联的信号)。如下图6.1.2所示


图片


图6.1.2
Ps:在完成报文与信号的关联后,此时还需设置下信号在报文的起始位;
(1)、双击报文下的信号值,进入”Definition”设置界面;
(2)、设置该信号的起始位。如下:


图片


图6.1


6.2、报文与网络节点的关联工作
示例中的报文,其发送节点是HUD,接收节点是ACU和AVNT。其关联工作步骤如下:
6.2.1 报文与发送节点的关联
跟前面介绍的信号与报文的关联一样,有两种方法:
(1)、方法一:直接将报文拖拽到要关联的节点(注意直接拖拽到节点的操作,默认是当做该节点的发送报文的);

(2)、方法二:双击要进行关联工作的节点,进入设置界面,在”Tx Messages”界面下的点击”Add”进行报文添加工作。如下图6.2.1所示

图片

图6.2.1

6.2.2 报文与接收节点的关联
若当前报文是想作为要关联节点的接收报文,操作如下:
双击要进行关联工作的节点,进入设置界面,在”MappedRxSig”界面下的点击”Add”进行报文添加工作;如下图6.2.2所示(注意作为节点接收报文的不能通过直接拖拽进行关联)。

图片


图6.2.2


7、创建或导入自定义属性,并进行修改
7.1、创建自定义属性
在”View”下点击”Attribute Definitions”,右击选择New,按需要可以进行对报文、信号、节点、环境变量等进行属性创建。此时界面如下图7.1所示:

图片


图7.1


7.2、属性的导入操作
 ”Attribute Definitions”中的属性也可以通过从其他已有的dbc文件中进行导入;操作如下:在”File”中选择”Import Attribute Definitions”,选择要导入的dbc文件,即可将该dbc中的属性定义导入到我们现在的dbc文件中来。

图片


图7.2
7.3、属性的修改操作

根据上面的步骤我们完成了属性的自定义或导入工作;此时再双击打开信号、报文、或者节点,在其”Attributes”项下可以看到我们前面定义/导入的属性及其值;此时可根据通讯矩阵的定义对其进行修改设置。例如图7.3.1是对报文属性的修改;图7.3.2是对信号属性的修改操作;如下:

图片       


图7.3.1


图片


图7.3.2


8、一致性检查
经过前面的几个步骤其实已经完成数据库文件的创建了。但我们还需要通过一致性检查来确保数据库文件中的对象及内部关系的一致性。操作方法如下:
 在”File”中选择”Consistency Check”,此时会在一致性检查窗口中输出检查结果。如下:会有状态信息及对应的说明,以供我们检查出错/警告报警的原因。此时界面如下图8.1所示:
图片

图8.1

小结
dbc数据库文件是用来描述CAN网络节点间数据通讯的一种文件,包含了CAN总线协议中协议数据及其所代表的具体意义。简单的讲,dbc文件描述了在CAN网络上有哪些报文信息;这些报文上又携带了哪些信号信息;该报文是从哪个节点发出,哪个节点进行接收的等信息。所以,我们在进行dbc文件的创建时,其实也是要抓住dbc文件的主体,即完成信号、报文、节点的创建;再对其进行关联链接。


————————————————


版权声明:本文由CSDN博主「第55号小白鸭」原创

收藏
点赞
2000