虽然说基于模型的设计(Model Based Design,MBD)就是未来嵌入式控制开发的主流方法,但是很多工程师都是C代码的高手,对Simulink并不是很熟悉,尤其是自动代码生成。在进行Simulink模型代码自动生成的时候,也会习惯性的去想生成的代码如何匹配脑子里所想的C代码。
那么,Let's Go!
Typedef
要得到:typedef double float_64;
怎么做:用Simulink.AliasType数据对象。
实例一
因为是第一个例子,过程会稍微介绍得详细一些。
1. 建一个简单的Simulink模型
给信号分别命名为u1和y1,Gain模块的参数设置为k。
2. 代码生成基本配置
求解器:定步长—离散求解器
系统目标文件:ert.tlc
这时候Ctrl+B,可以生成代码了。只不过此时u1,y1以及k都不是我们想要的定义方式。
3. 新建数据对象
打开Model Explorer,点击菜单的Add,在base workspace里定义如图三个数据对象。
新建Simulink.AliasType,名字为float_64,并把Base type设置为double。这样,在生成代码的时候,就会出现这一句:typedef double float_64。
新建Simulink.Signal,名字为u1;新建Simulink.Parameter命名为k。注意它们Data Type与Storage class的定义。
4. 将Simulink信号线与workspace的数据对象关联
在信号线u1上右键,设置它的属性,勾选Signal name must resolve to Simulink signal object,信号线上会出现如后图的蓝色小叉子。这样这个信号u1就会使用它所关联的数据对象u1所定义的方式来生成代码。
除了这种关联的方式之外,还可以直接设置信号的属性。比如右键单击信号y1,设置它的属性如图。
参数k不需要手动关联。
显示模块端口的数据类型,得到如下图的显示。( 点击模型的菜单Display -> Signal&Ports -> Ports Data Type)
5. 生成代码查看结果
Ctrl+B生成代码。
代码生成报告打开,在模型名_types.h文件里,看得到了这句typedef。这是之前定义Simulink.AliasType得到的结果。
里面的real_T是E-Coder默认的对double的typedef:
同时,可以看到模型中的u1,y1以及k的定义,这是之前将信号和参数绑定到数据对象而得到的结果。
总结
要得到:typedef double float_64;
怎么做:用Simulink.AliasType数据对象
全部0条评论
快来发表一下你的评论吧 !