Simulink仿真入门到精通(四) Simulink子系统
4.1 Simulink子系统详解
4.1.1 子系统概述
Simulink根据仿真特性将模块的属性分为两种:虚拟模块和非虚拟模块。
非虚拟模块在仿真过程中起到实际的作用,对其进行编辑或者增加删除操作会影响到模型运行和改变模型的结果。
虚拟模块在仿真过程中不起实际作用,主要是为了从图框上进行程序的层次性划分以保持模型的图形界面的整洁性。
4.1.2 Simulink模型的运行顺序
Simulink模型的计算顺序是基于时间采样和信号流向的,即按照时间的顺序执行。 每一个采样点时间,模型中所有模块的状态和输入/输出值都要计算并更新一下,每个模块的输出值都通过信号线连接并传递给下一个模块的输入。系统采样时间由解算器类型和步长共同决定,并且作为Simulink模型仿真的最小粒度。当系统采样时刻到来时,每个模块再根据自身所设定的采样时间方式决定是否在当前这个采样时刻进行计算。
允许用户设定采样时间的模块在其参数对话框中都提供Sample Time这个属性。对于模块的Sample Time,常用的值有:
- -1:继承输入信号采样时间,若没有输入信号,则继承父层模型采样时间,如果模块无输入并且本身处于顶层模型中,则继承系统解算器的步长。
- 0:连续采样时间。
- 非零正数:离散采样时间。
- Inf:无穷大采样时间,即不采样。
- [Sampletime,offset]:Sampletime为上述一种,offset为相对于这个采样时刻的时间偏移量。如[0.2,0.01]表示在0.01s、0.21s、0.41s等时刻进行计算。
Display→Blocks→Sorted Executed Order可以显示模块的执行顺序。
标注格式为红色的m:n,m表示模块在模型中执行的优先度,n表示 在同一个采样时刻,模块所处的执行次序号。
4.1.3 各种子系统的特点与功能
1. 虚拟子系统
在执行仿真之前就展开子系统,实际上如同没有建立子系统一样。
2. 非虚拟/原子子系统
非虚拟原子子系统内的模块作为一个单元执行,右击虚拟子系统,在Block Parameter中勾选Treat as atomic unit,即可创建原子子系统。
(1)条件子系统
①使能子系统
在驱动子系统使能端口的输入信号大于零时执行使能子系统。
用户可以通过在虚拟子系统内放置Enable模块的方式来创建使能子系统,并通过Enable模块中的States when enabling参数配置子系统内的模块状态。
此外,如果子系统内部存在Out模块,利用Out输出模块的Output when disabled参数可以把使能子系统的输出端口配置成保持最后一个有效采样时刻的输出或复位为初始值。
②触发子系统
触发子系统只有在驱动子系统触发端口的信号上升沿或下降沿到来时才会执行,触发信号沿方向由Trigger端口模块中的Trigger type参数决定。
③触发使能子系统
同时放置Trigger和enable。
(2)动作子系统
Action子系统必须由If模块或Switch Case模块执行,与这些子系统模块连接的所有Action子系统必须具有相同的采样时间。
用户可以通过在子系统内部放置Action Port模块的方式来创建Action子系统。
(3)选择子系统
①可变子系统:内部包括多个子系统,当某条件成立时执行与之相应的子系统。每个子系统匹配一个变量的值,每次仿真时根据这个变量的值决定内部哪一个子系统处于激活状态。
②可配置子系统:用来代表用户自定义库中的任意模块,只能在用户自定义库中使用,动态表示自定义库中的某一模块。
4.2 Simulink子系统示例
4.2.1 虚拟和非虚拟子系统
右击子系统,选择Block parameters,勾选Treat as atomic unit,子系统即成为原子子系统,子系统图标黑色外框加宽,此时子系统可以整体设置采样时间。
4.2.2 使能子系统
仅在使能信号使能时执行一次。
- simin=[0:10;[0 1 1 0 1 1 1 1 1 1 0]]';
4.2.3 函数调用子系统(条件子系统)
这种子系统只能被函数调用信号所触发。
函数调用子系统的执行不是由Simulink引擎直接控制的,而是由调用它的S函数通过mdlOutputs/mdlUpdates子方法来决定的。
S函数构成的模块具有两个函数调用类型的输出,根据输入信号的奇偶值分别调用两个函数调用子系统,两个函数调用子系统的执行时间不重合,被Merge模块合并到一个输出,输出为当前仿真时刻处于激活状态的子系统输出。
函数调用子系统1的内部为常数输出,函数调用子系统2的内部为正弦波输出。
4.2.4 While子系统(动作子系统)
(1)do-while
在这个模式下,While Iterator只有一个输入,即while条件输入,它必须在while子系统内。
在每个采样时间内,While Iterator模块会执行一次子系统内的所有模块,然后检查while条件输入是否为真,如果输入为真,则While Iterator模块再执行一次子系统内的所有模块,只要while条件输入为真,而且循环次数小于或等于While Iterator模块对话框中的Maximum number of iterations参数值时,这个循环过程会一直执行。
(2)while
在这个循环模式下,while Iterator模块有2个输入:while条件输入和初始条件输入(IC),初始条件信号必须在while子系统外提供。
在仿真开始时,如果IC输入为真,While Iterator模块会执行一次子系统内的所有模块,然后检查while条件输入是否为真,如果输入为真,则While Iterator模块再执行一次子系统内的所有模块,只要while条件输入为真,而且循环次数小于或等于While Iterator模块对话框中的Maximum number of iterations参数值时,这个循环过程会一直执行。如果在仿真时间开始时IC输入为假,那么在该采样时间内While Iterator模块不执行子系统中的内容。
注意:当把While Iterator模块放置到子系统中时,在给定条件为真的情况下,While子系统中所有模块会在当前采样时间反复执行子系统中的内容,即把多个迭代在一个采样步长内进行处理。如果子系统不是原子子系统,那么把While Iterator模块放置到子系统中会使该子系统自动成为原子子系统。
上面模型的效果等价于以下代码:
- 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
也等于以下简化的代码:
- for i=1:1000
- sum_i=sum(1:i);
- if(sum_i>100)
- break;
- end
- end
4.2.5 可变子系统(选择子系统)
可变子系统内装了多个child子系统,其输入/输出端口不需要连线,每个child子系统都有一个对应的变量或表达式,某个child子系统的变量或表达式值为真时此子系统就被激活。Simulink的采样时刻到来时最多只有一个child子系统被激活,可以通过变量方便地控制其中某一个child子系统的执行。
右击子系统,选择Block parameters(subsystem)。
左侧排列5个按钮,第一个用来在可变子系统内建立child子系统,第二个用来在可变子系统内建立模型选择框,第三个用来编辑激活child子系统的条件,第四个用来打开选中的child子系统,第五个用来更新信息列表。
右侧是一个列表框,第二列Variant control表示Condition的Simulink.Variant对象,其内部包含一个判断条件condition,即是第三列参数,由用户指定一个逻辑表达式,当条件满足时,此条件所对应的child子系统会被激活。
在工作区输入sel=2;则第二个child子系统被激活。第一个子系统设置增益2,第二个子系统设置增益3,仿真结果如下。
4.2.6 可配置子系统(选择子系统)
可配置子系统只能在用户自定义的模块库中使用,可配置子系统的优点在于设计者可以任意切换子系统的内部模块,快速比较出那种组合会满足系统设计需求。
Simulink仿真入门到精通(四) Simulink子系统的更多相关文章
- Simulink仿真入门到精通(十九) 总结回顾&自我练习
从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...
- Simulink仿真入门到精通(十四) Simulink自定义环境
14.1 Simulink环境自定义功能 sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制.若sl_sustomiz ...
- Simulink仿真入门到精通(十八) TLC语言
TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...
- Simulink仿真入门到精通(十七) Simulink代码生成技术详解
17.1 基于模型的设计 基于模型设计是一种流程,较之传统软件开发流程而言,使开发者能够更快捷.更高效地进行开发.适用范围包括汽车电子信号处理.控制系统.通信行业和半导体行业. V字模型开发流程整体描 ...
- Simulink仿真入门到精通(十一) 模块的封装
当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...
- Simulink仿真入门到精通(五) Simulink模型的仿真
5.1 模型的配置仿真 由各种模块所构建的可视化逻辑连接,只是模型的外在表现,模型仿真的核心驱动器是被称作解算器(Solver)的组件,相当于Simulink仿真过程的心脏,驱动着模型仿真,它在每一个 ...
- Simulink仿真入门到精通(三) Simulink信号
3.1 Simulink信号概述 所谓信号,表示一种随着时间而变化的量,在时间轴上的采样时刻都对应有数值. 信号在Simulink中是相当重要的组成部分,有线(line)表示,在模型中穿针引线地将各模 ...
- Simulink仿真入门到精通(二) Simulink模块
2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...
- Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...
随机推荐
- java课java方法动手动脑
动手动脑: import java.util.Scanner; public class Random { public static void main(String[] args) { ...
- JS代码,从一个数组中得到连号的数并显示
JavaScript code function m() { var k = [1, 2, 7, 8, 9, 11, 22, 35, 36]; ) return; ; ; ; ; i < k.l ...
- Python||NameError: name 'reload' is not defined
多半是运行如下代码时报错: import sysreload(sys)sys.setdefaultencoding("utf-8")123这段代码是为了解决Python中中文输出出 ...
- CSS面试题&知识点汇总
问题&答案 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? 有两种, IE 盒子模型.W3C 盒子模型: 盒模型: 内容(content).填充(padding).边界(m ...
- Android Studio调用系统隐藏接口EthernetManager
google source签名文件参考:https://android.googlesource.com/platform/build/+/donut-release/target/product/s ...
- Hibernate实现步骤
1. 引入jar文件(hibernate3.jar, lib\required目录下所有的jar,log4j记录的log4j-1.2.16.jar,slf4j-log4j12-1.5.8.jar,oj ...
- string删除与查找erase,find
s.erase( 指针位置 , 删除长度 ) 返回值修改后的string对象引用 find(string, int):第一个参数用来指示要查找的字符,第二个参数用来表示从字符串的何处开始查找子串(默认 ...
- Spring中@Resorce和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- babel-loader的原理
本文转载自默语的博客. Babel包的构成 核心包 babel-core:是babel转译器本身,提供转译的API,例如babel.transform等,webpack的babel-loader就是调 ...
- Python野生库
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted