Simulink代码生成: While Iterator子系统及其代码

时间:2024-05-22 22:28:42

本文研究Simulink中的While Iterator子系统及其生成的代码。

1 Simulink中的While Iterator子系统

在C语言中,除了for循环以外,还可以通过while或者do-while完成循环。在Simulink中,除了For Iterator子系统以外,也有相应的While Iterator子系统。

新建一个While Iterator子系统(While Iterator Subsystem)如下。
Simulink代码生成: While Iterator子系统及其代码

2 While Iterator子系统建模示例

本例通过While Iterator子系统建模实现从1累加到n的过程,n是外部输入的信号。
1)首先双击进入子系统,将While Iterator模块设置如下:
Simulink代码生成: While Iterator子系统及其代码

  • Maximum number of iterations是指最大迭代次数,这里设为-1表示没有最大迭代次数,while循环的中止条件由外部决定而不由迭代次数决定
  • While loop type是指循环类型,这里选择while循环。其他情况下也可以选择do-while
  • States when starting选为reset,表示每一个时间步都会重置
  • Show iteration number port表示迭代次数,勾选上,后面建模会用到这个迭代次数

2)搭建累加和判断模块如下:
Simulink代码生成: While Iterator子系统及其代码

  • 通过迭代次数和Inport1做比较,输入给cond来决定While Iterator子系统是否执行。这里为什么用<来比较而不是<=来比较,可以自己仔细思考一下。
  • IC是初始条件,这里设为恒定为1
  • 后面通过Unit Delay模块来累加

3)在子系统外部添加常数和disp观测,并运行模型。
Simulink代码生成: While Iterator子系统及其代码
可以看出,输出值6是1+2+3的总和。

3 While Iterator子系统的代码

1)将模型的输入输出替换成port模块如下:
Simulink代码生成: While Iterator子系统及其代码
2)生成代码如下:
Simulink代码生成: While Iterator子系统及其代码
代码比较容易看懂,做一点简单解释。

  • s1_iter变量对应模型中的迭代次数,也就是While Iterator模块的输入口。每个循环都会将s1_iter,并加到Out1上面去
  • loopCond是while循环的条件,初始循环条件是由In2决定的,对应着模型中的IC输入口;在循环的过程中,loopCond也会通过关系比较而不停地变化,直到loopCond变成false后就退出while循环
  • 这里就能看出为什么关系比较要用小于号而不是小于等于号,因为第一次执行while循环,是外部决定的

如果用do-while循环也可以实现这个简单的累加功能,可以自己尝试一下。

4 总结

While Iterator子系统在建模中也会有用到的场景,但是感觉上应该不多,了解到就行了。

>>返回个人博客总目录