一篇文教你详细解析DBC文件结构
hello,你好呀,我是灰小猿,一个超会写bug的程序猿!
今天在这里分享一下在汽车电子行业中常会用到的一种文件格式——DBC文件,并和大家对其中的内容的含义进行解析。
DBC文件的作用
当前汽车中的通信主要是用can总线通信,而DBC是vector公司定义的,用来描述CAN网络节点间数据通讯的一种文件,其中包含了CAN总线协议中协议数据及其所代表的具体意义,它可以用来监测和分析CAN网络上的报文数据,也可以用来模拟某个CAN节点。
基本元素
在DBC的文件结构中会用到很多格式的字符,每一个字符都有不一样的含义,每一个字符对应的含义如下:
符号 | 含义 |
---|---|
= | 等号左边为定义的名称,右边为该定义的格式 |
; | 定义的终止 |
| | 表示任选其一 |
[ … ] | 括号内的定义是可选的(零或一个事件)。 |
{ … } | 括号内重复定义(零次或多次),空格隔开 |
( … ) | 定义一组元素 |
’ … ’ | 文本按照“’”符号中写的去定义 |
(* … *) | 备注 |
版本信息
版本信息部分主要就是用来描述该DBC的哪一个版本的。
格式如下:
VERSION ""
实例如下:
VERSION ""
波特率
该部分定义了波特率和BTR网络寄存器的设置,这部分是过时的,而且不再使用,但是它的关键字‘BS_’必须出现在DBC文件中。
格式如下:
BS_:[baudrate:BTR1,BTR2];
实例如下
BS_:
注意:其中BS为关键字,用于定义CAN网络的波特率;[ ]内容表示为可选部分,可以省略(如下图例子中即把该部分省略了);但关键字”BS:”必须存在,省略则会出错。
网络节点
该部分定义了所有参与节点的名称,在这个部分定义的名称在这个部分里必须是唯一的。
格式如下:
BU_:Nodename1 Nodename2 Nodename3 ……
实例如下:
BU_: DCU IDS
其中BU_为关键字,表示网络节点,格式中的NodeName1、NodeName2表示定义的网络节点名字,由用户自己定义;但需保证节点命名的唯一性。
如示例中的BU_: DCU IDS 表示定义了DCU,IDS这两个网络节点。
报文帧
报文部分定义了所有报文的名称,同时还定义了报文的信息和报文下包含的信号。
格式如下:
BO_ MessageId(10进制数表示) MessageName: MessageSize Transmitter
其中:
- B0_为关键字,表示报文的意思
- MessageId为定义的报文ID,是以十进制数表示的,且报文ID是唯一的,如果最高位置为1,表示该报文为扩展帧,例如下方实例中的256就表示该报文ID为256
- MessageName表示该报文的名字,命名规则与C语言变量相同
- MessageSize表示该报文的数据域字节数,为无符号整型数据
- Transmitter表示发送该报文的网络节点,如果该报文没有指定发送节点,那么该值需要设置为“Vector__XXX”
实例如下:
BO_ 256 IDS_DCU_MSG100: 8 IDS
实例表示,定义了一条由IDS节点发送的,数据域长度为8字节,ID为256,名称为IDS_DCU_MSG100的报文。
信号
信号部分定义了该报文包含的所有信号,信号在报文数据场中的位置以及信号的其他信息。
格式如下:
SG_ SignalName : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver
其中:
- SG_为信号的关键字
- SignalName表示信号的名称,同一个报文下信号的名称是唯一的,
- StartBit表示信号的起始位,范围是0~Msg_size*8-1
- SignalSize表示信号的长度
- ByteOrder表示信号的字节顺序,0代表Motorola格式,1代表Inter格式;
- ValueType表示信号的数值类型,+表示无符号数,-表示有符号数;信号数据类型是float或者double的需要额外的类型定义字段
- Factor表示因子,Offset表示偏移量,这两个值于该信号的原始值与物理值之间的转换, 转换如下:物理值=原始值*因子+偏移量;
- Min|Max表示该信号的最小值和最大值,即指定了该信号值的范围;这两个值为double类型;
- Unit表示该信号的单位,为字符串类型;
- Receiver表示该信号的接收节点;若该信号没有指定的接收节点,则必须设置为” Vector__XXX”。
实例如下:
SG_ IDS_DCU_AutoCtrlEna : 0|1@0+ (1,0) [0|1] "-" DCU`
上面的实例表示:定义了一个命名为IDS_DCU_AutoCtrlEna的信号,其起始位是第0位,信号长度1个位;信号是Motorola格式,数值类型为无符号类型数;因子为1,偏移量为0;信号取值范围为0到1;信号单位为字符串”-”(缺省);该信号接收节点为DCU这个节点。
注解
格式如下:
CM_ Object MessageId/NodeName “Comment”
其中:
- CM_为关键字,表示注解的意思
- Object表示进行注解的对象类型,可以是节点“BU_”、报文“BO__”、消息“SG___”
- MessageId/NodeName表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);若前面的对象类型为节点,则这里的值应为节点的名字;
- Comment表示进行注解的文本信息
实例如下:
CM_ SG_ 996 HUD_HeightLv “Control hud height level”;
上面的实例表示对ID为996这条报文下的名为HUD_HeightLv的信号进行注解说明,说明的内容是Control hud height level
注意:注释以 “” 包围,注释内部不允许出现“号
属性
格式如下:
BA_DEF_ Object AttributeName ValueType Min Max;
BA_DEF_DEF_ AttributeName DefaultValue;
其中:
- BA_DEF_为关键字,表示属性定义
- Object表示属性定义的对象类型,可以是节点“BU_”、消息“SG__”、网络节点“ ”(用空格表示)等
- AttributeName表示进行定义的属性名称,
- ValueType表示属性值的类型,可以是整型、字符串、浮点型、枚举类型等;
- Min/Max表示属性值的上下最值,即指定了取值范围(注意:字符串类型没有这一项)
- BA_DEF_DEF_为关键字,表示定义属性的初始值
- DefaultValue表示该属性的初始值
实例如下:
BA_DEF_ SG_ “MyTry” INT 0 11;
BA_DEF_DEF_ “MyTry” 0;
上面的实例表示:定义了一个针对信号类型的属性,属性名为”MyTry”,属性值是整型数据,取值范围在0到11之间,初始值为0。
数值表(值列表)
该部分定义了信号值的意义
格式如下:
VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;
其中:
- VAL_为关键字,表示数值表的定义
- MessageId表示该信号所属的报文ID(十进制数表示)
- SignalName表示信号名
- N “DefineN” …… 0 “Define0”表示定义的数值表的内容,也就是该信号的有效值分别用什么符号表示。
实例如下:
VAL_ 996 HUD_OffSt 1 “Active” 0 “Not Active”;
在以上实例中表示对ID为996(0X3E4)的这条报文下的,一个命名为HUD_OffSt的信号,进行如下的数值表定义:用Active代替1,用Not Active代替0.
以上就是对DBC文件内容含义的解析,这部分内容主要是用于CAN通信矩阵转换DBC文件时用到,
我是灰小猿,我们下期见!
- 点赞
- 收藏
- 关注作者
评论(0)