CAN通信之DBC文件详解

共 3233字,需浏览 7分钟

 ·

2024-09-05 07:33







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





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'。
















招已经开始啦,大家如果不做好充足准备的话,招很难找到好工作。


送大家一份就业大礼包,大家可以突击一下春招,找个好工作!











浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报