第9章使 用 子 系 统第9章使用子系统9.1创建子系统9.2创建条件执行子系统9.3控制流语句第9章使 用 子 系 统9.1创 建 子 系 统当用户模型的结构非常复杂时,可以通过把多个模块组合在子系统内的方式来简化模型的外观。利用子系统创建模型有如下优点:减少了模型窗口中显示的模块数目,从而使模型外观结构更清晰,增强了模型的可读性;在简化模型外观结构图的基础上,保持了各模块之间的函数关系;可以建立层级方块图,Subsystem模块是一个层级,组成子系统的其他模块在另一层上。第9章使 用 子 系 统9.1.1Simulink子系统定义1.虚拟子系统虚拟子系统在模型中提供了图形化的层级显示。它简化了模型的外观,但并不影响模型的执行,在模型执行期间,Simulink会平铺所有的虚拟子系统,也就是在执行之前就扩展子系统。这种扩展类似于编程语言,如C或C++中的宏操作。第9章使 用 子 系 统2.非虚拟子系统(1)原子子系统(AtomicSubsystem)。原子子系统与虚拟子系统的主要区别在于,原子子系统内的模块作为一个单个单元执行,Simulink中的任何模块都可以放在原子子系统内,包括以不同速率执行的模块。用户可以在虚拟子系统内通过选择Treatasatomicunit选项来创建原子子系统。第9章使 用 子 系 统(2)使能子系统(EnabledSubsystem)。使能子系统的动作类似原子子系统,不同的是它只有在驱动子系统使能端口的输入信号大于零时才会执行。用户可以通过在子系统内放置Enable模块的方式来创建使能子系统,并通过设置使能子系统内Enable端口模块中的Stateswhenenabling参数来配置子系统内的模块状态。此外,利用Outport输出模块的Outputwhendisabled参数可以把使能子系统内的每个输出端口配置为保持输出或重置输出。第9章使 用 子 系 统(3)触发子系统(TriggeredSubsystem)。触发子系统只有在驱动子系统触发端口的信号的上升沿或下降沿到来时才会执行,触发信号沿的方向由Trigger端口模块中的Triggertype参数决定。Simulink限制放置在触发子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发子系统的执行具有非周期性,即子系统内模块的执行是不规则的。用户可以通过在子系统内放置Trigger模块的方式来创建触发子系统。第9章使 用 子 系 统(4)函数调用子系统(Function-CallSubsystem)。函数调用子系统类似于用文本语言(如M语言)编写的S-函数,只不过它是通过Simulink模块实现的。用户可以利用Stateflow图、函数调用生成器或S-函数执行函数调用子系统。Simulink限制放置在函数调用子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为函数调用子系统的执行具有非周期性。用户可以通过把Trigger端口模块放置在子系统内,并将Triggertype参数设置为function-call的方式来创建函数调用子系统。第9章使 用 子 系 统(5)触发使能子系统(EnabledandTriggeredSubsystem)。触发使能子系统在系统被使能且驱动子系统触发端口的信号的上升沿或下降沿到来时才执行,触发边沿的方向由Trigger端口模块中的Triggertype参数决定。Simulink限制放置在触发使能子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发使能子系统的执行具有非周期性。用户可以通过把Trigger端口模块和Enable模块放置在子系统内的方式来创建触发使能子系统。第9章使 用 子 系 统(6) Action子系统。Action子系统具有使能子系统和函数调用子系统的交叉特性,其只能限制一个采样时间,即连续采样时间、离散采样时间或继承采样时间。Action子系统必须由If模块或SwitchCase模块执行,与这些子系统模块连接的所有Action子系统必须具有相同的采样时间。用户可以通过在子系统内放置Action端口模块的方式来创建Action子系统,子系统图标会自动反映执行Action子系统的模块类型,也就是If模块或SwitchCase模块。第9章使 用 子 系 统Action子系统至多执行一次,利用Output端口模块的Outputwhendisabled参数,Action子系统也可以控制是否保持输出值,这是与使能子系统类似的地方。Action子系统与函数调用子系统类似,因为函数调用子系统在任何给定的时间步内可以执行多于一次,而Action子系统至多执行一次。这种限制就表示Action子系统内可以放置非周期性的模块,而且也可以控制状态和输出的行为。第9章使 用 子 系 统(7) While-子系统。While-子系统在每个时间步内可以循环多次,循环的次数由WhileIterator模块中的条件参数控制。用户可以通过在子系统内放置WhileIterator模块的方式来创建While-子系统。While-子系统与函数调用子系统相同的地方在于它在给定的时间步内可以循环多次,不同的是它没有独立的循环指示器(如Stateflow图),而且,通过选择WhileIterator模块中的参数,While-子系统还可以存取循环次数,通过设置Stateswhenstarting参数还可以控制当子系统开始执行时状态是否重置。第9章使 用 子 系 统(8) For-子系统。For-子系统在每个模型时间步内可执行固定的循环次数,循环次数可以由外部输入给定,或者由ForIterator模块内部指定。用户可以通过在子系统内放置ForIterator模块的方式来创建For-子系统。For-子系统也可以通过选择ForIterator模块内的参数来存取当前循环的次数。For-子系统在给定时间步内限制循环次数上与While-子系统类似。第9章使 用 子 系 统9.1.2创建子系统在Simulink中创建子系统的方法有两种:把Ports&Subsystems模块库中的Subsystem模块添加到用户模型中,然后打开Subsystem模块,向子系统窗口中添加所包含的模块;先向模型中添加组成子系统的模块,然后把这些模块组合到子系统中。第9章使 用 子 系 统1.添加Subsystem模块创建子系统首先将Ports&Subsystems模块库中的Subsystem模块拷贝到模型窗口中,如图9-1所示;然后双击Subsystem模块,Simulink会在当前窗口或一个新的模型窗口中打开子系统,如图9-2所示。子系统窗口中的Inport模块表示来自于子系统外的输入,Outport模块表示外部输出。第9章使 用 子 系 统图9-1第9章使 用 子 系 统图9-2第9章使 用 子 系 统用户可以在子系统窗口中添加组成子系统的模块。例如,图9-3中的子系统包含了一个Sum模块,两个Inport模块和一个Outport模块,这个子系统表示对两个外部输入求和,并将结果通过Outport模块输出到子系统外的模块。此时的子系统图标也变成图9-3中的右图所示。第9章使 用 子 系 统图9-3第9章使 用 子 系 统2.组合已有模块创建子系统如果模型中已经包含了用户想要转换为子系统的模块,那么可以把这些模块组合在一起来创建子系统。以图9-4中的模型为例,用户可以用鼠标将需要组合为子系统的模块和连线用边框线选取,当释放鼠标按钮时,边框内的所有模块和线均被选中;然后选择Edit菜单下的CreateSubsystem命令,Simulink会将所选模块用Subsystem模块代替。第9章使 用 子 系 统图9-4第9章使 用 子 系 统图9-5显示的是选择了CreateSubsystem命令后的模型。如果打开Subsystem模块,那么Simulink将显示下层的子系统模型,如图9-6所示。Inport模块和Outport模块只是表示来自于子系统外部的输入和输出到子系统外部的模块。第9章使 用 子 系 统图9-5第9章使 用 子 系 统图9-6第9章使 用 子 系 统9.1.3浏览层级子系统用户可以利用Subsystem模块创建由多层子系统组成的层级模型,这样做的好处是显而易见的—不仅使用户模型的界面更清晰,而且模型的可读性也更强。对于模型层级比较多的复杂模型,一层一层打开子系统浏览模型显然是不可取的,这时用户可以利用Simulink中的模型浏览器来浏览模型。模型浏览器可以执行如下操作:按层级浏览模型;在模型中打开子系统;确定模型中所包含的模块;快速定位到模型中指定层级的模块。第9章使 用 子 系 统选择这个复选项,缺省时在模型浏览器中打开模型图9-7第9章使 用 子 系 统模型浏览器只有在MicrosoftWindows平台上可用,这里以Simulink中的engine模型为例介绍如何使用Windows下的模型浏览器。在engine模型窗口中选择View菜单下的Modelbrowseroptions命令,在下拉菜单中选择Modelbrowser命令,即可打开模型浏览器,如图9-8所示。第9章使 用 子 系 统图9-8第9章使 用 子 系 统此时模型窗口被分割为两个面板。左面的面板以树状结构显示组成模型的各层子系统,树状结构的根结点对应的是最顶层模型,所有的子系统以分支形式显示在左侧面板中;右面的面板显示对应系统的模型结构图。如果要查看系统的模型方块图或组成系统的任何子系统,则可以在树状结构中选择这个子系统,此时模型浏览器右侧的面板中会显示相应系统的结构方块图。图9-9中显示的是Throttle&Manifold子系统结构图,该子系统下还有两个子系统:IntakeManiflod和Throttle,可以单击这两个子系统查看相应的结构图。第9章使 用 子 系 统图9-9第9章使 用 子 系 统模型浏览器还可以包括或删除模型树状显示中的库连接,也可以包括或删除被封装子系统。若要显示模型中的库连接或被封装子系统,则可以单击左侧面板上的“显示库连接”按钮和“浏览被封装子系统”按钮;若要关闭模型浏览器,则可以单击“隐藏模型浏览器”按钮。关于库连接和被封装子系统的详细内容,读者可以参看第10章。第9章使 用 子 系 统9.2创建条件执行子系统条件执行子系统也是一个子系统,但在模型中是否执行条件子系统则取决于其他条件信号。这个控制子系统执行的信号称为控制信号,控制信号在单独的控制输入端口进入子系统。当用户想要建立复杂的模型,而且模型中某些组件的执行依赖于其他组件时,条件执行子系统就非常有用了。第9章使 用 子 系 统Simulink支持如下几种类型的条件执行子系统:使能子系统(EnabledSubsystem):当控制信号为正时,使能子系统执行。该子系统在控制信号过零(从负到正方向)时开始执行,并且在控制信号保持为正时继续执行。触发子系统(TriggeredSubsystem):每次当触发事件发生时,触发子系统执行一次。触发事件可以发生在触发信号的上升沿或下降沿。触发信号可以是连续信号,也可以是离散信号。触发使能子系统(TriggeredandEnabledSubsystem):当触发事件发生时,如果使能控制信号为正值,则触发使能子系统执行一次。第9章使 用 子 系 统控制流语句(controlflowstatement):控制流语句在控制流模块下可执行类似C语言的控制流逻辑算法,执行的模块均在被控制子系统内。在if-else和switch控制流中,控制模块均在被控制子系统外,并向被控制子系统内的ActionPort模块发送控制信号;而在while、do-while和for控制流中,具有重复控制的模块在子系统内,它没有明显的控制信号。第9章使 用 子 系 统9.2.1使能子