一、DBC文件
1. 1 DBC文件描述
DBC文件是一种用于描述CAN总线上的信号和消息的格式。它被广泛应用于汽车、航空航天、工业自动化等领域。DBC文件定义了总线上的数据如何传输、信号如何解析以及信号的结构和内容。
DBC文件描述了在CAN网络上有哪些报文信息,这些报文又携带了哪些信号信息,报文从哪个网络节点发出的,又是哪个节点接收的。在下面讲到的CANdb++ DBC文件编写中,我们可以清晰的对这些信息进行编辑。这些信息通常由开发所需的技术文档或协议规定,对于复杂CAN网络数据通信,DBC文件一般根据CAN通信矩阵来进行定义。
1.2 CAN通信矩阵
我们知道,CAN总线(ISO11898)标准只规定了物理层和数据链路层,至于应用层需要用户自定义。
CAN通信物理层的形式主要分为开环总线和闭环总线。其中开环总线用在低速通信上,适用于远距离通讯。闭环总线用在高速通信上,适用于近距离通信。物理层通讯网络由硬件接受设备和传输介质组成,主要包括Host、CAN控制器和CAN收发器以及传输电平信号的双绞线。
数据链路层规定了CAN通信机制以及CAN通信帧的种类和结构。包括CAN协议所规定的多主机通信、报文优先级判定的仲裁机制、寻址机制。通信帧则分为5种。数据帧、远程帧、错误帧、过载帧、帧间隔。CAN通信矩阵便是通过这些通信帧中预留的空白段,定义想要传输信息的ID、数据。
不同的应用领域使用不同的应用层标准,这通常是根据所设计的零部件功能决定的。
CAN通信矩阵文档定义的字段包括但不限于以下内容:
信号名称:一般是以发送节点的名字开头,“_”后面是具体指代的内容。如BMS_GeneralStatus。
信号长度:该信号的长度,单位是bit,位。
精度/偏移量:描述信号值如何转变成信号物理值。比如精度是2,偏移量是5,那么信号的真实物理值 = 信号值 * 2 + 5。
物理值范围:经过物理值转换后的最大最小值。
一般主机厂会给零部件供应商提供完整的CAN通讯矩阵,在做CAN通信相关控制软件开发时,则依据CAN通信矩阵编写DBC文件。
在DBC文件中,我们常需要定义这些字段信息:
信号名称(Signal Name):一般是以发送节点的名字开头,“_”后面是具体指代的内容。
信号长度(Bit Length):该信号的长度,单位是bit。
字节顺序(Byte Order):有Intel和Motorola两种格式。
起始位:(start_bit):这个范围一般是0-64,表示siganl在64bit里面最低有效位,有时候的起始位也表示在起始字节里面的最低有效位。
起始字节(start_byte):signal的最低有效位所在的字节。
数据类型(value Type):可选Signed、Unsigned、Float、Double类型。
二、 DBC文件编写
我们使用 CANdb++工具来创建DBC文件。
2.1 CANdb++下载安装
1. 首先打开vector的官方网站 ,版本CANdb++ Admin.J1939 3.0 SP27下载链接:
https://www.vector.com/cn/zh/download/?tx_vectorproducts_productdownloaddetail[download]=18883&tx_vectorproducts_productdownloaddetail[action]=show&tx_vectorproducts_productdownloaddetail[controller]=Productdownload&cHash=e255ee95d4bd75774f940696f31a4d89
2. 安装后打开时提示缺少文件Cdbstat.dll
https://download.csdn.net/download/weixin_40531919/88642337
进行下载,下载后放在C:\Windows\SysWOW64文件夹下即可正常使用。
2.2 创建DBC文件
1. 打开CANdb++,在菜单栏File - Create Database新建一个DBC文件。
2. 选择CAN模板并保存文件。
3. 新建一个名为test的dbc文件,界面如下所示,接下来定义CAN报文及信号。
图中
Networks代表当前的CAN网络结构,由ECUs、Environment variables、Network nodes、Messages和Signals组成;
电子控制单元(ECU)可由多个构成,每个网络节点都有一个相应的控制单元,信息通过网络节点与其他控制单元交换;
环境变量(Environment variables)定义为网络节点的输入输出变量,在cand++数据模型中,环境变量被分配给控制单元;
网络节点(Network nodes)代表控制单元与CAN总线的接口。报文收发的起始与目的地。
消息(Messages)即报文,由不同的信号构成;
信号(Signals),根据CAN数据矩阵所定义的各种数据;
通常只需要定义Messages和Signals便可以进行报文的接收与发送。
4. 创建Signals,创建方法: 右键 --> New
5. 根据CAN数据矩阵定义创建Signals,更改信号名称,长度,字节顺序,数据类型。
6. 创建Messages,创建方法: 右键 --> New
Messages依然来自于CAN数据矩阵,定义好名称,ID,DLC后,将该报文包含的信号添加进来。
7. 添加Signals到Messages,选中创建的Messages,依次点击new-Signals-Add,在弹出的选项框中选择要添加的信号,点击ok,添加完毕点击确定。
同时也可在Transmitters中配置对应的发送该报文的网络节点,也可不配置。
三、在simulink中完成CAN消息收发
DBC文件建立好之后,我们可以在simulink中使用CANPack模块和CAN unPack模块加载dbc文件完成CAN报文信息的收发。
3.1 CANPack模块配置
在simulink中键入CAN Pack,选择CAN Pack模块,进行模块配置。
数据输入方式(Data is input as)选择CANdb specified signals;
CANdb file选择加载建好的.dbc文件,选中相应的Message list,然后对应Signal就会自动出现的下方列表中,同时在模块的外边也会出现这些Signal的In端口,在这些端口上直接插入要赋给Signal的值,如图所示。
3.2 CAN unPack模块配置
使用CAN Unpack模块,可以把接收到的Message解析成具体的Signal,模块配置方式与上述CAN Pack模块相同,具体操作方法和配置成功后的效果如下:
3.3 仿真运行
添加几个常数作为信号输入,在解包模块显示结果如下:
需要注意的是,这里使用的signal长度均为8位,当一个signal的信号长度超过32bit时,CANPack和CAN unPack不支持模型代码生成,且在仿真时不会报错。可以将超过32位的信号拆解成多个信号输入,如这里的Challenge信号原本是一个64位的信号,这里将其拆解成了每8位作为一个信号输入。
四、参考
1. CAN通信矩阵理解点击 https://blog.csdn.net/qq_39593577/article/details/123813598
2. Cdbstat.dll文件下载点击 https://download.csdn.net/download/weixin_40531919/88642337
3. 本文DBC示例文件下载点击 https://download.csdn.net/download/weixin_40531919/88640558