基于Simulink实现CAN报文解析(unpack)与打包(pack)任务
CAN报文的解析与打包
Simulink CAN UNPACK使用
方式一(粗糙版): 首先unpack模块需要接入CAN_MSG,这里可以拉取一个CAN_Receive模块来作为unpack的输入。下一步,配置CAN_Configuration,调整波特率。 接下来,拉取CAN unpack解析模块,模块的输出(即解析后的信号)可以手动添加,也可以利用dbc文件来导入。实际工程中多用dbc的方式。如下图所示: 信号解析过后,通常会将解析后的各种信号以结构体的形式封装起来。这里就需要用到Bus Creator控件 这里注意,Bus Creator中的Output data type需要利用Bus editor进行编辑,可以自己手动添加。也可以利用Matlab命令读取我们先前写好的头文件 PS!!!头文件定义的结构体,信号一定要与unpack模块输出的顺序和数量保持一致,否则会编译出错。 保存工程,生成代码(Embedded Code Generation),如下所示:
方式二(推荐): 一般来说,在解析CAN报文前,都会在Simulink中制作相关的sldd/mat文件,主要定义如下结构: 1.CAN_RX_BUS结构 在搭建模型前,我们要清楚模型的输入是什么?解析模型的输入->即控制器接收到的原始CAN报文,如今CAN报文的接收大多采用中断的方式,一旦控制器收到了一条CAN报文,笔者会人为将这个报文转移至自己定义的buffer,以避免CAN报文发送周期过快导致当前报文来不及处理的丢帧现象,因此需要定义一个结构体,作为CAN报文的Buffer。 对应到Simulink中,需要新建一个input模块,类型转为Bus,如下图所示: 2.定义Bus成员 如下图所示,博主定义了CAN_RX_BUS(转化为C语言即结构体),其内部为诸如ConfigX_8_Receive_CAN_x_ID_XXX结构体成员。每一个Bus成员的格式为标准的CAN_MESSAGE, 格式如下图所示(可以自己裁剪或定义,但必须要有uint32格式的ID和8个字节的Data) 用于暂存接收到的原始CAN报文,同时也作为Simulink解析模型的input,如下图所示:
2.根据dbc定义各报文的结构体 模型的输入问题已经由步骤1-2解决,下面就需要定义模型的输出,即解析后的信号如何输出?我们需要根据dbc文件定义好各报文的结构体,这一步通常需要和应用层商讨,从而确定接口格式。如下图所示,博主和将模型解析后的信号输出到自己定义的接口。这样应用层可直接通过此接口获取解析后的信号值。 3.搭建CAN_UNPACK模型 搭建完CAN_RX_BUS和各报文的结构体后,就可以搭建模型了,节选一个报文为例,如下图所示: 4.生成代码
CAN_RX_BUS及各报文的结构体在.h文件中生成,如下所示 解析函数在.c文件中定义,如下所示
总结,无论采用哪种方式,解析的方式都是一样的,即UNPACK模块,但解析过程的报文输入和解析结果输出有所不同,也就是方式一和方式二的区别,核心是掌握Simulink中Bus Creator和Bus Selector的用法,灵活使用。
二. CAN PACK CAN PACK过程相反,CAN PACK模块的输入为各报文的信号值。 CAN信号的输出会根据out1模块的命名生成相应的 CAN_MESSAGE结构体,将此结构体与底层CAN_TX API接口关联即可。
三.总结 不论是UNPACK还是PACK,其本身的模块是不变的,重要的是如何根据需求生成相应的数据结构,这取决于我们对BUS的灵活应用。 如有疑问,欢迎指出,相互学习。
