把你想要封装的部分用鼠标框选,选中后点右键里面有createsubsystem,就可以建立子模块了另一种方法simulink如何构建及封装子系统今天在用DSP-Builder做FIR滤波器的时候遇到一些难题。下图所示的是在simulink中设计的一个个位阶数FIR模型这里可以看到一个问题,如果设计的滤波器的阶数比较大的时候,就不好全部方便的显示所有部分。其实只要把相关部分打包一下就可以了。以下是网上搜到的一篇很有指导意义的文章。绝大多数的程序设计语言都有使用子程序的功能。在FORTRAN里有subroutine子程序和function子程序;C语言中的子程序被称为“函数”;Matlab的子程序称为函数式M文件。Sinlulilnk也提供了类似的功能——子程序。随着模型越来越大、越来越复杂,人们很难轻易的读懂它们。在这种情况下,子系统通过把大的模型分割成几个小的模型系统以使得整个系统模型更简捷、可读性更高,而且这种操作并不复杂。举一个简单的例子,考虑在例1中提到的汽车模型,其Simulink模型图见图7.5.1。图7.5.1比例速度控制的汽车模型整个模型包括两个主要部分:发动机动力系统和控制系统。但是在模型图中哪些模块代表发动机动力系统,那些模块代表控制系统并不明确。在图7.5.2中,将模型的这两个部分转化为子系统。经过转化后,主模型图中的结构就变得很明了了,只是两个子系统的具体结构被隐藏起来了,双击子系统模块,则会在一个新的窗口中显示子系统的模块图。如图7.5.3所示。图7.5.2子模块化了的汽车模型子系统的另外一个重要的功能是把反复使用的模块组压缩成子系统后重复使用。在本例中,如果要比较在同一控制系统控制下不同发动机的工作效率,只需要替换新的发动机子系统而不是重建一个新的系统。这样的控制系统就可以反复利用。注意:这种做法不仅节省了建模时间,而且可以保证在多次建模中不会因失误而在控制子系统中出现差错,这在大型的复杂系统建模中是非常重要的。创建Simulink子系统共有两种方法:·一种办法是对已存在的模型的某些部分或全部使用菜单命令【Edit/CreateSubsystem】进行压缩转化,使之成为子系统;·另一种方法是使用Connections模块库中的Subsystem模块直接创建子系统。下面分别介绍这两种方法。(a)控制子系统(b)发动机动力子系统图7.5.3子系统分解一、压缩子系统把已经存在的Simulink模型中的某个部分或全部压缩成子系统的操作如下:步骤一:首先使用范围框将要压缩成子系统的部分选中,包括模块和信号线,如图7.5.4所示。图7.5.4选中要压缩的模块注意:在这种情况下只能用范围框,而不能用Shift逐个选定。为了能使范围框框住所有需要的模块,重新安排模块的位置常常似乎是必要的。步骤二:在模块窗口菜单选项中选择【EditCreatSubsystem】,Simulink将会用一个子系统模块代替被选中的模块组,如图7.5.5所示。图7.5.5压缩后的模型图步骤三:子系统模块将有一个默认输入端口和输出端口。输入端口和输出端口的默认名分别为In1和Out1。调整子系统和模型窗口的大小使之美观,如图7.5.6所示。图7.5.6压缩后的模型图若想查看子系统内容或对子系统进行再编辑,可以双击子系统模块,则会出现一个显示子系统内容的新窗口。在窗口内,除了原始的模块外,Simulink自动添加了输入模块和输出模块,分别代表子系统的输入端口和输出端口。改变它们的标签会使子系统的输入输出端口的标签也随着变化。特别注意:菜单命令【Edit/CreatSubsystem】没有相反的操作命令。也就是说一旦将一组模块压缩成子系统,就没有直接还原的处理方法了(UNDO除外)。因此一个理想的处理方法是在压缩子系统之前先把模型保存一下,作为备份。二、子系统模块在创建模型的时候,如果需要一个子系统,也可以直接在子系统窗口中创建。这样就省去了上面的压缩子系统和重新安排窗口的步骤。要使用子系统模块创建新的子系统,先从Signals&Systems模块库中拖一个子系统模块到模型窗口中。双击子系统模块,就会出现一个子系统编辑窗口。注意:在信号输入端口要使用一个输入模块,在信号输出端口要使用一个输出模块。子系统创建完毕后,关闭子系统窗口。关闭子系统窗口之前不需要做任何保存操作。子系统作为模型的一部分,当模型被保存时,子系统会自动保存。例7.5.1模拟如图7.5.7所示的弹簧-质量系统的运动状态。单个小车系统的运动方程如下:(7.5.1)图7.5.7弹簧-质量系统先建立如图7.5.8所示的单个小车系统的子系统。图7.5.8单个小车系统使用子系统模块创建如图7.5.9所示的子系统,此子系统用来模拟一个小车的运动。子系统的输入为小车的左距x(n-1)和右距x(n+1),输出为小车的当前位置x(n).子系统完成之后,关闭子系统窗口。复制两次此子系统模块,并如图7.5.10所示链接起来。图7.5.9小车1的子系统模型图7.5.10使用子系统的三小车模型为了可以对每个小车的参数进行赋值,要做以下设置:⑴对小车1,将标签为LeftSpring的增益模块的增益系数设置为k1,标签为RightSpring的增益模块的增益系数设置为k2,标签为1/mass的增益模块的增益系数设置为1/m1。设置速度积分模块的初始值为0,位置积分模块的初始值为1。⑵对小车2,将标签为LeftSpring的增益模块的增益系数设置为k2,标签为RightSpring的增益模块的增益系数设置为k3,标签为1/mass的增益模块的增益系数设置为1/m2。设置速度积分模块的初始值为0,位置积分模块的初始值为1。⑶对小车3,将标签为LeftSpring的增益模块的增益系数设置为k3,标签为RightSpring的增益模块的增益系数设置为k4,标签为1/mass的增益模块的增益系数设置为1/m3。设置速度积分模块的初始值为0,位置积分模块的初始值为1。此时就可以很方便地使用Matlab变量对弹簧常数k1,k2,k3和小车质量m1,m2,m3进行赋值。这里使用了一个名为set_k_m的M文件对它进行赋值,如下所示:&setthespringconstantsandblockmassvaluesk1=1;k2=2;k3=4;m1=1;m2=3;m3=2;仿真开始之前在Matlab命令窗口中运行此M文件。然后,指定示波器模块把显示数据保存到工作间中,并设置仿真的起始时间(StartTime)为0,终止时间(StopTime)为100。仿真结束后,在Matlab窗口中把所得到的小车3的显示数据绘制成图。7.5.2子系统的封装封装技术是将Simulink子系统“包装”成一个模块,并可以如同使用Simulink内部模块一样使用的技术。每个封装模块都可以有一个自定义的图标用来设定参数的对话框,参数设定方法也与Simulink模块库中的内部模块完全相同。为了更好的理解封装的含义,见图7.5.10所示的模型。此模型与例7.5.1中的模型完全等价,但它要更容易使用。双击Spring-mass1模块可以打开该模块属性的对话框。与例7.5.1中打开每个模块去修改参数不同,这里可以直接在此对话框中输入参数。对话框的结构与形式都和“原装”的模型毫无两样。本节将主要以此弹簧-质量系统为例来详细介绍创建一个封装模块的步骤。创建一个封装模块的主要步骤分为三步:⑴创建一个子系统;⑵选中子系统,选择模型窗口菜单中的【EditMasksubsystem】选项生成封装模块;⑶使用封装编辑器设置封装文本、对话框和图标。一、子系统到封装模块的转换当按照上节中介绍的方法创建以弹簧-质量子系统模块之后(如图7.5.10所示),将其复制到一个新的窗口中,如图7.5.11所示。选中此模块,在窗口的菜单中执行【EditMasksubsystem】指令,弹出如图7.5.12所示的一个封装编辑对话框。该对话框有三个选项卡。下面分别讨论这三个选项卡的功能和使用。图7.5.11将子系统复制到新窗口图7.5.12封装编辑对话框(1)文本页Documentation图7.5.13是编辑器的文本页。它也包括三个区域,每个区域都为一个自由区,既可填写也可以不填写。◆Masktype:该区内容将作为模块的类型显示在封装模块的对话框中。◆Blockdescription:此区中的内容将显示在封装模块对话框的上部,它的位置在后面的图中可能看得更清楚。其内容脑壳描述模块的功用的简短语句或其它关于使用此模块的注意事项等。◆Blockhelp:当对话框中的【help】按钮按下时,MATLAB的帮助系统将显示此区中的内容,其内容应当包括使用此模块的详细说明。(2)初始化页Initialization初始化页是用来设置封装模块参数项的,如图7.5.14所示。此页也包括三个区域。◆上区为Masktype区。此封装类型区与文本页中的封装类型区是等同的,可以在任意一页中定义或改变封装类型。◆中区是用来设置封装模块对话框中的输入变量项目,如输入变量或操作选择等等。此区包括一个滚动项目列表、一套“加入”、“删除”和“移动”按钮,以及5个设置项目属性的编辑区。◆底区为Initializationcommands,在此区中可以输入MATLAB语句,如定义变量、初始变量值等等。封装子系统与非封装子系统的一个重要的区别在于模块对话框中变量的作用范围。非封装子系统模块中的变量可以直接在MATLAB工作间中赋值。而封装子系统的模块则不能。封装子系统有一个独立于MATLAB工作间及其它子系统的内部存储空间、这个特点可以防止模块变量与其它工作间中无关变量的冲突。因此,在封装模块中用到的变量要在封装编辑器对话区或初始命令区中设置。图7.5.13封装编辑器的文本页图7.5.14封装编辑器的初始化页(3)图标页Icon编辑器的图标页如图7.5.12所示,它是用来给封装模块设计自定义图标的。此页分6个区。顶区的【Masktype】同其它两页中的【Masktype】是等同的。【Deawingcommands】区是以MATLAB语句来绘制图标的编辑区。其余的4个区是用来指定图标的属性,理解了图标的这些属性再来分析图标的绘制命令是很容易的。◆Iconfram:第一个属性为图标框选项,他由一个下拉菜单组成,分别有可见、不可见选项。所谓的图标框即图标的边界线。◆Icontransparency:第二个属性为图标的透明度选项,也是由一个下拉菜单组成,有两个选项,透明和不透明。◆Iconrotation:第三个选项为图标旋转选项,其下拉菜单选项为固定和旋转。这个选项决定了当执行【FormatFlipblock】或【FormalRotateBlock】指令时的图标形状。◆Drawingcooedenates:最后一个区是图形坐标区,用来设置绘图的比例。它有三个选项:→Pixed:用来设置绘图系为绝对坐标系,其效果为当模块图调整大小时,图标不随其大小的改变而改变。此参数下的坐标系应为象素点坐标,图标的左下角为坐标系的原点。→Autoscale:该选项使得图标图形恰好充满整个模块。→Normalized:该选项是设置绘图比例在0河1之间的选项。图标的左下角的坐标定义为(0,0),模块的右上角坐标定义为(1,1)。当模块调整大小的时候,坐标系同样被调整。二、查看封装和解封装对于一个已封装的子系统要想查看其封装前子系统的具体内容,可以选着菜单命令【EditLookUndermask】。若要对已经封装的模块进行解封装操作,要先选中此模块,打开封装编辑器,按下Unmask按钮,则封装就被解开。若要再次封装此子系统,选着【EditMasksubsystem】即可。