Loading...
墨滴

jasonj333

2021/05/21  阅读:22  主题:红绯

如何制作DBC文件

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工程上

电脑上
电脑上
CANoe工程
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是把消息数据以大端的形式(数据由高位放置),信号从高位排列

Inter
Inter
Motorola
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的相关内容,别忘了点赞和转发哦!!!


jasonj333

2021/05/21  阅读:22  主题:红绯

作者介绍

jasonj333