CAN通信之DBC文件详解

科技   2024-07-06 21:33   天津  

扫描关注一起学嵌入式,一起学习,一起成长

DBC 文件解读

DBC 是由 vector 公司定义的 CAN 网络通信文件格式,具体规范可参考《DBC File Format Document》。

DBC 文件常用 Vector CANdb++ Editor 工具打开。打开后的界面如下:

Network nodes 中定义了本 DBC 文件所有报文的发送及接收节点;展开节点 NEO 可查看该节点的发送及接收报文。

Node Name 定义了报文的发送节点;Massage Name 定义了报文名称。

Name 还是对应报文名称;ID 对应报文 ID,十六机制,每个 CAN 报文都有自己唯一对应的 ID 号;DLC 为该报文的长度,单位为 Byte;Cycle Time 为循环发送时间,即应每隔多久发送一次,此处为 0。

Signals 为该帧报文包含的信号;Transmitters 为该报文的发送节点;Receivers 为该报文的接收节点;

Layout 的排版格式如上,具体含义需结合下面的信号格式解读。

注意左上角标题:Node Rx Signal’LAT_DIST’,即某节点的接收信号,而报文的左上角标题为’Massage’,注意区分。

Node Name定义了信号的发送节点;Massage Name 定义了信号所在的报文名称;Signal Name 定义了信号名称。

由于该面板是在Massage选项框下的,故所有信息均为报文TRACK_3的信息。

该面板是在Signal选项框下的,故所有信息均为信号LAT_DIST的信息。

长为10个bit;Layout对应的排序方式为Motorola;单位为m;数据类型为有符号整型;初始值为0;精度为0.0625;偏移量为0;最小值0;最大值63.5。

该信号所代表的实际物理值 = 原始值(二进制转为十进制)*因子+偏移量。

Motorola格式,从起始位开始自右向左倒退。

Inter格式,从起始位开始自右向左前进。

当信号在一个字节内实现(信号不跨字节)时,Intel 格式和 Motorola 格式的信号排序完全一致,信号的高位(MSB)放在该字节的高位,信号的低位(LSB)放在该字节的低位。

当信号在多个字节内实现(信号跨字节)时,Intel 格式和 Motorola 格式的信号排序有所不同:

  • Intel 格式:信号的高位(MSB)放在高字节的高位,信号的低位(LSB)放在低字节的低位;

  • Motorola格式:信号的高位(MSB)放在低字节的高位,信号的低位(LSB)放在高字节的低位。不管是 Intel 格式,还是 Motorola 格式,起始位都为该信号的低位。

不管是 Intel 格式,还是 Motorola 格式,起始位都为该信号的低位。

DBC文件的底层实现逻辑

用记事本或Nodepad++打开一份DBC文件,如下:

VERSION ""

NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
...
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_

BS_:

BU_: K182_PACM K43_PSCM K17_EBCM NEO K124_ASCM
  • VERSION:定义DBC文件的版本信息,这里并未给出。

  • NS_(New Symbol) :定义DBC文件使用的命名空间,该信息在创建DBC文件时自动生成,一般无需理会。

  • BS_:用于定义CAN网络通讯的波特率,内容可以省略,但该关键字必须存在。

  • BU_:定义总线上的节点,在这个例子中有5个节点:K182_PACM、K43_PSCM、K17_EBCM、NEO和K124_ASCM。

BO_ 823 PACMParkAssitCmd: 7 NEO
SG_ RollingCounter : 35|2@0+ (1,0) [0|0] "" NEO
SG_ SteeringWheelChecksum : 47|16@0+ (1,0) [0|0] "" NEO
SG_ SteeringWheelCmd : 23|16@0+ (1,0) [0|0] "" NEO
  • BO_:定义了一个数据帧,即一帧报文,其ID为823(十六进制对应0x337);该帧报文的名称为:PACMParkAssitCmd;整个报文长为7个字节,CAN 2.0最长为8字节,CAN FD最长为64字节;发送节点为NEO。如果该报文没有指定发送节点,则发送节点处设置为” Vector__XXX”。

  • SG_:定义了该报文包含的信号,共RollingCounter、SteeringWheelChecksum和SteeringWheelCmd,3个信号。

// BO_ 1073 TRACK_1: 8 RADAR
SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO
  • 定义了一个名为LONG_DIST的信号;从第7位开始;长为12个bit;

  • @0表示信号的字节顺序,0 代表Motorola,1 代表 Inter;

  • +表示无符号数,-表示有符号数;

  • Factor=0.0625;OffSet=0;min=0;max=255.5;

  • 单位为"m ";接收节点为NEO。

SIG_GROUP_ 896 VehBattU 1 : VehBattUSysU VehBattUSysUQf;
  • 定义信号组VehBattU,包含两个信号VehBattUSysU和VehBattUSysUQf。

CM_ SG_ 1024 RADAR_STATE "need to find out more diagnostic values";

  • CM_(Comment):用于添加备注和注释,方便用户理解文件内容。

上述代码的含义为:RADAR_STATE的信号ID为1024(十六机制为0x400),含义为"need to find out more diagnostic values"。

可以进行注解的对象类型不仅限于信号,还可以是节点“BU_”、报文“BO_”等。

VAL_ 1024 RADAR_STATE 121 "ok" 110 "faulted" 105 "wrong_config";
  • VAL_(Value Table):给信号添加值域描述。

  • 定义报文ID为1024(十六机制为0x400)的信号RADAR_STATE为枚举变量,当其值为121时表示"ok";110时表示"faulted";105时表示"wrong_config"。


原文:https://blog.csdn.net/i37193429/article/details/136491517

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。



关注【一起学嵌入式】,回复加群进技术交流群。




觉得文章不错,点击“分享”、“”、“在看” 呗!

一起学嵌入式
结伴而行,RTOS、Linux编程、C/C++,以及经验分享、行业资讯、物联网等技术知识。一起学习,一起成长
 最新文章