扫描关注一起学嵌入式,一起学习,一起成长
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
文章来源于网络,版权归原作者所有,如有侵权,请联系删除。
关注【一起学嵌入式】,回复“加群”进技术交流群。
觉得文章不错,点击“分享”、“赞”、“在看” 呗!