基于QT的CAN仿真工具(一)----CAN Dbc的格式

既然是CAN仿真工具,第一篇就讲一下CAN DBC的格式,如何通过dbc文件定位到需要的信号 。下面用到的所有定义都已经做过处理,都是假的,不涉及任何商业使用的数据。

以下内容不针对没有CAN基础的同学,如果有基础问题可以后面留言,不定期回复。以下内容均为原创,转载请注明出处。

各个CAN工具公司都有CANDBC的编辑与查看工具并且都很智能 ,比如Vector的CANOE跟 CAN Alyzer或者intrepidcs的工具都有dbc的工具。那么问题来了,为啥我们还要人工去看看怎么解析 ,因为我们要做的是自己的CAN 工具,CAN dbc 的各种操作都需要自己去实现 ,所以这篇文章就是介绍如何用肉眼去解析CAN dbc,有了人工解析的能力,使用代码解析就手到擒来了。

针对一个信号无非是以下几个内容:

1. 信号所在的MessageID与名字,每个信号都依附于一个MeesageID;

2. 信号的名字,这个信号叫什么名字,有时候信号名字会有变化;

3. 信号的开始位置与长度,及时信号名变化,只要信号的位置与长度不变就不影响该信号的值;

4. 信号的Factor与Offset,由于每个CAN message 包含64bit的数据,只能表示整型,但是汽车中有很多物理量是需要小数点及负数的 ,比如温度,-40度-+40度。因此需要引入factor和offset的概念,在计算物理值的时候需要用以下公式计算:

raw_value*Factor+Offset=Py_value

有时候我们需要计算某个物理值对应的rawvalue,简单的解方程就能得到raw_value.;

5. 信号的值列表,有些信号为枚举类型,比如车辆的Ignition信号,会有启动,OFF不同的状态,对应不同的raw value,包括物理值,也会有 invalid,Error等特殊状态,在使用解析的时候都需要关注;

6. 极大值,极小值,一般根据信号的字节长度,跟Factor和Offset就可以计算出来,没什么实际作用;

6. 信号的说明,描述说明信号是个什么东西,比如这个信号是车速之类的 ;

下面介绍如何从DBC里面找到上面这些信息:

第一步,需要知道开头两个字符的定义

第二步,找到Message,message都是以BO开头,格式如下,从这里我们可以得到上面所述的信息1:

例如:

 BO_ 112 BCM_Mesage1: 8 BCM

“BO_ ” 起始字符串,代表这一行为定义一个Message

“112”  为10进制的Message ID

“BCM_Message1” 为Message的名字

“:” 分割符

“8” message 有多少个byte,一般为8个byte, 64 bit

“BCM” 消息的发送者

第三步,找到signal, 格式如下,在这个里面我们可以找到大部分的信息:

例如:

BO_ 100 BCM_Message1: 8 BCM     //这一行为Message
SG_ Ignition_Status : 13|4@0+ (1,0) [0|0] "SED"  GW  //以下为依附于该Message的Signal

SG_ Veh_V : 27|12@0+ (0.1,0) [0|409.5] "0 to 409.5 kilometers per hour"  ECM

“SG_” 该行为信号

“Ignition_Status” : 信号名为IgnitionStatus

“:13” 冒号后面第一位是起始位置

“|4” |后面的值,代表信号长度为4个bit

“@0+”  0 代表 byte_order = '0' | '1' ; (* 0=little endian, 1=big endian *), +号代表有无符号,value_type = '+' | '-' ; (* +=unsigned, -=signed *)

“(1,0)” 小括号的值代表Factor和Offset,用于计算

“[0|0]” 中括号的值代表最大值与最小值

“SED” 代表单位,SED一般代表没有单位,因为这个值是一个枚举状态

“GW” 最后的GW代表接受的节点

第三步,找到信号的枚举状态,该行为一堆键值对,不同的值代表什么意思

VAL_ 100  Ignition_Status 15 "Invalid" 8 "Start" 4 "Run" 2 "Off" 0 "Unknown" ;

“VAL_” 代表该行定义了一堆键值对,信号的值与内容

“100” 与之前的MessageID一致, 代表信号所在的Message

“Ignition_Status” 信号的名字

“15 'Invalid'” 数值15代表invalid,其他都一样

至此我们已经找到我们写代码需要的主要信息了,接下来会讲解如何写代码解析DBC文件。 当然我们还有其他的内容可以去找,比如是否唤醒之类的,信号解释什么的

 

CM_ SG_ 100 SteeringAngle "Absolute steering angle calculated from XXX motor position sensor value";

CM开头的语句定义了信号有什么作用

BA开头定义了信号的属性,比如发送周期什么的,

BA_ "GenMsgCycleTime" BO_ 100 60; 代表信号为100的发送周期为60ms

参考内容:

dbc的format说明

猜你喜欢

转载自www.cnblogs.com/supremetech/p/10390215.html