昨天参加了Mathworks公司在东南大学举办的关于MATLAB的培训,内容是关于MATLAB/SIMULINK的嵌入式代码生成以及物理建模,在这里把代码生成的步骤及一些相关内容总结一下。
嵌入式代码生成
嵌入式代码生成主要利用的是MATLAB中自带的MATLAB Coder模块,MATLAB Coder可以从MATLABcode产生可读且可移植的C/C++程序,支持多数MATLAB语言和工具箱,可以将产生的程序作为源程序、静态库或动态库集成到项目中,可在MATLAB环境中使用产生的程序来加快MATLAB代码的执行速度。
接下来就以一个非常简单的例子来举例说明嵌入式代码生成的步骤。
1.创建模型
这个模型很简单,输出Out1等两个输入信号Input1和Input2之和再乘以增益k(这里先用2代替),即:
其中,x和y在其他模块中定义,z和k在本模块中定义(这个影响后面数据管理中各个参数的属性,后面再说,现在不管)。
2.更改设置
上文提到代码生成利用的是MATLAB自带的MATLAB Coder模块,打开SIMULINK中的Configuraton Parameters模块
或者Ctrl+E可行。打开之后,
第一步:更改求解器设置
因为我们生成的代码是需要下载到单片机中的,而单片机中的计时是按照它的频率严格进行的,因此求解器中的求解步长要与单片机的步长一致,否则就会出错,所以这里将求解器类型改为定步长,离散,步长时间设置为0.01s(即10ms)。
第二步:Code Generation设置
将System target file一栏中默认的grt.tlc改为ert.lic,更改方式:可以直接将g改为e,也可以点击后面的Browse,然后选中ert.tlc(Embedded Coder),这一设置的目的在于生成的代码是嵌入式C代码,与grt.tlc相比,代码量小了很多,这一点对于单片机原本就不大的内存空间很有意义,有兴趣的可以自行比较一下。
这一步的目的在于可以在代码生成之后自动显示出来,不勾选的话无法直接看到代码。
第三步:代码生成
单击Build Model模块,或者Ctrl+B也行。
然后就可以看到生成的代码了。
红色方框圈出的就是我们想要实现的效果,但是可以看到这个公式和我们想要的还有一些距离,对,接下来要做的就是关键部分了。
3.数据管理
数据管理的方式有好几种,SIMULINK中使用的方法是:使用数据对象管理数据。
在面向对象的编程模式下,有一个很重要的概念——类,类是一种抽象,抽象出具有某一类事物具有共同属性的操作;还有一个概念——包,包可以把相关的类打包到一起,以便于管理;最后,就是对象,对象和类是对应存在的,对象是类的实体,而类是对象的抽象。
SIMULINK在进行数据管理的时候,提供了两个包供我们使用,分别是Simulink Package和Mpt Package,而我们要使用的就是Simulink Package。下面以Simulink Package简单介绍包、类、对象及对象的属性。
如上图所示,Simulink包中有Signal和Parameter两个类,Signal有Data Type、Data Storage Class、Dimensions等属性,而Parameter则有Data Type、Data Storage Class等属性。下图所示的即为Signal的属性图。
数据管理简单来说就是对上图中的各种属性进行管理,其中,最重要的就是数据类型(Data Type)和存储类(Storage Class)。数据类型很简单,而存储类比较麻烦,是影响数据存储的重要因素。模型中的信号,我们可能定义为全局变量,也可能定义为全局变量;模型中的参数,我们可以定义为常数型变量,也可以定义为宏定义。所有这些,都是通过对存储类进行管理进行实现的。
说了那么多,接下来就看看具体如何进行数据管理。
使用信号对象管理信号:
第一步:
在信号线上定义信号名。鼠标双击信号线,出现编辑框之后,写上信号线的名字x、y、z;
第二步:
在Data Dictionary或Base Workspace里定义同名的信号对象(这里推荐使用Data Dictionary,因为数据字典会使用一个专门的文件进行信号的管理,下同)。在Model Explorer里,选中Data Dictionary或Base Workspace,然后添加三个Simulink Signal,并改名为x、y、z,设置x、y的Storage Class为ImportedExtern,将z 设置为ExportedGlobal;
然后点击左下角出现的方框
第三步:
将信号对象和信号线关联起来。鼠标右键信号线,选择Properties,然后选中Singal name must resolve to Simulink signal,成功设置字之后信号名前面会出现一个蓝色的“E”。
使用参数对象管理参数:
第一步:
定义参数。双击增益模块gain,更改参数值为k;
第二步:
定义参数对象。在Model Explorer里,选中Data Dictionary或Base Workspace,添加Simulink Parameter,改名为k,定义k的初始值为2,设置Storage Class为const Volatile。
至此,代码生成的步骤就结束了,再按Ctrl+B就可以生成想要得到的代码了。