DBC文件介绍
一.DBC文件的作用
CAN总线作为一种通信形式,在ISO 11898标准中仅规定了物理层和数据链路层,除了完成一些必要的协议(UDS、OBD)外,各个ECU之间的通信是由主机厂自行定义的,在协调好报文ID和信号内容后,制作一份通信矩阵,车辆网络中的各个节点需要遵循该通信矩阵才能完成信息的交互和共享。
整车厂通常会提供一份供人阅读的通信协议,而DBC文件则是在总线网络中完成这份工作的载体,提供给ECU识别总线网络中报文数据的方法。
DBC是Database CAN的缩写,代表CAN与CAN FD通信协议的数据库文件,定义了CAN通信中每一帧报文的信息。一帧CAN报文包含8个字节的数据场,可以由64个位分段描述数据内容,例如字节0位0-字节0位2为第一个信号,字节0位3-字节0位7为第二个信号,字节1位0-字节2位7为第三个信号……
通信矩阵的内容包括:
- 基本信息 :
- 报文名称:每一帧报文消息的名字。
- ID:帧报文的唯一标识符,标准帧11位,扩展帧29位。
- 报文类型:分为周期报文、事件报文、周期事件报文。
- 报文周期:循环发送报文的周期。
- 数据场长度:1~8字节。
- 信号定义:
- 信号名称:推荐命名为“发送节点名”+“_”+“功能”,实际应用请按需求命名。
- 信号长度:该信号的位长度,单位bit。
- 信号类型:通常情况使用无符号整型Unsigned。
- 信号格式:跨字节信号的填充方式。
- 起始字节:起始位所在的字节序号。
- 起始位:信号最低有效位(LSB,Least Significant bit)所在位置。
- 结束位:信号最高有效位(MSB,Most Significant bit)所在位置。
- 分辨率&偏移量:用于转换物理值和网络值,网络值=(物理值-偏移量)÷分辨率。
- 信号范围:信号物理值的有效值范围。
注意:当一个信号长度>8bit时,拥有两种填充方式:
- Intel格式:以起始位为原点,由低到高填充

Motorola格式:以起始位为原点,由高到低填充

在制作DBC文件时需要注意以下几点:
- 同一帧报文内的所有信号必须由同一个节点提供。
- 同一帧报文内的所有信号的时效性尽可能相同。
- ≤8位的信号,不应跨越字节边界。>8位的信号,跨越的字节数应当限制在最少,例如12位长度的信号,应该填充为跨越2个字节的信号,而不能填充为跨越3个字节的信号。
- 建议信号从每个字节的起始位开始排列。
- 信号排列应当紧凑,尽量不要出现空余的信号位。
二.DBC文件制作示例
假设通信协议规定波特率500kb/s,按照下表所示,以VECTOR公司提供的免费软件CANdb++为例,制作一帧CAN报文。CANdb++软件下载地址。
| 报文名称 | 发送端 | 接收端 | CAN ID | 长度 | 周期 |
|---|---|---|---|---|---|
| 电机控制器报文1(MCU1) | 电机控制器 | 整车控制器 | 0x0C08A7F0 | 8Byte | 20ms |
| 信号名 | 分辨率 | 偏移量 | 范围 | 位置 | 格式 |
| 驱动电机转矩 | 1Nm/bit | -32000 | -32000-32000 | 字节0~1 | Intel |
| 驱动电机转速 | 0.5RPM/bit | 0 | 0-32127.5 | 字节2~3 | Intel |
| 动力总成控制器输入电流 | 0.1A/bit | -1000 | -1000-1000 | 字节4~5 | Intel |
| 驱动电机控制器状态-停机 | 1 | 0 | 1有效,0无效 | 字节6位0 | — |
| 驱动电机控制器状态-驱动 | 1 | 0 | 1有效,0无效 | 字节6位1 | — |
| 驱动电机控制器状态-制动 | 1 | 0 | 1有效,0无效 | 字节6位2 | — |
| 驱动电机控制器状态-向后 | 1 | 0 | 1有效,0无效 | 字节6位3 | — |
| 驱动电机控制器状态-向前 | 1 | 0 | 1有效,0无效 | 字节6位4 | — |
| 驱动电机控制器状态-运行模式 | 1 | 0 | 1转速模式 0扭矩模式 | 字节6位5 | — |
| 驱动电机控制器状态-下电请求 | 1 | 0 | 1有效,0无效 | 字节6位6 | — |
| 驱动电机控制器状态-Ready | 1 | 0 | 1有效,0无效 | 字节6位7 | — |
| 驱动电机控制器LIFE | 1 | 0 | 0~255 | 字节7 | — |
步骤1:新建一个DBC空模板,实际应用中请按需求选择。

步骤2:按照通信协议中的内容制作每一个信号。

步骤3:将信号打包成帧报文。

步骤4:按照通信协议的规定调整信号在数据场中的位置。

三.DBC文件分析说明
使用CANdb++制作完DBC文件后,使用记事本直接打开DBC文件,如下图所示。

