DBC文件在CAN网络的设计和测试中起着非常重要的作用,通过DBC,可以把CAN网络中大量的数据解析成直观的消息和信号,方便用户分析
DBC
什么是DBC
Database CAN,CAN网络的数据库文件,定义了CAN网络的节点、消息、信号的所有细节,包括每个节点会发送哪些消息和接收哪些消息,每个消息里里包含哪些信号,每个信号位于消息的哪个位置,值有哪些,每个值代表的含义是什么,等等
DBC的用途是什么
节点之间发送和接收CAN消息时,只会是一串数据,更细点可以说是一串字节数,再细点本质上是一串0和1的二进制数,这一串0和1的数据,不管是对于发送的人,还是接收的人,都很难了解是什么意思?
那怎么办?
我们用CANoe中带不带DBC做对比
如何在CANoe的某个CAN通道配置DBC呢?
首先我们创建一个CAN网络,Simulation -> Simulation Setup -> 右击选择System View -> 出现右侧的Networks区域 -> 右击Networks选择Add -> 添加网络通道,CAN或者Eth都可以
然后在创建好的CAN网络的Databases下右击选择Add一个DBC文件即可
我们先看不配置DBC的
对于发送者来说,由于没有DBC,只能根据can message的id来声明消息
variables
{
message 0x123 msg_EngineState;
}
由于没有DBC,发送此消息前必须定义好消息的长度dlc,同时计算信号值所在的字节的值
on key 't'
{
msg_EngineState.dlc = 2;
msg_EngineState.byte(0) = 1;
output(msg_EngineState);
}
发送完再在trace window上看一下是什么样
在trace窗口中只能看到message id和value,对于分析人员来说,还必须根据需求查看这条消息的哪些位表示哪个信号,哪个值表示信号什么状态
不管是发送者还是接收者,没有DBC实现CAN通讯非常的麻烦
如果配置了DBC
在capl中如果想声明一条can message,不仅可以用id,还可以用DBC中定义的message name
capl中自动就会根据你输入的内容检索出所有的message了
variables
{
message EngineState msg_EngineState;
}
由于DBC上已经定义好了消息的长度还有信号,所以我们只需要对信号赋值即可
On key 't'
{
msg_EngineState.OnOff = 1;
output(msg_EngineState);
}
发送完在trace窗口查看
你可以很明显的看出这条消息是什么,里面有哪些信号,信号值是多少
所以你现在应该知道DBC的用途是什么了吧
在capl中可以通过DBC文件数据库来引用里面定义好的消息,像消息id、长度或每一位都不需要自己定义,因为DBC中已经定义好了
当CANoe根据capl中声明的消息发送数据时,也是按照DBC中定义好的去发送
而trace中显示出来的消息数据,也是用DBC解析出来后显示在trace窗口
如何制作DBC
在学习如何制作DBC文件之前,我们有必要从使用者的角度思考:节点-CAN消息-信号三者之间的关系
ECU是面向信号的,当应用层功能改变时,触发信号值发生改变,信号值的改变会使得所在的CAN消息从某个节点发出
当然,CAN消息的循环时间到达时也会发出消息。发出的CAN消息是以广播的形式发送给其他所有节点ECU
但并不是所有的ECU都会接收并处理,每个ECU除了设计好了发送的消息,还设计了接收的消息,根据接收到的消息的id来判断,这是不是我想要的
既然ECU是面向信号的,我们可以从定义信号开始
比如CAN消息:EngineState,它有两个信号:OnOff、EngineSpeed
OnOff表示Engine状态,1 == on,0 == off
所以我们定义信号时还必须把“1 == on, 0 == off”这样一种关系定义进去
通过Value Tables
现在从头开始
我们用Vector的CANdb++ Editor工具来创建DBC文件
首先打开CANdb
在电脑上或CANoe工程上
选择模板
点击File -> Create Database
这里我们选择CANoeTemplate.dbc
然后保存文件到某个路径下
新建Value Table
还记得上面讲的,从信号开始吗?信号有可能有多个值,且每个值代表了什么含义,这些也需要表示出来,我们通过在Value Tables中创建这种关系
点击View -> Value Tables,打开Value Tables,然后右击选择New,把相关信息填好
最后点击OK确定
创建信号
信号的值列表创建好以后,就可以创建信号了
点击View -> Overview切回主页
在左侧Signals上右击,选择New
- Name
信号名称
- Length
信号长度,这里的单位是bit
- Byte Order
分为Intel、Motorola
Intel是把消息数据以小端的形式(数据由低位放置),信号从低到高排列
Motorola是把消息数据以大端的形式(数据由高位放置),信号从高位排列
- Init Value
默认值,就是当你没有赋值时,就会赋值默认值
- Value Table
把之前新建的用于这个信号的value table放进来
其他的几列不需要设置
Messages在新建message时会把这个信号添加进来
Receivers在新建message时会设置它的Receiver
Value Descriptions在设置信号的value table时就会显示到这里,所以你现在能明白value table什么意思了吗?其实就是描述信号值的内容
Comment是备注,随你高兴填不填
这里有个Attributes,message和network node里也有,在这里先讲掉,后续不再赘述
Attributes就是对象的属性,这里就是信号的属性,用处是什么呢?
比如说可以定义它的发送类型SendType,是Cycle还是OnChange,这样交互层可以通过获取它来选择发送方式(这是我猜的)
当然capl中也可以获取属性值
capl貌似无法获取信号的属性,不知道为什么
创建Message
点击左侧的Messages,右击选择New
- Name
消息名称
- Type
消息类型,是标准帧还是扩展帧
- ID
消息id,消息id是CAN网络里的真正的id,不是像Name一样人为随意定义的
为什么?
因为message id也是会转换成数据和data一起发送的,所以必须正确,不然接收者无法接收的
- DLC
消息长度
- Cycle Time
消息循环时间
除了这些,还要添加所有的信号
如此添加的信号是按照顺序一个挨着一个排列的(Intel/Motorola)
如果你想调整Startbit位置,可以在Layout里拖动
Transmitters和Receivers可以在Network nodes里添加
创建Network node
点击左侧的Network nodes,右击选择New
- Name
节点名称
- Address
节点是有地址的,比如0x005F,这是车辆里真实的地址,不是像Name人为随意写的
还要添加所有的从这个节点发出去的消息
如果有需要接收的消息,也可以添加进来
但是很奇怪的是,只能添加消息所属的信号,不知道为什么,有了解的私信我
以上就是DBC的相关内容,别忘了点赞和转发哦!!!