最新一直在研究simulink的代码生成,然后工作需要进行CAN报文的解析,就突发奇想能不能用simulink进行解析,然后查看了一些资料发现按照步骤进行建模,运行能成功但是代码却无法生成,会出现各种问题,然后发现是其中一些步骤在教程中被省略,但是新手又不知道那里被简化了,从而导致代码无法生成。
今天写一个简单的教程来帮助和我遇见一样问题的朋友来解决问题。按照此教程是可以进行代码的生成的,不过还是建议把报文解析的工作丢给底层工程师来解析。
下面是模型的概图:
1.在matlab根目录下can_message.h文件,copy出来到模型的相同目录下,点击打开看到结构体,里面定义了帧类型、长度、ID、等类型,重点注意Timestamp,引用这个头文件的时候不要把这个忘记了,不然代码生成就会出现问题。
2.新建一个数据字典,在里面添加一个simulink.Bus,然后点击启动类型编辑器;
3.点击BUS添加一个总线,选中总线和点击BUS_Element添加子类,数据类型和名称与can_message.h文件一致,然后保存;
4.回到simulink页面,打开库浏览器,找到can_unpack,添加到页面;
5.双击打开can_unpack,将自己的DBC文件导入,数据输出类型按照图中选,message list选项可以选择你要解析的DBC模块,然后点击应用,就会显示出端口;
6.在输入口这里,我们添加 几个常量模块来测试,分别按照can_message.h文件中的排序进行,信号的数据类型也要进行更改;
7.注意这里CAN_ID和DATA是十进制传递的,我们可以用8个常量来代表传递的数据,通过mux模块进行整合,将can类型通过bus creator模块整合成总线传递给CAN_UNPACK,注意DATA的数据类型是uint8的,所以要用一个转换模块进行转换
8.对于Buscreator模块,点开后要进行配置,输出的数据类型就是我们数据字典中创建的总线名字,总线的元素按照顺序添加,然后应用;
9.打开模型资源管理器,添加simulink信号,将要输入输出的信号都添加上,在代码生成这里,输入的全局变量选择外部导入,输出的选择导出全局,
10. 回到模型页面,将信号进行绑定,右键信号,属性,信号名称必须解析为simulink信号对象;
11.输出用显示模块来代替,用来验证模型是否正常;
12.上面模型建立完毕,开始进行模型配置;选择定步长,步长1毫秒;
13.代码生成这里系统目标文件ert.tlc;仅生成代码✔;
14.到此模型建立完毕,点击运行,仿真没问题,点击代码生成,代码OK;
这里可以看到我们定义的输入变量,后面只需要把常量改成输入输出模块即可;
运行时,填入数据,解析出来的数据和手算一样,模型没问题,文章至此结束。