DBC的故事

欢迎关注《汽车软件技术》公众号,回复关键字获取资料。

1.DBC定义

DBC(data base CAN)是汽车ECU间进行CAN通讯的报文内容,有了它相互之间才能听懂。

2.DBC查看

DBC是文本文件,可以用记事本打开,一般都用CANdb++,可以更方便的查看和编辑。

3.DBC组成

DBC是由一系列的Message和Signal组成,文件定义了Message和Signal的属性,可参考vector文档(回复“DBC文档”获取)。下面介绍几个重要的关键字:

1)BO_

BO_是对Message的定义。

  • 格式:BO_ ID Name: DLC Transmiter
  • 例子:BO_ 100 ESP_01: 8 ESP
  • 释义:发送方=ESP,帧名称=ESP_01,帧ID=0x64,报文长度=8个字节

2)SG_

SG_是对Signal的定义。

  • 格式:SG_ Name : StartBit | Length @ ByteOrder SignedFlag (Factor,Offset)  [Minimum | Maximum] "Unit"   Receiver1,Receiver2
  • 例子:SG_ VehSpd : 7|16@0+ (0.01,0) [0|655.35]  "km/h"  ECM.TCM
  • 释义:信号名称=VehSpd,起始地址=7,长度=16,字节顺序=MSB(大端),符号位=无符号,系数=0.01,偏移=0,最小值=0,最大值=655.35,单位=km/h,接收方=ECM和TCM

3)VAL_

VAL_是对Signal枚举值的定义。

  • 格式:VAL_ ID Name key1  "value1key2 "value2"  ;
  • 例子:VAL_ 100 VehSpdValid  1 "Valid" 0 "Invalid" ;
  • 释义:帧ID=0x64,信号名称=VehSpdValid,枚举值(0x0=Invalid,0x1=Valid)

4.DBC解析

上文已经介绍了DBC的格式,接下来介绍如何使用DBC从原始报文中解析出物理值。在此之前要先理解MSB(大端)和LSB(小端)。MSB是高位在前,LSB是低位在前,大多数都用的MSB。

1)原始值

假设有3个信号:signal1、signal2和signal3,长度分别是16、4、12。这3个信号包括了3种类型:完整字节,部分字节和跨字节。用Layout来比较。下面使用了位操作指令:&是按位与,<<是左移,>>是右移。

  • MSB

 

MSB高位在前。

signal1:起始地址=7,值=Byte0<<8+Byte1。(Byte0是高位,Byte1是低位)

signal2:起始地址=23,值=(Byte2&0xf0)>>4。(取Byte2的高4位)

signal3:起始地址=19,值=(Byte2&0x0f)<<8+Byte3。(取Byte2的低4位,作为高位)

  • LSB

 

LSB是低位在前。

signal1:起始地址=0,值=Byte0+Byte1<<8。(Byte0是低位,Byte1是高位)

signal2:起始地址=16,值=Byte2&0x0f。

signal3:起始地址=20,值=(Byte2&0xf0)>>4+Byte3<<4。(Byte2是低位,Byte3是高位)

2)物理值

物理值=原始值*Factor+Offset

3)代码实现

以.NET(C#)为例,绘制layout,计算出数值。

(回复“DBC例子”获取源代码)

  • MSB

 

  • LSB

 

5.DBC开源资料

(回复“DBC开源”随机获取)

原文地址:https://www.cnblogs.com/zhyongquan/p/8996409.html