Simulink中流控制是通过自带的模块实现的,跟M语言及C语言中提供的流控制类别一样,包括If else、Switch、For和While 4个种类。对于后两者来说,共同特点是每次循环不仅可以通过判断条件来执行,还可以通过设置固定的循环上限来限制循环次数,避免无法跳出循环。
1. While流控制
Simulink的While流控制是通过While Iterator子系统实现的,它包含2个输入口,2个输出口,如下图所示。这个模块本身是原子子系统,其内部模块的采样时间有强制性要求,只能是inf和-1。inf表示常数模块,整个仿真过程中不需要采样时间来更新其值,-1表示继承父层模型的采样时间。如果条件为真,那么子系统在当前的步长内反复执行,直到达到最大循环次数或者判断条件为假。
当模块的While loop type 选择while时,While iterator模块有2个输入端口:cond和IC,子系统里还有In模块作为子系统的输入端口。Out模块作为子系统的输出端口,根据使用时的具体情况可以调整输入或输出端口的个数。Cond为while循环的判断条件,只有条件成立时才能触发循环;IC为初始条件输入端口,初始条件输入信号必须为真才能够进行while循环。只有cond和IC都为真时才能够触发循环进行下去。如果cond为假、IC为真,则仅进行一次循环。
2. For循环控制
For循环控制是通过For Iterator Subsystem的原子子系统实现。内部模块采样时间只能是inf或-1.该模块默认提供一个输入端口和一个输出端口。For Iterator Subsytem模块如下所示。
该子系统内部核心模块为For Iterator模块,这个模块提供了多种设定及限制循环变量方式,包括通过对话框设置循环次数,通过外部输入设置循环次数以及通过外部变量设置当前循环变量值。子系统中除了For Iterator外,输入或输出及其他逻辑模块根据用户的需要进行建模。
3. If else控制
If else条件判断流控制主要由If模块实现,该模块默认有一个输入口、2个输出口,如下图所示。
根据输入u1判断,如果满足条件则从上支输出信号,不满足条件则从下支输出信号,这两个信号再分别使能一个If Action Subsystem,使用Merge模块将所有If Action Subsytem的输出结果集总,得到一个完整的逻辑输出。If模块的输入或输出可由用户设定。
4. Switch Case控制
通过流控制的Switch模块与Switch Case Action Subsystem可以实现不同case语句内动作的多样化,输出结果可以来自不同的信号线,并且输出值也可以赋值给不同的变量。
如下图所示,Switch Case模块默认有一个输入,2个输出。输入u1如匹配case分支值得要求,则可以触发此分支后所连接的Switch Case Action Subsystem。
从外观和逻辑上看,Switch Case模块较接近if-else的控制方式。Switch Case模块所能判断的分支是离散的数据点,与if else 区间连续地判断不同。并且要求输入数据、参数Case conditionds等数据类型保持一致。
Switch Case模块的输出,同样需要连接Action Subsystem模块。Switch Case Action Subsystem模块如上图所示。