基于Simulink实现CAN报文解析(unpack)与打包(pack)任务

CAN报文的解析与打包

  在如今的汽车电子中,常用到雷达,激光雷达等多种传感器。传感器各种信号根据其信号长度与编码类型,打包成CAN报文发送到控制器,则控制器需要做出解析。
  如下图所示:一帧CAN报文里可存放许多信号(各信号根据长度,编码格式“塞”进CAN报文)
  对于解析工作,可采取结构体位域方式,也可采取Simulink加载dbc的方式。前者直观方便,但对于Motorola编码的CAN报文需要反向定义,手写代码易出错。后者是基于dbc实现的模型代码生成,较为方便可靠性强。
  本文将介绍基于Simulink的方式实现的CAN报文解析工作,对于结构体位域法可参照作者另一篇文章。
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第1张图片

Simulink CAN UNPACK使用

方式一(粗糙版):
  首先unpack模块需要接入CAN_MSG,这里可以拉取一个CAN_Receive模块来作为unpack的输入。下一步,配置CAN_Configuration,调整波特率。
在这里插入图片描述  接下来,拉取CAN unpack解析模块,模块的输出(即解析后的信号)可以手动添加,也可以利用dbc文件来导入。实际工程中多用dbc的方式。如下图所示:
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第2张图片
  信号解析过后,通常会将解析后的各种信号以结构体的形式封装起来。这里就需要用到Bus Creator控件
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第3张图片  这里注意,Bus Creator中的Output data type需要利用Bus editor进行编辑,可以自己手动添加。也可以利用Matlab命令读取我们先前写好的头文件
在这里插入图片描述
PS!!!头文件定义的结构体,信号一定要与unpack模块输出的顺序和数量保持一致,否则会编译出错。
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第4张图片
  保存工程,生成代码(Embedded Code Generation),如下所示:基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第5张图片

方式二(推荐):
  一般来说,在解析CAN报文前,都会在Simulink中制作相关的sldd/mat文件,主要定义如下结构:
1.CAN_RX_BUS结构
  此结构用于生成CAN_MESSAGE,用于接收物理层的CAN报文,同时待解析的raw_data也是来自于此。如下图所示:
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第6张图片2.定义各报文的结构体
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第7张图片
3.搭建CAN_UNPACK模型
  搭建完CAN_RX_BUS和各报文的结构体后,就可以搭建模型了,节选一个报文为例,如下图所示:
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第8张图片
4.生成代码

CAN_RX_BUS及各报文的结构体在.h文件中生成,如下所示
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第9张图片
解析函数在.c文件中定义,如下所示基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第10张图片
  最后将底层接收的CAN_MSG传入我们定义好的结构体如CAN_RX_BUS.Config_8_Receive__CAN_2_ID__xxx即可

  总结,无论采用哪种方式,解析的方式都是一样的,即UNPACK模块,但解析过程的报文输入和解析结果输出有所不同,也就是方式一和方式二的区别,核心是掌握Simulink中Bus Creator和Bus Selector的用法,灵活使用。

二. CAN PACK
  CAN PACK过程相反,CAN PACK模块的输入为各报文的信号值。
基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第11张图片基于Simulink实现CAN报文解析(unpack)与打包(pack)任务_第12张图片
  CAN信号的输出会根据out1模块的命名生成相应的  CAN_MESSAGE结构体,将此结构体与底层CAN_TX API接口关联即可。

三.总结
  不论是UNPACK还是PACK,其本身的模块是不变的,重要的是如何根据需求生成相应的数据结构,这取决于我们对BUS的灵活应用。
  如有疑问,欢迎指出,相互学习。

你可能感兴趣的:(汽车电子,C语言)