MATLAB的Simulink的子系统概述
子系统分为虚拟子系统和非虚拟子系统,非虚拟子系统又分为原子子系统和受外部信号触发、外部信号使能的触发子系统和使能子系统，另外还有跟流控制模块lf , Switch,For ，While模块配合使用的动作子系统(Action Subsystem),以及包含多个子系统在同一个时间仅能激活其中一个的可变子系统。子系统将模块及其信号线组合为一个大的模块,划分为上层及内部两个层次,在上层屏蔽内部结构,仅将输入/输出个数表现在外,内部是真正的逻辑结构。这种层次性划分有如下优点:(1) 减少了模型窗口中显示的模块数目,使模型外观结构更清晰,增强了模型的可读性。(2) 在简化模型外观结构图的基础上,保持了各模块之间的拓扑关系,使得特定功能的模块可以拥有一些独立的属性。(3) 可以建立自定义子系统,方便在内部集成某种功能,进行复用。Simulink根据仿真特性将模块的属性分为两种:虚拟模块和非虚拟模块。将基本模块组成子系统时需考虑基本模块的类型划分,需要区分这两种类别的模块:非虚拟模块在仿真过程中起实际的作用,对其进行编辑或者增加删除操作,会影响到模型的运行和改变模型的结果;虚拟模块在仿真的过程中不起实际作用,主要是为了从图框上进行程序的层次划分以及保持模型的图形界面的整洁性等作用。还有一些模块在某些特定条件下为非虚拟模块,有些条件下为虚拟模块,可以称之为条件虚拟模块。了解虚拟模块和非虚拟模块是非常必要的,这两者的区别在生成代码时可以直观地看到(虚拟子系统不会生成用户指定的函数体而是直接将模块生成的代码内联),另外,子系统是否是虚拟模块对于模型的各个模块的执行顺序有着直接的影响。在正式讲解子系统分类之前,需要讲解一下 Simulink模型的运行顺序问题以加深对simulink子系统与其执行顺序的理解。Simulink模型的计算顺序是基于时间采样和信号流向的,即按照时间的顺序执行。每一个采样点时间,模型中所有模块的状态和输入/输出值都要计算并更新一下,每个模块的输出值都通过信号连接传递给下一个模块的输入。系统采样时间由解算器类型和步长共同决定，并且作为Simulink模型仿真的最小粒度。当系统采样时刻到来时,每个模块再根据自身所设定的采样时间方式决定是否在当前这个采样时刻进行计算。允许用户设定采样时间的模块在其参数对话框中都提供Sample Time这个属性。对于模块的Sample Time属性,常用的值有以下几组:当然,也可以通过填入一个包含两个元素的数组[sampletime，offset]来实现采样时刻的偏移, sampletime就是上述采样时间中的一种, offset是相对于这个采样时刻的时间偏移量。例如[0.2,0.01]表示采样类型是离散的,其周期为0.2 s,但是采样时刻相对解算器的时钟有一个偏移量,具有此种采样时间向量的模块采样时间序列为0.01 s,0.21 s,0.41 s等时刻进行计算。一个子系统内部包含多个模块时,了解模块的计算顺序有助于增强读者朋友们在模型仿真出错时的分析能力和纠错能力。Simulink的执行顺序是按照信号的流向进行的。子系统的入口采用Inport模块,同其输出连接的模块(非虚拟模块)往往是第一个需要计算的。当存在多个输人端口时,按照输人端口的编号从小到大顺序执行，再顺次更新这个模块的输出信号所连接的模块。如果这个模块的输入端口有多个,那么需要所有输入端口的数据全部准备完毕之后,再计算多输入模块的状态量和输出量。具有多个输入分支的模块，其输人端口决定了输入到其分支上的模块执行顺序。对于Simulink模型,可以通过菜单栏Display→Blocks→Sorted Executed Order将模块的执行顺序显示出来,如图所示。仿真模型图子系统内部图内部模块中,除In1外每个模块都有红色的时序文字标注,格式为m : n。其中m表示模块在模型中执行的优先度,n表示在同一个采样时刻,模块所处的执行次序号,二者都从0号开始计数,0表示最高优先度。子系统所示模型首先必须要将输入Inl数据传递给Gain模块,作为Add模块的第一个输人口连接的Gain模块先进行计算以得到输出值,接着与Add模块另一个输人口连接的Constant模块进行计算,两个模块都计算后,Add模块的两个输入端口数据便均准备完毕,可以进行Add模块的计算。待Add模块根据两个输入信号计算完毕之后,再将其输出值通过Out1输出到子系统之外。示例1示波器输出通常虚拟子系统与非虚拟子系统的划分依据是评判执行时间顺序是否作为一个整体单元,即子系统内部所有模块是否在同一个采样时刻进行输入/输出量和状态变量的更新。非虚拟子系统又称为原子子系统,它不仅外观看起来是子系统的状态,并且内部模块的采样时间将被统一,所有子模块在同一个采样时间进行仿真计算。另外一种称为条件触发子系统的模块，分为受到外部函数调用信号触发的function-call子系统和外部使能信号(如上升沿下降沿信号)触发的使能子系统,也存在两种触发条件均包含的子系统。另外还有跟流控制模块If、Switch、For 、While配合使用的Action Subsystem动作子系统,以及同时包含多个子层子系统于内部而在某个采样时刻仅能激活其中一个的可变子系统和可配置子系统。可变子系统称其为可选择子系统selectable subsystem,功能类似一个子系统指针,本身提供访问多个子系统的功能,但是在每一个时刻仅有一个子系统是被激活的,用户可以使用一个可选择子系统代替一组或多个功能的子系统。当用户自定义了模块库之后,可使用可配置Configurable子系统模块动态地选择模块所在的库里的任意一个模块。作为动态子系统Configurable子系统仅能代表某一个库中的各个模块,Variant子系统能够包容各种模块构成的子系统。大多数的复杂系统模型都需要使用子系统完成系统模型的管理，不过一般的子系统仅仅是简单的系统构造，通常不会影响系统模型的执行效果或者执行次序，除非是将子系统设置为原子子系统。设置原子子系统的方法是在相应的子系统上单击鼠标右键，在弹出的快捷菜单中选择Bkock Parameters(Subsystem) 命令，然后在弹出的对话框中将复选框Treat as atomic unit选择，如图所示，单击Ok按钮或者Apply按钮后，子系统即成为了原子子系统。原子子系统在整个系统中被看做一个整体，将影响系统模型的执行次序。另外在生成原子子系统的产品代码时，可以解决内存的占用问题，并缩短代码的长度。原子系统中有两类子系统比较常见，一个叫使能子系统，另一个叫触发子系统，它们共同属于Simulink中的条件执行子系统。虚拟子系统(Virtual Subsystem)在模型中提供了图形化的层级显示,可简化模型外观,不影响模型的执行和代码生成。在模型执行期间,Simulink展开所有的虚拟子系统,即在执行仿真之前就展开子系统,实际上同没有建立子系统时的效果一样,所以称为虚拟子系统。非虚拟原子子系统(Nonvirtual/Atomic Subsystem)内的模块作为一个单元执行,Simulink中的任何模块都可以放在原子子系统内,包括不同执行速率的模块。原子子系统统一了内部模块时序,并提供生成函数代码功能的模块,衍生出一些功能更丰富的子系统模块。(1）条件子系统( conditional subsystem)使能子系统(Enabled Subsystem)在驱动子系统使能端口的输人信号大于零时执行使能子系统。用户可以通过在虚拟子系统内放置Enable模块的方式来创建使能子系统(虚拟子系统内部放置Enable模块之后自动转换为原子子系统),并通过设置使能子系统内Enable端口模块中的States when enabling 参数配置子系统内的模块状态。此外,如果子系统内部存在Out模块,利用Out输出模块的Output when disabled参数可把使能子系统内每个输出端口配置为保持最后一个有效采样时刻的输出或复位为初始值。触发子系统(Triggered Subsystem)触发子系统只有在驱动子系统触发端口的信号的上升沿或下降沿到来时才会执行,触发信号沿的方向由Trigger端口模块中的Trigger type参数决定。Simulink限制放置在触发子系统内的模块类型,这些模块不能各自指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发子系统的执行具有非周期性,即子系统内模块的执行是不规则的。触发使能子系统(Enabled and Triggered Subsystem)触发使能子系统在系统被使能且驱动子系统触发端口的信号的上升沿或下降沿到来时才执行，触发边沿的方向由Trigger端口模块中的Trigger type参数决定。Simulink限制放置在触发使能子系统内的模块类型,这些模块不能各自指定采样时间,采样时间由此子系统模块统一设定。用户可以通过把Trigger端口模块和Enable模块放置在子系统内的方式来创建触发使能子系统。函数调用子系统(Function-Call Subsystem)此类型子系统其实也隶属于触发子系统,但是从嵌入式目标支持包TSP中发挥的作用差异考虑,特别将其单独列为一类,各种硬件的驱动模块库中提供的硬件中断调用模块,输出的就是 Function-Call信号,需要连接的就是函数调用子系统。函数调用子系统类似于用文本语言(如M语言)编写的S函数,只不过是通过Simulink模块实现的。用户可以利用状态流图,函数调用生成器(Function-Call Generator)或S函数执行函数调用子系统。Simulink 限制放置在函数调用子系统内的模块类型,这些模块不能分别指定采样时间,采样时间由此子系统模块统一设定。使用S函数的逻辑状态而非普通的信号作为触发子系统的控制信号。函数调用子系统属于触发子系统,在触发子系统中触发模块Trigger 的参数设置中选择Function -Call可以将由普通信号触发的触发子系统转换为函数调用子系统。(2）动作子系统( action subsystem)Action子系统具有使能子系统和函数调用子系统的交叉特性,又能让习惯于编程语言的开发者方便地使用流控制方法。作为原子子系统,内部各个模块的采样时间不可以再划分,共同由子系统模块统一设定统一执行,同一时刻仅能为连续采样时间,离散采样时间或继承采样时间中的一个。Action子系统必须由If模块或Switch Case模块执行,与这些子系统模块连接的所有Action子系统必须具有相同的采样时间。用户可以通过在子系统内放置Action端口模块的方式来创建Action子系统,子系统图标会自动反映执行Action子系统的模块类型，即4种流控制类型:lf模块、While模块、For模块或Switch Case模块。Action子系统至多执行一次,利用Output端口模块的Output when disabled参数，Action子系统也可以控制是否在不触发时保持输出值,这是与使能子系统类似的地方。流控制的实现还需要If , while , for-iteration，switch-case模块的配合使用。3.选择子系统(Selectable Subsystem)(1)可变子系统(Variant Subsystem)可变子系统内部包括多个子系统，当某条件成立时执行与之相应的子系统。每个子系统匹配一个变量的值,每次仿真时根据这个变量的值决定内部哪一个子系统处于激活状态。(2）可配置子系统(Configurable Subsystem)用来代表用户自定义库中的任意模块,只能在用户自定义库中使用,动态表示自定义库中的某一个模块。[1] 孙忠潇.Simulink仿真及代码生成技术入门到精通[M].北京:北京航空航天大学出版社,2015.本文内容来源于网络，仅供参考学习，如内容、图片有任何版权问题，请联系处理，24小时内删除。作 者 | 郭志龙编 辑 | 郭志龙校 对 | 郭志龙