前言
`
Simulink模型中使用CAN Unpack模块并结合DBC文件,进行CAN报文的解析。生成的代码依据DBC进行一些位与和移位的操作,把报文中的信号摘出来。
首先展示一下DBC和搭建好的simulink模型长啥样。
DBC文件layout:
simulink模型:
1.建立变量
输入(CAN_MESSAGE_BUS)和输出(TBOX)的数据类型指定为simulink.bus对象。CAN_MESSAGE_BUS 可以直接通过在命令行窗口输入指令“canMessageBusType”自动生成。
双击右侧的变量,查看生成的BUS对象(CAN_MESSAGE_BUS)和BUS元素(Extended、Length、Remote…)如下,
定义名为TBOX的simulink.bus的数据对象
如何使用Bus Editor创建Simulink.Bus对象-每天一个MATLAB小技巧
👀注意:添加bus.element时候,顺序一定一定一定要和unpack模块输出的信号的顺序一样,代码就是依据这个赋值的。
数据作用域选择“已导出”,头文件起名“Tbox.h”,生成代码时会生成一个名为“Tbox”的头文件,里面会有上面定义的simulink.bus:TBOX 结构体。
如果数据作用域选择“自动”,头文件空白,那么TBOX的结构体定义会出现在“模型名_types.h”文件里。
2.模块配置
input port
👀注意:这里要勾选“以非虚拟总线输出”,这样总线信号才能以结构体形式出现在生成的代码中。
CAN_Unpack
👀CAN解包模块参数配置具体看另一篇文章CAN Communication 【Pack/Unpack】)
BUS_Creator
outport
前面的Bus Creator数据类型选择了Bus:TBOX,这个输出端口的数据类型Auto就行。或者Bus Creator数据类型auto,outport数据类型选择Bus:TBOX。
3.代码生成
以上就是所有操作,不出意外直接ctrl B 生成代码就行,以下是生成的所有代码文件。
虽然在代码报告里有“can_message.h”,但是生成代码的文件夹里根本没有这个文件,所以编译的时候需要自己粘进去。这是matlab自带的头文件,可以在MATLAB安装路径里找到:
总结
有看到一个教程说,CAN_MESSAGE_BUS.Simulink Bus数据对象也可以像TBOX.Simulink Bus一样自己创建。但是实际操作起来不知道为啥自己创建的总是报错,所以强烈建议大家还是自动创建。