一篇文教你详细解析DBC文件结构

一篇文教你详细解析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文件时用到,

我是灰小猿,我们下期见!

相关推荐

最全椰蓉详细教程【全脂、脱脂、椰丝、椰蓉】
365bet电子游戏

最全椰蓉详细教程【全脂、脱脂、椰丝、椰蓉】

🗓️ 08-31 👁️ 4953
wiiu和switch性能对比(买wiiu还是switch)
365赢多少钱会被限额

wiiu和switch性能对比(买wiiu还是switch)

🗓️ 08-19 👁️ 7919
在日本现金不够用? 教你如何兑换日元 (专门店/银行/ATM机)
魔兽世界法师技能详情及等级对照表(最新版)
BT365软件提现不了

魔兽世界法师技能详情及等级对照表(最新版)

🗓️ 09-14 👁️ 1227
浏览器如何退出全屏
BT365软件提现不了

浏览器如何退出全屏

🗓️ 07-02 👁️ 8974
Windows 11 24H2 引起的鼠标光标异常解决方案
365bet电子游戏

Windows 11 24H2 引起的鼠标光标异常解决方案

🗓️ 08-26 👁️ 9797