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 可配置子系统(选择子系统)

可配置子系统只能在用户自定义的模块库中使用,可配置子系统的优点在于设计者可以任意切换子系统的内部模块,快速比较出那种组合会满足系统设计需求。

posted @ 2020-01-30 14:01  叮叮当当sunny  阅读(7940)  评论(0编辑  收藏  举报