Simulink代码生成: If-Action子系统及其代码

本文研究Simulink中的If-Action子系统及其生成的代码。

1 概述

If-Action子系统是一种特殊的子系统。参考Matlab帮助文件中的示例图片,可以对该系统有一个直观的认识。
Simulink代码生成: If-Action子系统及其代码
它是由动作信号触发,来决定子系统是否执行。动作信号通过If模块对输入的判断产生。最后用一个merge模块把各个子系统的输出结果合成。这种条件判断执行某些模块的方式,类似C代码中的if-else语句。

2 示例模型搭建

参照帮助文件里的例子,搭建一个If-Action子系统。

2.1 If模块

默认的If模块是一个输入信号和两条判断分支,如下图。
Simulink代码生成: If-Action子系统及其代码
双击If模块可以对其进行配置。可配置内容包括输入信号数量,条件表达式和显示else分支。注意如果有多个else if的表达式,要一起写在Elseif expressions中。
Simulink代码生成: If-Action子系统及其代码

2.2 If-Action子系统

If-Action子系统相比普通的子系统,在上方多了一个动作触发输入端。该输入端与If模块的输出相连,表明在If某款的某个判断条件下才执行这个子系统。
Simulink代码生成: If-Action子系统及其代码
与使能子系统相似,If-Action子系统中的输出模块也可以选择held或者reset。
Simulink代码生成: If-Action子系统及其代码

2.3 merge模块

如果整体的输出值在不同的条件下对应着不同的子系统的输出,就需要用merge模块把这些子系统的输出合并成一个。实际上也只有其中一个子系统的输出值是有效的。
Simulink代码生成: If-Action子系统及其代码

2.4 完整模型

依照帮助文档里的示例建立的完整模型如下:
Simulink代码生成: If-Action子系统及其代码
其中,输入和输出信号线关联了Simulink.Signal,为了使得生成的代码更直观。

两个If-Action子系统中没有加入任何运算策略,只是将输入的Input1或Input2输出到merge模块。

可以注意到,If模块的输出信号类型是action,而不是常见的single,uint,int等。而且信号线变成了虚线。这表明这根信号线是action信号线,用于触发If-Action子系统。

3 代码生成

Ctrl + B生成代码,如图所示:
Simulink代码生成: If-Action子系统及其代码
可以看出,step函数中是一段简单的if-else判断语句。其中判断条件Input3 > 0.0F对应了If模块的配置,花括号内的执行语句Output1 = Input1;和Output1 = Input2;对应If-Action子系统里的控制策略。

4 拓展

除了If模块,用Switch Case模块搭配If-Action子系统也可以实现条件判断的控制策略。建模方式相似,文章内就不做演示。
Simulink代码生成: If-Action子系统及其代码

>>返回个人博客总目录