MATLAB的Simulink的While子系统(动作子系统)

可以用Simuklink 中 Ports &. Subsystems模块库的 While子系统创建类似C语言的循环控制流语句。子系统图标如图所示。

While Iterator 子系统

子系统内容


1.While子系统执行流程过程

在 Simulink 的 While控制流语句中, Simulink在每个采样时刻都要反复执行While子系统中的内容,即原子子系统中的内容,直到满足While Iterator模块指定的条件。而且,对于每一次While Iterator模块的迭代,While子系统中所有模块的更新方法和输出方法都会被执行一次。

Simulink在每个步长内执行 While子系统的迭代过程中,仿真时间并不会增加。但是,While子系统中的所有模块会把每个迭代作为一个采样时间进行处理,因此在While循环中,带有状态的模块的输出取决于上一时刻的输入,这种模块的输出反映了在While循环中一次迭代的输入值,而不是上一个仿真时间步的输入值。例如,假设在 While子系统中有一个Unit Delay模块,该模块输出的是在while循环中上一次迭代的输入值,而不是上一个仿真时间步的输入值。

可以用While Iterator模块执行类似C语言的while或do-while循环,它是While子系统内部的控制器模块,在 while loop type设置不同选项时端口输入个数不同,框图如图所示。通过While Iterator模块对话框中的 While loop type可以选择不同的循环类型,如图所示。

(1)do-while

在这个循环模式下,While Iterator模块只有一个输入,即 while条件输人,它必须存在于While子系统内。 在每个采样时间内,While Iterator模块会执行一次子系统内的所有模块 ,然后检查while条件输人是否为真,如果输入为真,则 While Iterator模块再执行一次子系统内的所有模块,只要 while条件输入为真,而且循环次数小于或等于While Iterator模块对话框中的 Maximum number of iterations参数值时,这个循环执行过程会一直继续。

(2) while

在这个循环模式下,While Iterator模块有⒉个输入: while条件输入和初始条件(IC)输入。初始条件信号必须在 While子系统外提供在仿真时间开始时,如果IC输入为真,那么While Iterator模块会执行一次子系统内的所有模块,然后检查 while条件输入是否为真,如果输入为真,则While Iterator模块会再执行一次子系统内的所有模块,只要 while条件输入为真,而且循环次数小于或等于While Iterator模块对话框中的Maximum number of iterations参数值时,这个执行过程会一直继续下去。如果在仿真时间开始时IC输入为假,那么在该采样时间内 While Iterator模块不执行子系统中的内容。

当把 While Iterator模块放置到子系统中时,在给定条件为真的情况下,While Iterator模块会在当前采样时间反复执行子系统中的内容。如果子系统不是原子子系统,那么把 While Iterator模块放置到子系统中会使该子系统自动成为原子子系统。


2.实例

现举例说明while子系统具体用法:设置While loop type为 while时,为了使第一次可以进人while执行,使输入IC为真,子系统每个采样步长内完成特定迭代次数,模型如图所示。

While iterator内部累加值每迭代一次加一,每次迭代求和运算将while iterator 内部累加值进行累加,当此累加值小于等于100时,循环执行,当条件不满足时退出 while语句,从零开始一直到N的整数进行累加示波器最终输出当累加结果刚大于等于100 时N的值。注意While子系统中的所有模块会把多个迭代在一个采样步长内进行处理,例如单位延时的输出是上一次迭代输入值而不是上一个采样步长的输入值。模型如图所示。

复制代码
单位延时模块的输出是上一次迭代的输入值,不是上一个采样步长的输入值
第1次 IC满足真,循环执行一次   out1输出1 Unit Delay 输出0  
累加条件输出 0 + 1 = 1
第2次 当 Unit Delay输出小于等于100时,循环条件成立,并且此时的循环次
数小于设定的最大循环次数,循环执行一次  out1输出2 Unit Delay 输出0+1(上一次迭代时的
输入值) 累加条件输出 0 + 1 +2= 3
第3次 out1输出3  Unit Delay 输出0+1+2 累加条件输出0+1+2+3=6
第4次 out1输出4  Unit Delay 输出0+1+2+3 累加条件输出0+1+2+3+4=10
...
第13次 out1输出13   Unit Delay 输出0+1+2+3+...+12+13 =91
第14次 out1输出14   Unit Delay 输出0+1+2+3+...+12+13+14 =105
此时的累加值大于100,不满足循环条件,结束while循环。

当number of iterators达到1000时也可以退出while语句,这个参数就是为了避免无限循环。双击 While Iterator模块,打开其参数对话框如图所示。

上述模型等价于以下程序

Matlab 复制代码
clc;
clear all;
close all;
max_sum = 100;
max_iterations = 1000;
sum = 0;
iteration_number=0;
cond = (max_sum >0);
while(cond~=0)
    
    iteration_number = iteration_number + 1;
    sum = sum + iteration_number;
    if(sum>max_sum || iteration_number > max_iterations)
        cond = 0;
    end
end
sum
 iteration_number 

程序运行结果

Matlab 复制代码
sum =

   105


iteration_number =

    14

探究运行过程,将仿真设置为固定步长,采样时间设置为1s。

示波器输出


参考内容

1\] 孙忠潇.Simulink仿真及代码生成技术入门到精通\[M\].北京:北京航空航天大学出版社,2015. 本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

相关推荐
小短腿的代码世界9 分钟前
打印不止是QPrinter:深入Qt Print Support框架的内核设计与跨平台输出管道
开发语言·qt
性野喜悲9 分钟前
python将excel中的链接转成图片并替换链接展示在excel中【将pdf的第一页插入excel并将对应信息获取到插入签名等位置】
开发语言·python·excel
诙_11 分钟前
C++代码实践应用
开发语言·c++
谙弆悕博士12 分钟前
【附C语言源码】从零实现命令行贪吃蛇游戏
c语言·开发语言·学习·游戏·游戏程序·小游戏·贪吃蛇
Evand J25 分钟前
【无人机编队控制程序4】复杂障碍环境下多无人机编队避障(人工势场法APF)与协同控制,MATLAB仿真例程
开发语言·matlab·无人机·控制·apf·避障
南宫萧幕1 小时前
基于 MATLAB 的插电混动汽车 CD-CS 策略 WLTC 前向仿真实现
开发语言·matlab·汽车
代钦塔拉1 小时前
第一篇:工业级 C++/Qt 项目头文件包含原则:告别循环依赖与编译玄学
开发语言·c++·qt
谷雨不太卷1 小时前
Linux基础IO
java·开发语言
神仙别闹2 小时前
基于PHP+MySQL实现在线考试系统
开发语言·mysql·php