1、第9章 使用子系统 第第9章章 使用子系统使用子系统 9.1 创建子系统创建子系统 9.2 创建条件执行子系统创建条件执行子系统 9.3 控制流语句控制流语句 第9章 使用子系统 9.1 创创建建子子系系统统当用户模型的结构非常复杂时,可以通过把多个模块组合在子系统内的方式来简化模型的外观。利用子系统创建模型有如下优点:减少了模型窗口中显示的模块数目,从而使模型外观结构更清晰,增强了模型的可读性;在简化模型外观结构图的基础上,保持了各模块之间的函数关系;可以建立层级方块图,Subsystem模块是一个层级,组成子系统的其他模块在另一层上。第9章 使用子系统 9.1.1 Simulink子系统定
2、义子系统定义1虚拟子系统虚拟子系统虚拟子系统在模型中提供了图形化的层级显示。它简化了模型的外观,但并不影响模型的执行,在模型执行期间,Simulink会平铺所有的虚拟子系统,也就是在执行之前就扩展子系统。这种扩展类似于编程语言,如C或C+中的宏操作。第9章 使用子系统 2非虚拟子系统非虚拟子系统(1)原子子系统(Atomic Subsystem)。原子子系统与虚拟子系统的主要区别在于,原子子系统内的模块作为一个单个单元执行,Simulink中的任何模块都可以放在原子子系统内,包括以不同速率执行的模块。用户可以在虚拟子系统内通过选择Treat as atomic unit选项来创建原子子系统。第
3、9章 使用子系统(2)使能子系统(Enabled Subsystem)。使能子系统的动作类似原子子系统,不同的是它只有在驱动子系统使能端口的输入信号大于零时才会执行。用户可以通过在子系统内放置Enable模块的方式来创建使能子系统,并通过设置使能子系统内Enable端口模块中的States when enabling参数来配置子系统内的模块状态。此外,利用Outport输出模块的Output when disabled参数可以把使能子系统内的每个输出端口配置为保持输出或重置输出。第9章 使用子系统(3)触发子系统(Triggered Subsystem)。触发子系统只有在驱动子系统触发端口的信
4、号的上升沿或下降沿到来时才会执行,触发信号沿的方向由Trigger端口模块中的Trigger type参数决定。Simulink限制放置在触发子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发子系统的执行具有非周期性,即子系统内模块的执行是不规则的。用户可以通过在子系统内放置Trigger模块的方式来创建触发子系统。第9章 使用子系统(4)函数调用子系统(Function-Call Subsystem)。函数调用子系统类似于用文本语言(如M语言)编写的S-函数,只不过它是通过Simulink模块实现的。用户可以利用Sta
5、teflow图、函数调用生成器或S-函数执行函数调用子系统。Simulink限制放置在函数调用子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为函数调用子系统的执行具有非周期性。用户可以通过把Trigger端口模块放置在子系统内,并将Trigger type参数设置为function-call的方式来创建函数调用子系统。第9章 使用子系统(5)触发使能子系统(Enabled and Triggered Subsystem)。触发使能子系统在系统被使能且驱动子系统触发端口的信号的上升沿或下降沿到来时才执行,触发边沿的方向由Tr
6、igger端口模块中的Trigger type参数决定。Simulink限制放置在触发使能子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发使能子系统的执行具有非周期性。用户可以通过把Trigger端口模块和Enable模块放置在子系统内的方式来创建触发使能子系统。第9章 使用子系统(6)Action子系统。Action子系统具有使能子系统和函数调用子系统的交叉特性,其只能限制一个采样时间,即连续采样时间、离散采样时间或继承采样时间。Action子系统必须由If模块或Switch Case模块执行,与这些子系统模块连接的
7、所有Action子系统必须具有相同的采样时间。用户可以通过在子系统内放置Action端口模块的方式来创建Action子系统,子系统图标会自动反映执行Action子系统的模块类型,也就是If模块或Switch Case模块。第9章 使用子系统 Action子系统至多执行一次,利用Output端口模块的Output when disabled参数,Action子系统也可以控制是否保持输出值,这是与使能子系统类似的地方。Action子系统与函数调用子系统类似,因为函数调用子系统在任何给定的时间步内可以执行多于一次,而Action子系统至多执行一次。这种限制就表示Action子系统内可以放置非周期性的
8、模块,而且也可以控制状态和输出的行为。第9章 使用子系统(7)While-子系统。While-子系统在每个时间步内可以循环多次,循环的次数由While Iterator模块中的条件参数控制。用户可以通过在子系统内放置While Iterator模块的方式来创建While-子系统。While-子系统与函数调用子系统相同的地方在于它在给定的时间步内可以循环多次,不同的是它没有独立的循环指示器(如Stateflow图),而且,通过选择While Iterator模块中的参数,While-子系统还可以存取循环次数,通过设置States when starting参数还可以控制当子系统开始执行时状态是否
9、重置。第9章 使用子系统(8)For-子系统。For-子系统在每个模型时间步内可执行固定的循环次数,循环次数可以由外部输入给定,或者由For Iterator模块内部指定。用户可以通过在子系统内放置For Iterator模块的方式来创建For-子系统。For-子系统也可以通过选择For Iterator模块内的参数来存取当前循环的次数。For-子系统在给定时间步内限制循环次数上与While-子系统类似。第9章 使用子系统 9.1.2 创建子系统创建子系统在Simulink中创建子系统的方法有两种:把Ports&Subsystems模块库中的Subsystem模块添加到用户模型中,然后打开Su
10、bsystem模块,向子系统窗口中添加所包含的模块;先向模型中添加组成子系统的模块,然后把这些模块组合到子系统中。第9章 使用子系统 1添加添加Subsystem模块创建子系统模块创建子系统首先将Ports&Subsystems模块库中的Subsystem模块拷贝到模型窗口中,如图9-1所示;然后双击Subsystem模块,Simulink会在当前窗口或一个新的模型窗口中打开子系统,如图9-2所示。子系统窗口中的Inport模块表示来自于子系统外的输入,Outport模块表示外部输出。第9章 使用子系统 图9-1 第9章 使用子系统 图9-2 第9章 使用子系统 用户可以在子系统窗口中添加组成
11、子系统的模块。例如,图9-3中的子系统包含了一个Sum模块,两个Inport模块和一个Outport模块,这个子系统表示对两个外部输入求和,并将结果通过Outport模块输出到子系统外的模块。此时的子系统图标也变成图9-3中的右图所示。第9章 使用子系统 图9-3 第9章 使用子系统 2组合已有模块创建子系统组合已有模块创建子系统如果模型中已经包含了用户想要转换为子系统的模块,那么可以把这些模块组合在一起来创建子系统。以图9-4中的模型为例,用户可以用鼠标将需要组合为子系统的模块和连线用边框线选取,当释放鼠标按钮时,边框内的所有模块和线均被选中;然后选择Edit菜单下的Create Subsy
12、stem命令,Simulink会将所选模块用Subsystem模块代替。第9章 使用子系统 图9-4 第9章 使用子系统 图9-5显示的是选择了 Create Subsystem命令后的模型。如果打开Subsystem模块,那么Simulink将显示下层的子系统模型,如图9-6所示。Inport模块和Outport模块只是表示来自于子系统外部的输入和输出到子系统外部的模块。第9章 使用子系统 图9-5 第9章 使用子系统 图9-6 第9章 使用子系统 9.1.3 浏览层级子系统浏览层级子系统用户可以利用Subsystem模块创建由多层子系统组成的层级模型,这样做的好处是显而易见的不仅使用户模型
13、的界面更清晰,而且模型的可读性也更强。对于模型层级比较多的复杂模型,一层一层打开子系统浏览模型显然是不可取的,这时用户可以利用Simulink中的模型浏览器来浏览模型。模型浏览器可以执行如下操作:按层级浏览模型;在模型中打开子系统;确定模型中所包含的模块;快速定位到模型中指定层级的模块。第9章 使用子系统 图9-7 第9章 使用子系统 模型浏览器只有在Microsoft Windows平台上可用,这里以Simulink中的engine模型为例介绍如何使用Windows下的模型浏览器。在engine模型窗口中选择View菜单下的Model browser options命令,在下拉菜单中选择Mo
14、del browser命令,即可打开模型浏览器,如图9-8所示。第9章 使用子系统 图9-8 第9章 使用子系统 此时模型窗口被分割为两个面板。左面的面板以树状结构显示组成模型的各层子系统,树状结构的根结点对应的是最顶层模型,所有的子系统以分支形式显示在左侧面板中;右面的面板显示对应系统的模型结构图。如果要查看系统的模型方块图或组成系统的任何子系统,则可以在树状结构中选择这个子系统,此时模型浏览器右侧的面板中会显示相应系统的结构方块图。图9-9中显示的是Throttle&Manifold子系统结构图,该子系统下还有两个子系统:Intake Maniflod和Throttle,可以单击这两个子系
15、统查看相应的结构图。第9章 使用子系统 图9-9 第9章 使用子系统 第9章 使用子系统 9.2 创建条件执行子系统创建条件执行子系统条件执行子系统也是一个子系统,但在模型中是否执行条件子系统则取决于其他条件信号。这个控制子系统执行的信号称为控制信号,控制信号在单独的控制输入端口进入子系统。当用户想要建立复杂的模型,而且模型中某些组件的执行依赖于其他组件时,条件执行子系统就非常有用了。第9章 使用子系统 Simulink支持如下几种类型的条件执行子系统:使能子系统(Enabled Subsystem):当控制信号为正时,使能子系统执行。该子系统在控制信号过零(从负到正方向)时开始执行,并且在控
16、制信号保持为正时继续执行。触发子系统(Triggered Subsystem):每次当触发事件发生时,触发子系统执行一次。触发事件可以发生在触发信号的上升沿或下降沿。触发信号可以是连续信号,也可以是离散信号。触发使能子系统(Triggered and Enabled Subsystem):当触发事件发生时,如果使能控制信号为正值,则触发使能子系统执行一次。第9章 使用子系统 控制流语句(control flow statement):控制流语句在控制流模块下可执行类似C语言的控制流逻辑算法,执行的模块均在被控制子系统内。在if-else和switch控制流中,控制模块均在被控制子系统外,并向被
17、控制子系统内的Action Port模块发送控制信号;而在while、do-while和for控制流中,具有重复控制的模块在子系统内,它没有明显的控制信号。第9章 使用子系统 9.2.1 使能子系统使能子系统使能子系统在控制信号为正值时的仿真步上开始执行。一个使能子系统有单个的控制输入,控制输入可以是标量值或向量值。如果控制输入是标量,那么当输入大于零时子系统开始执行;如果控制输入是向量,那么当向量中的任一分量大于零时子系统开始执行。例如,假设控制输入信号是正弦波信号,那么子系统会交替使能和关闭,如图9-10所示,图中向上的箭头表示使能系统,向下的箭头表示关闭系统。第9章 使用子系统 图9-1
18、0 第9章 使用子系统 1.创建使能子系统创建使能子系统若要在模型中创建使能子系统,可以从Simulink中的Ports&Subsystems模块库中把Enable模块拷贝到子系统内,这时Simulink会在子系统模块图标上添加一个使能符号和使能控制输入口。以图9-5中的模型为例,添加Enable模块后的子系统图标如图9-11所示。第9章 使用子系统 图9-11 第9章 使用子系统 打开使能子系统中每个Outport输出端口模块对话框,并为Output when disabled参数选择一个选项,如图9-12所示。选择held选项表示让输出保持最近的输出值。选择reset选项表示让输出返回到初
19、始条件,并设置Initial output值,该值是子系统重置时的输出初始值。Initial output值可以为空矩阵,此时的初始输出等于传送给Outport模块的模块输出值。在执行使能子系统时,用户可以通过设置Enable模块参数对话框来选择子系统状态,或者选择保持子系统状态为前一时刻值,或者重新设置子系统状态为初始条件。第9章 使用子系统 打开Enable模块对话框,如图9-13所示,为States when enabling参数选择一个选项:选择held选项表示使状态保持为最近的值;选择reset选项表示使状态返回到初始条件。第9章 使用子系统 图9-12 第9章 使用子系统 图9-1
20、3 第9章 使用子系统 Enable模块对话框的另一个选项是Show output port复选框,选择这个选项表示允许用户输出使能控制信号。这个特性可以将控制信号向下传递到使能子系统,如果使能子系统内的逻辑判断依赖于数值,或者依赖于包含在控制信号中的数值,那么这个特性就非常有用。第9章 使用子系统 2.允许使能子系统包含的模块允许使能子系统包含的模块使能子系统内可以包含任意Simulink模块,包括Simulink中的连续模块和离散模块。使能子系统内的离散模块只有当子系统执行时,而且只有当该模块的采样时间与仿真的采样时间同步时才会执行,使能子系统和模型共用时钟。使能子系统内也可以包含Goto
21、模块,但是在子系统内只有状态端口可以连接到Goto模块。例如,图9-14中的模型是一个包含四个离散模块和一个控制信号的系统。第9章 使用子系统 图9-14 第9章 使用子系统 模型中的离散模块如下:Unit Delay A模块,采样时间为0.25秒;Unit Delay B模块,采样时间为0.5秒;Unit Delay C模块,在使能子系统内,采样时间为0.125秒;Unit Delay D模块,在使能子系统内,采样时间为0.25秒。使能控制信号由标签为Signal E的Pulse Generator模块产生,该模块在0.375秒时由0变为1,并在0.875秒时返回0。第9章 使用子系统 图9
22、-15 第9章 使用子系统 Unit Delay A模块和Unit Delay B模块的执行不受使能控制信号的影响,因为它们不是使能子系统的一部分。当使能控制信号变为正时,Unit Delay C模块和Unit Delay D模块以模块参数对话框中指定的采样速率开始执行,直到使能控制信号再次变为0。需要说明的是,当使能控制信号在0.875秒变为零时,Unit Delay C模块并不执行。第9章 使用子系统 3.使能子系统的模块约束使能子系统的模块约束在使能子系统内,Simulink会对与使能子系统输出端口相连的带有恒值采样时间的模块进行如下限制:如果用户用带有恒值采样时间的Model模块或S-
23、函数模块与条件执行子系统的输出端口相连,那么Simulink会显示一个错误消息。Simulink会把任何具有恒值采样时间的内置模块的采样时间转换为不同的采样时间,如以条件执行子系统内的最快速离散速率作为采样时间。第9章 使用子系统 为了避免Simulink显示错误信息或发生采样时间转换,用户可以把模块的采样时间改变为非恒值采样时间,或者使用Signal Conversion模块替换具有恒值采样时间的模块。下面说明如何用Signal Conversion模块来避免这种错误发生。图9-16中的模型有两个带有恒值采样时间的模块,当仿真模型时,Simulink会把使能子系统内Constant模块的采样
24、时间转换为Pulse Generator模块的速率。如果用户选择了Format菜单下Port/Signal Displays子菜单下的Sample Time Colors命令来显示采样时间的颜色,那么Simulink会把Pulse Generator模块和使能子系统显示为红色,而把使能子系统外的Constant模块和Outport模块显示为深红色,以表示这些模块仍然具有恒值采样时间。接下来把模型保存为consys.mdl。第9章 使用子系统 图9-16 第9章 使用子系统 图9-17 第9章 使用子系统 图9-18 第9章 使用子系统 为了解决这个问题,在Model模块的第二个输出和使能子系统
25、的Outport模块之间插入一个Signal Conversion模块,如图9-19所示。这时再运行仿真,则没有错误产生。如果选择了Format菜单下Port/Signal Displays子菜单下的Sample Time Colors命令来显示采样时间的颜色,则Model模块和使能子系统模块都显示为黄色,表示这些模块都是混合系统,也就是说模型包含了多个采样时间。第9章 使用子系统 图9-19 第9章 使用子系统 4示例示例例例9-1 使能子系统。要求:系统在控制信号作用下实现不同的函数关系。给定的输入信号为正弦波信号,控制信号为方波信号,要求控制信号为正时驱动子系统输出正弦波信号的绝对值,禁
26、止子系统时输出重置为0;当控制信号为非零时驱动子系统输出饱和正弦波信号,禁止子系统时保持输出不变,饱和信号的幅值为-0.750.75。第9章 使用子系统 解答:解答:为了实现系统要求,需要建立两个使能子系统,并用方波信号驱动使能子系统。一个使能子系统当控制信号为正时执行,当禁止该子系统时它的输出被重置为零。另一个子系统利用逻辑NOT模块改变方波信号,当方波信号为非正时执行,当禁止该子系统时它的输出保持不变。这两个子系统的输出端口Out1模块可以配置为保持或重置两种类型,而且每个输出的行为可以不同。第9章 使用子系统 根据系统要求选择的Simulink模块如下:Sources模块库中的Sine
27、Wave模块和Pulse Generator模块,Pulse Generator模块产生方波控制信号;Ports&Subsystems模块库中的Subsystem模块和Enable模块;Math Operations模块库中的Abs模块;Discontinuities模块库中的Saturation模块。第9章 使用子系统 按照要求建立的系统模型图如图9-20所示。这里设置Abs使能子系统中Enable模块的States when enabling参数为reset;设置Out1模块的Output when disabled参数为reset,Initial output值为0,这样,当禁止该系统时
28、,系统输出重置为零。设置Saturation使能子系统中的Enable模块的States when enabling参数为held,Out1模块的Output when disabled参数为held,这样当禁止该系统时,系统输出保持不变。第9章 使用子系统 图9-20 第9章 使用子系统 图9-21 第9章 使用子系统 第一个窗口显示的是源正弦波曲线和正弦波曲线的绝对值,只有当Abs子系统被使能时才输出正弦波曲线的绝对值,这发生在02.5 s和57.5 s之间;当禁止Abs子系统时,子系统的输出被重置为0,0值是由输出端口的初始条件确定的。从第二个窗口曲线可以看到子系统被使能的时间,1值表示
29、使能Abs子系统。第二个窗口中的曲线显示的是使能信号,如果信号朝向曲线的顶部,那么Abs子系统被使能;如果信号朝向曲线的底部,那么Saturation子系统被使能。两个子系统之间的更换是由逻辑NOT模块决定的。第三个窗口中的曲线显示的是源正弦波曲线和饱和受限的正弦波曲线,只有当Saturation子系统被使能时才输出正弦波曲线的饱和值,这发生在2.55 s和7.510 s之间。第9章 使用子系统 9.2.2 触发子系统触发子系统触发子系统也是子系统,它只有在触发事件发生时才执行。触发子系统有单个的控制输入,称为触发输入(trigger input),它控制子系统是否执行。用户可以选择三种类型的
30、触发事件,以控制触发子系统的执行。上升沿触发(rising):当控制信号由负值或零值上升为正值或零值(如果初始值为负)时,子系统开始执行;下降沿触发(falling):当控制信号由正值或零值下降为负值或零值(如果初始值为正)时,子系统开始执行;双边沿触发(either):当控制信号上升或下降时,子系统开始执行。第9章 使用子系统 对于离散系统,当控制信号从零值上升或下降,且只有当这个信号在上升或下降之前已经保持零值一个以上时间步时,这种上升或下降才被认为是一个触发事件。这样就消除了由控制信号采样引起的误触发事件。例如,在图9-22所示的离散系统时间中,上升触发(R)不能发生在时间步3,因为当上
31、升信号发生时,控制信号在零值只保持了一个时间步。第9章 使用子系统 图9-22 第9章 使用子系统 用户可以通过把Ports&Subsystems模块库中的Trigger模块拷贝到子系统中的方式来创建触发子系统,Simulink会在子系统模块的图标上添加一个触发符号和一个触发控制输入端口。为了选择触发信号的控制类型,可打开Trigger模块的参数对话框,如图9-18所示,并在Trigger type参数的下拉列表中选择一种触发类型。Simulink会在Trigger and Subsystem模块上用不同的符号表示上升沿触发或下降沿触发,或双边沿触发。图9-23中的右图就是在Subsystem
32、模块上显示的触发符号。第9章 使用子系统 图9-23 第9章 使用子系统 如果选择的Trigger type参数是function-call选项,那么创建的是函数调用子系统,这种触发子系统的执行是由S-函数决定的,而不是由信号值决定的,关于函数调用子系统的详细内容,参看第12章。注意:与使能子系统不同,触发子系统在两次触发事件之间一直保持输出为最终值,而且,当触发事件发生时,触发子系统不能重新设置它们的状态,任何离散模块的状态在两次触发事件之间会一直保持下去。第9章 使用子系统 Trigger模块参数对话框中的Show output port复选项可以输出触发控制信号,如图9-24所示,如果选
33、择这个选项,则Simulink会显示触发模块的输出端口,并输出触发信号,信号值为:1表示产生上升触发的信号;-1表示产生下降触发的信号;2表示函数调用触发;0表示其他类型触发。第9章 使用子系统 图9-24 第9章 使用子系统 Output data type选项指定触发输出信号的数据类型,可以选择的类型有auto、int8或double。auto选项可自动把输出信号的数据类型设置为信号被连接端口的数据类型(或者为int8,或者为double)。如果端口的数据类型不是double或int8,那么Simulink会显示错误消息。当用户在Trigger type选项中选择function-call
34、时,对话框底部的Sample time type选项将被激活,这个选项可以设置为triggered或periodic,如图9-25所示。如果调用子系统的上层模型在每个时间步内调用一次子系统,那么选择periodic选项,否则,选择triggered选项。当选择periodic选项时,Sample time选项将被激活,这个参数可以设置包含调用模块的函数调用子系统的采样时间。第9章 使用子系统 图9-25 第9章 使用子系统 图9-26是一个包含触发子系统的模型图,在这个系统中,子系统只有在方波触发控制信号的上升沿时才被触发。图9-26 第9章 使用子系统 在仿真过程中,触发子系统只在指定的时间
35、执行,因此,适合在触发子系统中使用的模块有:具有继承采样时间的模块,如Logical Operator模块或Gain模块;具有采样时间设置为-1的离散模块,它表示该模块的采样时间继承驱动模块的采样时间。第9章 使用子系统 当触发事件发生并且触发子系统执行时,子系统内部包含的所有模块一同被执行,Simulink只有在执行完子系统中的所有模块后,才会转换到上一层执行其他的模块,这种子系统的执行方式属于原子子系统。而其他子系统的执行过程不是这样的,如使能子系统,默认情况下,这种子系统只用于图形显示目的,属于虚拟子系统,它并不改变框图的执行方式。虚拟子系统中的每个模块都被独立对待,就如同这些模块都处于
36、模型最顶层一样,这样,在一个仿真步中,Simulink可能会多次进出一个系统。第9章 使用子系统 例9-2 触发子系统。要求:建立分别由三种触发类型上升沿、下降沿、双边沿触发的子系统,触发控制信号为频率为1 Hz的方波,输入信号为频率为1.2 Hz的正弦波,要求各子系统在不同触发信号下保持输入信号波形,观察不同触发控制信号下的系统输出曲线。解答:这个模型中有三个触发子系统,分别利用不同的触发类型控制触发信号,这里用零阶保持模块保持信号波形。第9章 使用子系统 根据系统要求选择的Simulink模块如下:Sources模块库中的Signal Generator模块,分别设置Wave form参数
37、为Square和Sine,用来生成方波控制信号和正弦波输入信号;Ports&Subsystems模块库中的Triggered Subsystem模块;Discrete模块库中的Zero-Order Hold模块。根据系统要求建立的系统模型图如图9-27所示。由于触发子系统的执行时刻依赖于其他信号,因此不能指定常值采样时间,设置子系统内的Zero-Order Hold模块的Sample time参数值为-1,只有常值模块和带有继承(-1)采样时间的模块才可以在触发子系统中存在。第9章 使用子系统 图9-27 第9章 使用子系统 在这个模型中,分别设置Rising Subsystem子系统、Fal
38、ling Subsystem子系统和Either Subsystem子系统中的Trigger模块中的Trigger type参数为rising、falling和either,模型中的两个触发时间的间隔相等。Rising Subsystem子系统在两个上升沿之间进行采样和保持,Falling Subsystem子系统在两个下降沿之间进行采样和保持,Either Subsystem子系统的采样间隔短,输入在一个上升沿至下降沿之间或下降沿至上升沿之间均被采样和保持,也就是说,只要上升沿或下降沿到来,系统均被采样并保持输出不变。注意,触发子系统执行一次后保持输出值不变。第9章 使用子系统 设置仿真参数
39、对话框中的仿真时间为10 s,选择变步长ode45求解器,运行仿真。设置示波器窗口中的坐标轴数目为4,并分别标出每个窗口中的标签,这样,当仿真结束后示波器窗口显示出四个窗口曲线,如图9-28所示。第9章 使用子系统 图9-28 第9章 使用子系统 第一个窗口显示的是触发控制信号曲线,这是一个方波信号,频率为1 Hz。第二个窗口显示的是Rising Subsystem子系统的输出曲线和正弦波输入信号,当触发控制信号的上升沿到来时,子系统开始执行,并保持此时刻的当前输出值,保持的输出值至下一个上升沿触发时刻。第三个窗口显示的是Falling Subsystem子系统的输出曲线和正弦波输入信号,当触
40、发控制信号的下降沿到来时,子系统开始执行,并保持此时刻的当前输出值,保持的输出值至下一个下降沿触发时刻。第9章 使用子系统 第四个窗口显示的是Either Subsystem子系统的输出曲线和正弦波输入信号,当触发控制信号的上升沿和下降沿到来时,子系统开始执行,并保持此时刻的当前输出值,保持的输出值至下一个下降沿和上升沿触发时刻。第9章 使用子系统 例例9-3 使能计数器和触发计数器。要求:设计相同输入信号的使能计数器和触发计数器电路,输入信号为幅值为1的方波信号,比较这两个计数器的执行过程。求解:求解:根据系统要求选择的Simulink模块如下:Sources模块库中的Pulse Gener
41、ator模块,作为输入控制信号,模块的Pulse type参数设置为Sample based,Amplitude参数为1,Period参数为40,Pulse width参数为20,Phase delay参数为0,Sample time参数为0.01;第9章 使用子系统 Ports&Subsystems模块库中的Enabled Subsystem模块和Triggered Subsystem模块;Discrete模块库中的Unit Delay模块。按要求建立的系统模型如图9-29所示。模型中的Enabled Subsystem子系统和Triggered Subsystem子系统共用相同的输入信号,
42、子系统内执行累加计数操作,只不过激活系统的信号方式不同。Enabled Subsystem子系统内利用Enable模块使能系统,当信号大于零时执行系统,设置Enable模块中的States when enabling参数为reset;Triggered Subsystem子系统利用Trigger模块触发系统,设置Trigger模块中的Trigger type参数为rising。第9章 使用子系统 图9-29 第9章 使用子系统 设置Unit Delay模块的Initial conditions参数为0,Sample time参数为-1;设置仿真参数对话框中的仿真时间为2 s,仿真的最大步长Ma
43、x step size为0.01 s,并选择定步长离散求解器,运行仿真,得到的结果曲线如图9-30所示。(a)第9章 使用子系统(b)(c)图9-30 第9章 使用子系统 从图中可以看到,标签为“Control Signal”的控制信号在整个仿真期间共有5个方波信号。当控制信号大于零时,即00.2 s之间、0.40.6s之间、1.61.8 s之间,Enabled Subsystem子系统开始执行,由于仿真步长为0.01 s,那么在Enabled Subsystem子系统开始执行的0.2 s时间内,计数器需要从0累加计数20次,因此最后的输出值为19,当控制信号为0时,Enabled Subsy
44、stem子系统被禁止,输入保持不变。由于Enable模块的状态值选择的是reset,因此当再次使能Enabled Subsystem子系统时,系统从0开始重新累加计数。如果Enable模块的状态值选择的是held,那么系统会从上次的输出值开始累加。第9章 使用子系统 对于Triggered Subsystem子系统,当控制信号上升沿到来时,子系统开始执行,子系统每执行一次,计数器加1。由于在整个仿真期间共有5个上升沿,因此仿真结束后的计数器输出为4。第9章 使用子系统 9.2.3 触发使能子系统触发使能子系统第三种条件执行子系统包含两种条件执行类型,称为触发使能子系统。这样的子系统是使能子系统
45、和触发子系统的组合,系统的判断流程如图9-31所示。第9章 使用子系统 图9-31 第9章 使用子系统 触发使能子系统既包含使能输入端口,又包含触发输入端口,在这个子系统中,Simulink等待一个触发事件,当触发事件发生时,Simulink会检查使能输入端口是否为0,并求取使能控制信号。如果它的值大于0,则Simulink执行一次子系统,否则不执行子系统。如果两个输入都是向量,则每个向量中至少有一个元素是非零值时,子系统才执行一次。此外,子系统在触发事件发生的时间步上执行一次,换句话说,只有当触发信号和使能信号都满足条件时,系统才执行一次。第9章 使用子系统 注意:Simulink不允许一个
46、子系统中有多于一个的Enable端口或Trigger端口。尽管如此,如果需要几个控制条件组合的话,用户可以使用逻辑操作符将结果连接到控制输入端口。第9章 使用子系统 用户可以通过把Enable模块和Trigger模块从Ports&Subsystems模块库中拷贝到子系统中的方式来创建触发使能子系统,Simulink会在Subsystem模块的图标上添加使能和触发符号,以及使能和触发控制输入。用户可以单独设置Enable模块和Trigger模块的参数值。图9-32是一个简单的触发使能子系统。第9章 使用子系统 图9-32 第9章 使用子系统 9.2.4 创建交替执行子系统创建交替执行子系统用户可
47、以用条件执行子系统与Merge模块相结合的方式创建一组交替执行子系统,它的执行依赖于模型的当前状态。Merge模块是Signal Routing模块库中的模块,它具有创建交替执行子系统的功能。1Merge模块模块图9-33是Merge模块的参数对话框。Merge模块可以把模块的多个输入信号组合为一个单个的输出信号。第9章 使用子系统 图9-33 第9章 使用子系统 模块参数对话框中的Number of inputs参数值可以任意指定输入信号端口的数目。模块输出信号的初始值由Initial output参数决定,如果Initial output参数为空,而且模块又有超过一个以上的驱动模块,那么M
48、erge模块的初始输出等于所有驱动模块中最接近于当前时刻的初始输出值,而且,Merge模块在任何时刻的输出值都等于当前时刻其驱动模块所计算的输出值。Merge模块不接受信号元素被重新排序的信号。例如,在图9-34中,Merge模块不接受Selector模块的输出,因为Selector模块交替改变向量信号中的第一个元素和第四个元素。第9章 使用子系统 图9-34 第9章 使用子系统 如果未选择Allow unequal port widths复选框,那么Merge模块只接受具有相同维数的输入信号,而且只输出与输入同维数的信号;如果选择了Allow unequal port widths复选框,那
49、么Merge模块可以接受标量输入信号和具有不同分量数目的向量输入信号,但不接受矩阵信号。而且选择Allow unequal port widths复选框后,Input port offsets参数也将变为可用,用户可以利用这个参数为每个输入信号指定一个相对于开始输出信号的偏移量,输出信号的宽度也就等于max(w1+o1,w2+o2,wn+on),这里,w1,wn是输入信号的宽度,o1,on是输入信号的偏移量。例如,图9-35(a)中的Merge模块把信号v1和v2合并,输出信号v6。第9章 使用子系统(a)图9-35 第9章 使用子系统 (b)图9-35 第9章 使用子系统 设置信号v1的偏移
50、量为0,信号v2的偏量为2,如图9-35(b)所示,输出信号v6的宽度为6,包含六个元素,Merge模块把信号v1映射到v6的前两个元素,把信号v2映射到v6的后四个元素。第9章 使用子系统 2示例示例例9-4 将AC电流转换为DC电流。要求:利用使能模块和Merge模块建立电流转换器模型,也就是把正弦AC电流转换为脉动DC电流的设备。求解:根据系统要求选择的Simulink模块如下:Sources模块库中的Sine Wave模块;Ports&Subsystems模块库中的Enabled Subsystem子系统模块;Signal Routing模块库中的Merge模块;Math Operat