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小时内删除。

相关推荐
Boilermaker199214 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
MM_MS15 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
꧁Q༒ོγ꧂15 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs15 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_9915 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
古城小栈15 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
ghie909016 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体116 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk99816 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
AI小怪兽16 小时前
基于YOLOv13的汽车零件分割系统(Python源码+数据集+Pyside6界面)
开发语言·python·yolo·无人机