”
节点之间发送和接收CAN消息时,只会是一串数据,更细点可以说是一串字节数,再细点本质上是一串0和1的二进制数,这一串0和1的数据,不管是对于发送的人,还是接收的人,都很难了解是什么意思?
那怎么办?
我们用CANoe中带不带DBC做对比
首先我们创建一个CAN网络,Simulation->SimulationSetup->右击选择SystemView->出现右侧的Networks区域->右击Networks选择Add->添加网络通道,CAN或者Eth都可以
然后在创建好的CAN网络的Databases下右击选择Add一个DBC文件即可
对于发送者来说,由于没有DBC,只能根据canmessage的id来声明消息
由于没有DBC,发送此消息前必须定义好消息的长度dlc,同时计算信号值所在的字节的值
发送完再在tracewindow上看一下是什么样
在trace窗口中只能看到messageid和value,对于分析人员来说,还必须根据需求查看这条消息的哪些位表示哪个信号,哪个值表示信号什么状态
不管是发送者还是接收者,没有DBC实现CAN通讯非常的麻烦
在capl中如果想声明一条canmessage,不仅可以用id,还可以用DBC中定义的messagename
capl中自动就会根据你输入的内容检索出所有的message了
由于DBC上已经定义好了消息的长度还有信号,所以我们只需要对信号赋值即可
发送完在trace窗口查看
你可以很明显的看出这条消息是什么,里面有哪些信号,信号值是多少
所以你现在应该知道DBC的用途是什么了吧
在capl中可以通过DBC文件数据库来引用里面定义好的消息,像消息id、长度或每一位都不需要自己定义,因为DBC中已经定义好了
当CANoe根据capl中声明的消息发送数据时,也是按照DBC中定义好的去发送
而trace中显示出来的消息数据,也是用DBC解析出来后显示在trace窗口
在学习如何制作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”这样一种关系定义进去
”
现在从头开始
我们用Vector的CANdb++Editor工具来创建DBC文件
在电脑上或CANoe工程上
点击File->CreateDatabase
这里我们选择CANoeTemplate.dbc
然后保存文件到某个路径下
还记得上面讲的,从信号开始吗?信号有可能有多个值,且每个值代表了什么含义,这些也需要表示出来,我们通过在ValueTables中创建这种关系
点击View->ValueTables,打开ValueTables,然后右击选择New,把相关信息填好
最后点击OK确定
信号的值列表创建好以后,就可以创建信号了
点击View->Overview切回主页
在左侧Signals上右击,选择New
信号名称
信号长度,这里的单位是bit
分为Intel、Motorola
Intel是把消息数据以小端的形式(数据由低位放置),信号从低到高排列
Motorola是把消息数据以大端的形式(数据由高位放置),信号从高位排列
默认值,就是当你没有赋值时,就会赋值默认值
把之前新建的用于这个信号的valuetable放进来
其他的几列不需要设置
Messages在新建message时会把这个信号添加进来
Receivers在新建message时会设置它的Receiver
ValueDescriptions在设置信号的valuetable时就会显示到这里,所以你现在能明白valuetable什么意思了吗?其实就是描述信号值的内容
Comment是备注,随你高兴填不填
这里有个Attributes,message和networknode里也有,在这里先讲掉,后续不再赘述
Attributes就是对象的属性,这里就是信号的属性,用处是什么呢?
比如说可以定义它的发送类型SendType,是Cycle还是OnChange,这样交互层可以通过获取它来选择发送方式(这是我猜的)
当然capl中也可以获取属性值
”
点击左侧的Messages,右击选择New
消息名称
消息类型,是标准帧还是扩展帧
消息id,消息id是CAN网络里的真正的id,不是像Name一样人为随意定义的
为什么?
”
消息长度
消息循环时间
除了这些,还要添加所有的信号
如此添加的信号是按照顺序一个挨着一个排列的(Intel/Motorola)
如果你想调整Startbit位置,可以在Layout里拖动
Transmitters和Receivers可以在Networknodes里添加
点击左侧的Networknodes,右击选择New
节点名称
节点是有地址的,比如0x005F,这是车辆里真实的地址,不是像Name人为随意写的
还要添加所有的从这个节点发出去的消息
如果有需要接收的消息,也可以添加进来
但是很奇怪的是,只能添加消息所属的信号,不知道为什么,有了解的私信我
以上就是DBC的相关内容,别忘了点赞和转发哦!!!
全部评论 (0)