各关键字解析:
- VERSION:版本号,可以省略,可以用户自定义。
- NS_:new_symbols ,这一部分是在使用CANdb++制作文件时自动生成的文件信息,不用关注。
- BS_:定义CAN网络的波特率,可省略,但是”BS_:”关键字必须存在。
- BU_:网络节点定义,可以省略,可以用于自定义。注意,必须保证命名的唯一性。
- BO_:帧报文定义,格式:BO_ MessageID MessageName:MessageSize Transmitter。
- MessageID:报文ID,以10进制表示,第31位代表该CANID是否为扩展帧。即上图中BO_ 2349377520代表扩展帧ID0x0C08A7F0;
- MessageName:报文的名字,命名规则和C语言变量相同;
- MessageSize:代表该报文数据场的长度,在CAN 2.0为最大8字节,CAN FD 最大64字节;
- Transmitter:该报文的网络节点,如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”。
- SG_:信号定义,格式:SG_ SignalName (SigTypeDefinition):StartBit|SignalSize @ ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver.
- SignalName:表示信号的名字 和 多路选择信号的定义。
- SigTypeDefinition:空,表示普通信号;M,表示多路选择器信号;mx,表示被多路器选择信号,例如m20,当M的信号值等于20时,使用该通路。
- StartBit:表示该信号起始位。
- SignalSize:表示该信号的长度。
- ByteOrder:表示该信号的格式,0代表Motorola格式,1代表Intel格式。
- ValueType:表示该信号的数值类型:无符号数为+,有符号数为-。
- Factor:表示分辨率,也叫比例因子,与偏移量一起用于物理值与网络值的转换。
- Offset:表示偏移量,与分辨率一起用于物理值与网络值的转换。
- Min|Max:表示该信号的最小值和最大值,指定该信号值的范围。
- Unit:表示该信号物理值的单位,字符串类型,可以省略;
- Receiver:表示该信号的接收节点,若没有指定的接收节点,则必须设置为” Vector__XXX”。
- BA_DEF_:特征名称类型定义。格式:BA_DEF_ Object AttributeName ValueType Min Max。
- BA_DEF:表示标签;
- Object:表示特征类型,可以是BU_(节点特征定义)、BO_(报文特征定义)、SG_(信号特征定义)、空格(项目特征定义)。
- AttributeName:特征名称,即变量格式。
- ValueType:特征值类型,只能是十进制、十六进制、浮点数、枚举、字符5种类型。
- Min Max:数值类型这里出现的是数值范围,枚举类型这里出现的是枚举值,字符类型,这里是出现的是空。
- BA_DEF_DEF_ :特征默认值定义。格式:BA_DEF_DEF_ AttributeName DefaultValue。
- BA_DEF_DEF_:表示标签;
- AttributeName:表示特征名称,即变量格式。
- DefaultValue:表示默认设置值。
- BA_:特征项目设置值定义,格式:BA_ AttributeName projectValue。
- BA_:表示标签。
- AttributeName:表示特征名称,即变量格式。
- projectValue:该特征的设置值。
按照上述规则解读上图中DBC文件的重要信息:
- 帧报文基础信息:
- 扩展帧ID:0x0C08A7F0
- 报文名:MCU_Msg1
- 数据场长度:8字节
- 网络节点:无
- 包含信号:
- 信号名:MCU1_Sig12_LIFE
- 起始位置:56
- 长度:8bit
- 信号格式:Intel
- 数据类型:无符号
- 分辨率:1
- 偏移量:0
- 信号范围:0~255
- 单位:无
- 接收节点:无
- 信号名:MCU1_Sig11_Status_Ready
- 起始位置:55
- 长度:1bit
- 信号格式:Intel
- 数据类型:无符号
- 分辨率:1
- 偏移量:0
- 信号范围:0~1
- 单位:无
- 接收节点:无
- 信号名:MCU1_Sig12_LIFE
需要说明的是,通常人们并不以纯文本的方式来编辑或者查看DBC文件,而是使用专用软件工具比如CANdb++来编辑或者查看DBC文件。
四.DBC文件的使用方法
4.1.上位机使用DBC发送报文
以上位机软件ZCANPRO为例,使用DBC发送,加载DBC文件,选中要发送的帧报文MCU_Msg1,为各个信号赋值,即可发送报文。

4.2.上位机使用DBC解析接收到的报文
以上位机软件ZCANPRO为例,新建DBC窗口,加载DBC文件,发现接收到的报文与文件中的帧报文MCU_Msg1对应,解析该报文的各个信号值。

4.3.控制器使用DBC发送报文
在Simulink/ECUCoder中使用CAN Pack模块加载DBC文件,选择MCU_Msg1,使用ECUCoder中CANCommucation CAN通信模块库的CAN发送模块完成发送报文的功能。

4.4.控制器使用DBC解析接收到的报文
在Simulink/ECUCoder中使用CAN Unpack模块加载DBC文件,选择MCU_Msg1,使用ECUCoder中CANCommucation CAN通信模块库的CAN接收模块完成接收报文的功能。

关于控制器使用DBC文件的详细说明可以参考本站《ECUCoder常用模块参考手册》中的章节《CANPackMessage、CANUnPackMessage模块》或者ECUCoder使用说明书中章节《CANPack/CANUnpack模块集成》的内容。
五.DBC文件使用示例
5.1.上位机发送DBC数据
根据上一章节《DBC文件的使用方法》,使用上位机发送,控制器接收,将模型写入ECU,上位机模拟电机控制器发送CAN报文,ECU以20ms为周期循环接收,使用MeCa观测控制器接收报文的情况,如下图所示。本文示例使用RapidECU-U34控制器,使用其它控制器类似。

5.2.控制器发送DBC数据
根据上一章节《DBC文件的使用方法》,使用控制器发送,上位机接收,将模型写入RapidECU-U34控制器,U34控制器模拟电机控制器发送CAN报文,以20ms为周期循环发送,上位机使用ZCANPRO加载DBC文件解析接收到的报文,如下图所示。

六.DBC文件小结
在几乎所有用到CAN总线/CAN FD的电控系统开发项目中都需要使用到DBC文件,学习理解与使用DBC文件是电控软件工程师的基础技能之一。CANdb++可以用来查看、编辑、新建dbc文件,支持CAN与CAN FD,是最常用的dbc文件编辑软件工具。Simulink/ECUCoder可以自动导入DBC文件,是控制器收发DBC数据最常用的软件工具。