本文研究Simulink中的可变子系统,及其生成的条件编译的代码。

1 问题引入

在工作的不同项目回对应着不同的需求,然后不同的需求可能会需要用不同的模型策略实现。此时,就可以使用 Variant子系统进行建模,并通过参数控制某个项目通过哪个子系统输出结果。并且,生成的代码还可以表现为宏定义的形式。

2 建模示例

本章节演示可变子系统的建模方法。

1)首先,在Matlab工作空间新建一个Simulink.Parameter参数对象,将其作为后面控制可变子系统的变量参数;
在这里插入图片描述
其中,谁当StorageClass为Define,对应了C代码中的宏定义。这样做为了后面在生成代码时生成宏的形式。

2)在空白模型中添加一个可变子系统,将其属性设置为如下:
在这里插入图片描述
右键子系统,点击Block Parameters,可以打开子系统的配置界面,设置成如下配置;

在这里插入图片描述

在表格中的Name列,表示子系统中的不同的子系统名称,分别设置为Gain_2和Gain_3,后面的Variant control表示用参数控制可变子系统中运行哪个子系a统。当P_Condition2执行Gain_2子系统,当P_Condition3执行Gain_3子系统。保存并退出。

3)双击进入可变子系统中,可以看到有两个子系统中的子系统,并且仔细观察可以发现输入输出口都不太一样。

在这里插入图片描述

两个子系统的名字对应着上一步中的Name配置,输入输出口要和外面的port保持一致,并且不能连接信号线。

4)在两个子系统中分别用Gain模块,但是一个参数是2,另一个是3;
在这里插入图片描述
在这里插入图片描述
由于第一步中设置的P_Condition数值为2,所以上面的Gain_2子系统是实线,下面的Gain3子系统是阴影。

5)到了这一步,建模就已经完成了。可以验证一下,在模型最上层加一个输入为常数1,输出为display模块;
在这里插入图片描述
当P_Condition数值为2时,Update一下模型后,输出为2;
在这里插入图片描述
当P_Condition数值为3时,Update一下模型后,输出为3;
在这里插入图片描述
这就表示,可变子系统中究竟走哪一路,是根据参数P_Condition来控制的。在实际工作中,针对不同的项目,修改一下P_Condition参数的数值,就可以执行不同的控制逻辑和策略。

3 代码生成

将顶层模型换成Inport和Outport端口,Ctrl + B生成代码。

在P_Macro.h文件中,生成了P_Condition的宏定义,数值为2;

在这里插入图片描述

在step函数中,通过判断P_Condition的数值来决定执行哪个赋值语句,并且是#if形式的条件判断,而不是C语言中的if条件语句。这样有个好处为,在编译器编译这段代码时,可以跳过P_Condition == 3下面的语句,从而节省了控制器的flash资源。

在这里插入图片描述

4 总结

可变子系统可以通过判断条件,来决定内部执行不同的逻辑,生成代码也可以生成宏的形式。

>>返回个人博客总目录

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