资源描述
单击此处编辑母版标题样式,*,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第七章 Simulink建模和仿真,在计算机技术飞速发展的今天,许多科学研究、工程设计由于其复杂性越来越高,因此与计算机的接合日趋紧密。也正是计算机技术的介入,改变了许多学科的结构、研究内容和研究方向。例如,计算流体力学、计算物理学、计算声学等新兴学科的兴起,均与计算机技术的发展分不开。控制理论、仿真技术本身与计算机的接合就十分紧密,而随着专业领域的研究深入和计算机软硬件技术的发展,这种联系呈现更加紧密。计算控制论的建立,足以说明这个问题。而这种发展,又以系统仿真技术的发展分不开的。,为了满足用户对工程计算的要求,一些软件公司相继推出一批数学类科技应用软件,如Matlab、Xmath、Mathematica、Maple等。其中MathWorks公司推出的Matlab由于有强大的功能和友好的用户界面受到越来越多的科技工作者的青睐,尤其是控制领域的专家和学者.,第七章 Simulink建模和仿真,Matlab具有友好的工作平台和编程环境、简单易学的编程语言、强大的科学计算和数据处理能力、出色的图形和图像处理功能、能适应多领域应用的工具葙、适应多种语言的程序接口、模块化的设计和系统级的仿真功能等,诸多的优点和特点。,支持Matlab仿真是Simulink工具箱,Simulink一般可以附在Matlab上同时安装,也有独立版本来单独使用。但大多数用户都是附在Matlab上,以便能更好地发挥Matlab在科学计算上的优势,进一步扩展Simulink的使用领域和功能。,本章详细地向用户介绍Simulink地建模方法、使用操作、以及使用Simulink进行系统级的仿真和设计原理。,使读者通过本章地学习,不但可以进一步掌握计算机仿真的基本概念和理论,也可以初步学会使用Simulink去真正地运用仿真技术解决科研和工程中地实际问题。,7.1 Simulink的概述和基本操作,近几年来,在学术界和工业领域,,Simulink已经成为动态系统建模和仿真领域中应用最为广泛的软件之一。,Simulink可以很方便地创建和维护一个完整地模块,评估不同地算法和结构,并验证系统的性能。由于Simulink是采用模块组合方式来建模,从而可以使得用户能够快速、准确地创建动态系统的计算机仿真模型,特别是对复杂的不确定非线性系统,更为方便。,Simulink模型可以用来模拟线性和非线性、连续和离散或者两者的混合系统,,也就是说它可以用来模拟几乎所有可能遇到动态系统。另外Simulink还提供一套图形动画的处理方法,使用户可以方便的观察到仿真的整个过程。,Simulink没有单独的语言,但是它提供了S函数规则。,所谓的S函数可以是一个M函数文件、FORTRAN程序、C或C+语言程序等,通过特殊的语法规则使之能够被Simulink模型或模块调用。S函数使Simulink更加充实、完备,具有更强的处理能力。,7.1 Simulink的概述和基本操作,同Matlab一样,,Simulink也不是封闭的,他允许用户可以很方便的定制自己的模块和模块库。,同时Simulink也同样有比较完整的帮助系统,使用户可以随时找到对应模块的说明,便于应用。,综上所述,,Simulink就是一种开放性的,用来模拟线性或非线性的以及连续或离散的或者两者混合的动态系统的强有力的系统级仿真工具。,目前,随着软件的升级换代,在软硬件的接口方面有了长足的进步,使用Simulink可以很方便地进行实时的信号控制和处理、信息通信以及DSP的处理。世界上许多知名的大公司已经使用Simulink作为他们产品设计和开发的强有力工具。,7.1 Simulink的概述和基本操作,图7.1.1 Simulink模型元素关联图,7.1.2 基本操作,一、模型基本结构,一个典型的Simulink模型包括如下三种类型的元素:,信号源模块,被模拟的系统模块,输出显示模块,如图所示说明了这三种元素之间的典型关系。系统模块作为中心模块是Simulink仿真建模所要解决的主要部分;信号源为系统的输入,它包括常数信号源函数信号发生器(如正弦和阶跃函数波等)和用户自己在Matlab中创建的自定义信号或Matlab工作间中三种。输出模块主要在Sinks库中。,7.1 Simulink的概述和基本操作,Simulink模型并不一定要包含全部的三种元素,在实际应用中通常可以缺少其中的一个或两个。例如,若要模拟一个系统偏离平衡位置后的恢复行为,就可以建立一个没有输入而只有系统模块加一个显示模块的模型。在某种情况下,也可以建立一个只有源模块和显示模块的系统。若需要一个由几个函数复合的特殊信号,则可以使用源模块生成信号并将其送入Matlab工作间或文件中。,二、仿真运行原理,Simulink仿真包括两个阶段;初始化阶段和模型执行阶段,(1)模块初始化,在初始化阶段主要完成以下工作,:,模型参数传给Matlab进行估值,得到的数值结果将作为模型的实际参数;,展开模型的各个层次,每一个非条件执行的子系统被它所包含的模块所代替;,7.1 Simulink的概述和基本操作,模型中的模块按更新的次序进行排序。排序算法产生一个列表以确保具有代数环的模块在产生它的驱动输入的模块被更新后才更新。当然,这一步要先检测出模型中存在的代数环。,决定模型中有无显示设定的信号属性,例如名称、数据类型、数值类型以及大小等,并且检查每个模块是否能够接受连接到它输入端的信号。Simulink使用属性传递的过程来确定未被设定的属性,这个过程将源信号的属性传递到它所驱动的模块的输入信号;,决定所有无显示设定采样时间的模块的采样时间;,分配和初始化用于存储每个模块的状态和输入当前值的存储空间。,完成这些工作后就可以进行仿真了。,2)模型执行,一般模型是使用数值积分来进行仿真的。所运用的仿真解法器(仿真算法)依赖于模型提供它的连续状态微分能力。计算微分可以分两步进行:,7.1 Simulink的概述和基本操作,首先,按照排序所决定的次序计算每个模块的输出。,然后,根据当前时刻的输入和状态来决定状态的微分;得到微分向量后再把它返回给解法器;后者用来计算下一个采样点的状态向量。一旦新的状态向量计算完毕,被采样的数据源模块和接受模块才被更新。,在仿真开始时模型设定待仿真系统的初始状态和输出。在每一个时间步中,Simulink计算系统的输入、状态和输出,并更新模型来反映计算出的值。在仿真结束时,模型得出系统的输入、状态和输出。,在每个时间步中,Simulink所采取的动作依次为:,按排列好的次序更新模型中模块的输出。Simulink通过调用模块的输出函数计算模块的输出。Simulink只把当前值、模块的输入以及状态量传给这些函数计算模块的输出。对于离散系统,Simulink只有在当前时间是模块采样时间的整数倍时,才会更新模块的输出。,7.1 Simulink的概述和基本操作,按排列好的次序更新模型中模块的状态,Simulink计算一个模块的离散状态的方法时调用模块的离散状态更新函数。而对于连续状态,则对连续状态的微分(在模块可调用的函数里,有一个用于计算连续微分的函数)进行数值积分来获得当前的连续状态。,检查模块连续状态的不连续点。Simulink使用过零检测来检测连续状态的不连续点。,计算下一个仿真时间步的时间。这是通过调用模块获得下一个采样时间函数来完成的。,(3)定模块更新次序,在仿真中,Simulink更新状态和输出都要根据事先确定的模块更新次序,而更新次序对方针结果的有效性来说非常关键。特别当模块的输出是当前输入值的函数时,这个模块必须在驱动它的模块被更新之后才能被更新,否则,模块的输出将没有意义。,7.1 Simulink的概述和基本操作,注意:,不要把模块保存到模块文件的次序与仿真过程模块被更新的次序相混淆。Simulink在模块初始化时以将模块排好正确的次序。,为了建立有效的更新次序,Simulink根据输入和输出的关系将模块分类。其中,当前输出依赖于当前输入的模块称为直接馈入模块,所有其他的模块都称为非虚拟模块。直接馈入模块的例子有Gain、Product和Sum模块;非直接馈入模块的例子有Integrator模块(它的输出只依赖于它的状态),Constant模块(没有输入)和Memory模块(它的输出只依赖于前一个模块的输入)。,基于上述分类,Simulink使用下面两个基本规则对模块进行排序:,每个模块必须在它驱动的所有模块更新之前被更新。这条规则确保了模块被更新时输入有效。,若非直接馈入模块在直接馈入模块之前更新,则它们的更新次序可以是任意的。这条规则允许Simulink在排序过程中忽略非虚拟模块。,另外一个约束模块更新次序的因素是用户给模块设定优先级,Simulink在低优先级模块之前更新高优先级模块。,7.2 基本模块,由于大多数物理系统都可以用微分方程组和代数方程组来描述,Simulink也采用的是本教材第四章介绍的面向结构图的数字仿真原理。但其功能块的类型、数值解法、功能快的描述、以及建模方式和方法远远超出CSS仿真程序包,其界面也更加友好。,Simulink 4把功能块分成9类,分别放置在9个库中,如图所示:源模块库(Sources)、输出显示库(Sinks)、离散模块库(Discrete)、连续模块库(Continuous)、非线性模块库(Nonlinear)、数学函数库(Math)、通用函数及列表库(Functions and Tables)、信号处理及系统类模块库(Signal and Systems)和子系统模块库(Subsystems)。,表到表列出了个库包含的主要模块及简单说明。图到图列出了各库包含的主要模块种类图形。,7.2 基本模块,表7.2.1 Source库,模 块 名,说 明,Clock,显示或者提供仿真时间,Constant,产生一个常数值信号,Digital clock,产生数字采样时间信号,Digital pulse generator,产生数字脉冲信号,From file,从文件读取数据输入,From work space,从工作间定义的矩阵读入数据,Pulse generator,产生脉冲信号,Ramp,产生“斜坡”信号,Random number,产生正态分布的随机信号,Repeating sequence,产生周期序列信号,Signal generator,信号发生器,Sine wave,正弦波信号,Step,产生一个阶跃信号,Uniform random number,产生均匀分布的随机信号,7.2 基本模块,模 块 名,说 明,Display,显示输入信号的值,Scope,显示信号的波形,Stop simulation,当输入信号为0时结束仿真,To file,向文件中写数据,To workspace,向工作间定义的变量写数据到,XY graph,Matlab图形窗口显示信号的二维图,表7.2.2 Sinks库,7.2 基本模块,模 块 名,说 明,Discrete filter,实现IIR和FIR滤波器,Discrete state-space,实现离散状态空间系统,Discrete-time integrator,离散时间积分器,Discrete transfer fcn,实现离散传递函数,Discrete zero-pol,实现用零极点表达的离散传递函数,First-order hold,实现一阶采样保持系统,Unit delay,单位采样时间延迟器,Zero-order hold,实现采样的零阶保持,表7.2.3 Discrete库,7.2 基本模块,模 块 名,说 明,Derivative,信号的微分运算,Integrator,信号的积分运算,Memory,输出前一个时间步的输入值,State-space,实现线性状态空间系统,Transfer fcn,实现线性传递系统,Transport delay,对输入信号进行传输延时,Variable transport delay,对输入信号进行可变时间的传输延时,Zero-pole,实现零极点表达式的传递函数,表7.2.4 Continuous库,7.2 基本模块,模 块 名,说 明,Abs,信号的绝对值,Algebraic constraint,将输入信号强制为零,Combinatorial logic,实现一个真值表,Complex to magnitude-angle,输出一个复数输入信号的幅角和模,Complex to real-imag,输出一个复数信号的实部和虚部,Dot product,向量信号的点积,Gain,将模块的输入信号乘上一个增益,Logical operator,输入信号的逻辑操作,Magnitude-angle to complex,将模和幅角的信号转换成为复数信号,表,7.2.5 Math库,7.2 基本模块,Math function,实现数学函数,Matrix gain,将输入乘上一个矩阵增益,Minmax,信号的最小值和最大值,Product,信号的乘积或者商,Real-imag to complex,将实部虚部的信号转换成为复数信号,Relational operator,进行指定的关系运算,Rounding function,实现舍入运算,Sign,符号函数,Slider gain,滑块增益,Sum,输入信号的和,Trigonometric function,实现三角函数运算,7.2 基本模块,模 块 名,说 明,Fcn,实现自定义表达式的输入信号,Look-up table,实现输入的线性查表,Look-up table(2-d),实现两维信号的线性查表,Matlab fcn,实现Matlab函数或表达式输入信号,S-Function,S函数模块,表7.2.6 Function and Tables函数,7.2 基本模块,模 块 名,说 明,Backlash,偏移模块,Coulomb&viscous friction,模拟原点不连续系统,Dead zone,输出一个零输出的区域,Manual switch,在信号间手工切换,Multiport switch,多端口的切换(开关)器,Quantizer,按指定的间隔离散化输出信号,Rate limiter,限制信号的改变速率,Relay,实现继电器功能,Saturation,限制信号的饱和度,Switch,在两个信号间切换,表7.2.7 Nonlinear 库,7.2 基本模块,模 块 名,说 明,Bus selector,有选择的输出信号,Configurable subsystem,代表任何一个从指定的库中选择的模块,Data store memory,定义共享数据存储空间,Date store read,从共享数据空间读数据并输出,Date story write,写数据到共享数据存储空间,Date type conversion,将信号转换为其它数据类型,Demux,将一个向量信号分解输出,Enable,为子系统增加激活断口,From,从一个Goto模块接受信号,Goto,传递信号到From模块,Goto tag visibility,定义Goto模块标记的可视域,Ground,将末连接的输入端接地,表,7.2.8 Signal and Systems库,7.2 基本模块,模 块 名,说 明,Hit crossing,检测过零点,IC,设置一个信号的初始值,Inpl,为子系统建立一个输入端口或建立一个外部入口,Merge,将几个输入量合并为一个标量的输出串,Modelinfo,显示模型信息,Mux,将几个输入信号合成一个向量信号,Out 1,为子系统建立一个输出端口或建立一个外部出口,Probe,信号的宽度,采样时间及信号类型,Subsystem,子系统模块,Terminator,结束一个未连接的输出端口,Trigger,为子系统增加触发端口,Width,输入向量的输出宽度,Selector,在输入信号中选择并输出,表7.2.8 Signal and Systems库,7.2 基本模块,图7.2.1 库的类型 图7.2.2 Sources库,7.2 基本模块,图7.2.3 Sinks库,图7.2.4 Discrete库,图7.2.5 Continuous库,7.2 基本模块,图7.2.6 Math库,图7.2.7 Nonlinear库,7.2 基本模块,图7.2.8 Signak&Systems库,7.2 基本模块,图7.2.9 Subsystems库,7.2 基本模块,图7.2.10 Functions&Tables库,7.2 基本模块,在Simulink中,各功能模块的参数描述都可以由用户通过该模块的模块属性对话框进行操作给出或修改。图是积分模块的属性对话框,从图可见,它有9个可控参数。,(1)External reset 为外部重置选项。它用在当重置信号中发生触发事件时,模块将照初始条件重置状态。,(2)initial condition source 此项用来从初始条件参数或外部模块中获取初始条件。,(3)initial condition 此区域用来设置初始条件。,(4)Limit output 如果此项被选中,则状态将被限制在饱和度下限和上限之间。,(5)Upper saturation limit 此参数用来设置饱和度上限。,(6)Lower saturation limit此参数用来设置饱和度下限。,(7)Show saturation port 若此项被选中,则模块上将增加一个饱和度端口。,(8)Show state port 若此项被选中,则模块上将增加一个状态端口。,7.2 基本模块,(9)Absolute tolerance 此参数用来设置模块状态的绝对误差。,图7.2.11 积分模块属性对话框,7.3 建模方法,利用Simulink建立物理系统和数学系统的仿真模型,,关键是对Simulink提供的功能模块进行操作,即用适当的方式将各种模块连接在一起。,本小节将介绍模块的基本操作。在介绍具体的操作之前先对建模过程提两点建议:,在建模之前,应对模块和信号线有一个整体、清晰和仔细的安排,以便能减少建模时间;,及时对模块和信号线命名、及时对模型加标注,以增强模型的可读性。,本小节将详细介绍创建Simulink仿真模型的过程,包括模块操作、编辑信号线及标注模型等。,7.3 建模方法,7.3.1 模块的操作,模块是建立Simulink模型的基本单元。用适当的方法把各种模块连接在一起就能够建立任何动态系统的模型。,一、选取模块,当选取单个模块时,只要用鼠标在模块上单击即可,这是模块的角上出现黑色的小方块。选取多个模块时,在所有模块所占区域的一角按下鼠标左键不放,拖向该区域的对角,在此过程中会出现虚框,当虚框包住了要选的所有模块后,放开鼠标左键,这时在所有被选模块的角上都会出现小黑方块,表示模块被选中了。此过程如图所示。,图7.3.1 选取多个模块,7.3 建模方法,二、复制、删除模块,(1)在不同的窗口之间复制,当我们建立模型时,需要从模块库窗口或者已经存在的窗口把需要的模块复制到新建模型文件的窗口。要对已经存在的模块进行编辑时,有时也需要从模块库窗口或另一个已经存在的模型窗口复制模块。,最简单的办法是用鼠标左键点住要复制的模块(首先打开源模块和目标模块所在的窗口),按住左键移动鼠标到相应窗口(不用按住Ctrl键),然后释放,该模块就会被复制过来,而源模块不会被删除。,当然还可以使用Edit菜单的Copy和Paste命令来完成复制:先选定要复制的模块,选择Edit菜单下的Copy命令,到目标窗口的Edit菜单下选择Paste命令。,(2)在同一个模型窗口内复制,有时一个模型需要多个相同的模块,这时的复制方法如下:,用鼠标左键点住要复制的模块,按住左键移动鼠标,同时按下Ctrl键,到适当位置释放鼠标,该模块就被复制到当前位置。更简单的方法是按住鼠标右键(不按Ctrl键)移动鼠标。,7.3 建模方法,另一种方法是先选定要复制的模块,选择Edit下的Copy命令,然后选择Paste命令。,在图的复制结果中我们会发现复制出的模块名称在原名称的基础上又加了编号,这是Simulink的约定:每个模型中的模块和名称是一一对应的,相同的模块或不同的模块都不能用同一个名字。,图7.3.2 在同一模型窗口内复制模块,7.3 建模方法,(3)删除模块,选定模块,选择Edit菜单下的Cut(删除到剪贴板)或Clear(彻底删除)命令。或者在模块上单击鼠标右键,在弹出菜单上选择Cut或Clear命令。,三、模块的参数和特性设置,Simulink中几乎所有模块的参数(Parameter)都允许用户进行设置。只要双击要设置参数的模块就会弹出设置对话框,如图所示。这是正弦波模块的参数设置对话框,您可以设置它的幅值、频率、相位、采样时间等参数。模块参数还可以用set-param命令修改,这在后面将会讲到。,7.3 建模方法,每个模块都有一个内容相同的特性(Properties)设置对话框,如图所示。它包括如下几项:,(,1)说明(Description),是对该模块在模型中用法的注释。,(2)优先级(Priority),规定该模块在模型中相对于其他模块执行的有限顺序。优先级的数值必须是整数或不输入数值,这时系统会自动选取合适的优先级。优先级的数值越小(可以是负整数),优先级越高。,(3)标记(Tag),用户为模块添加的文本格式的标记。,(4)调用函数(Open function),当用户双击该模块时调用的Matlab函数。,(5)属性格式字符串(Attributes format string),7.3 建模方法,图7.3.3 模块参数设置对话,图7.3.4 模块特性设置对话框,7.3 建模方法,指定在该模块的图标下显示模块的那个参数,以什么格式显示。属性格式字符串由任意的文本字符串加嵌入式参数名组成。例如,对一个传递函数模块指定如下的属性格式字符串:,优先级n传函分母,该模块显示如图的内容:,如果参数的值不是字符串或数字,参数值的位置会显示N/S(not supported)。如果参数名无效,参数值的位置将显示“?”。,图7.3.5 设置属性格式字符串后的效果,7.3 建模方法,四、模块外形的调整,(1)改变模块的大小,选定模块,用鼠标点住其周围的四个黑方块中的任意一个拖动,这时会出现虚线的矩形表示新模块的位置,到需要的位置后释放鼠标即可。,(2)调整模块的方向,选定模块,选取菜单Format下的Rotate Block使模块旋转90,Flip Block使模块旋转180。效果如图所示。,(3)给模块加阴影,选定模块,选取菜单Format下的Show Drop Shadow使模块产生阴影效果。如图所示。,图7.3.7 模块的阴影效果,图7.3.6 调整模块的方向,7.3 建模方法,五、模块名的处理,(1)模块名的显示与否选定模块,选取菜单Format下的Hide Name,模块名就会被隐藏,同时Hide Name改为Show Name。选取Show Name就会使模块隐藏的名字显示出来.,(2)修改模块名,用鼠标左键单击模块名的区域,这时会在此处出现编辑状态的光标,在这种状态下能够对模块名随意修改。,模块名和模块图标中的字体也可以更改,方法是选定模块,在菜单Format下选取Font,这时会弹出Set Font的对话框,在对话框中选取想要的字体。,(3)改变模块名的位置,模块名的位置有一定的规律,当模块的接口在左右两侧时,模块名只能位于模块的上下两侧,缺省在下侧:当模块的接口在上下两侧时,模块名只能位于模块的左右两侧,缺省在左侧。,因此模块名只能从原位置移到相对的位置。可以用鼠标拖动模块名到其相对的位置;也可以选定模块,用菜单Format下的Flip Name实现相同的移动。,7.3 建模方法,7.3.2 模块的连接,上面我们介绍了对模块本身的各种操作。当我们设置好了各个模块后,还需要把它们按照一定的顺序连接起来采能组成一个完整的系统模型。一下我们将讨论模块连接的相关问题。,一、在模块间连线,(1)连接两个模块,这是最基本的情况:从一个模块的输出端连到另一个模块的输入端。方法是在移动鼠标到输出端,鼠标的箭头会变成十字形光标,这是点住鼠标左键,移动鼠标到另一个模块的输入端,当十字光标出现“重影”时,释放鼠标左键就完成了连接。,如果两个模块不在同一水平线上,连线是一条折线。要用斜线表示,需要在连接时按住Shift键。两种连接的结果见图。,图7.3.8 两模块不在同一水平线上,7.3 建模方法,(2)模块间连线的调整,如图,这种调整模块间连线位置的情况采用鼠标简单拖动的办法实现。即先把鼠标移到需要移动的线段的位置,按住鼠标左键,移动鼠标到目标位置,释放鼠标左键。,还有一种情况如图所示,要把一条直线分成斜线段。调整方法和前一种情况类似,不同之处在于按住鼠标之前要先按下Shift键,出现小黑方框之后,鼠标点住小黑方框移动,移动好后释放Shift键和鼠标。,图7.3.9 调整连线的位置(一),图7.3.10 调整连线的位置(二),7.3 建模方法,(3)在连线之间插入模块,把该模块用鼠标拖到连线上,然后释放鼠标即可。,(4)连线的分支,我们经常会碰到一些情况,需要把一个信号输送到不同的模块,这时就需要分支结构的连线。如图所示,要把正弦波信号实时显示出来,同时还要到存到文件。这种情况地步骤是:在先连好一条线以后,把鼠标移到支线的起点位置,先按下键,然后按住Ctrl鼠标拖到目标模块的输入端,释放鼠标和Ctrl键。,图7.3.11 连线的分支,7.3 建模方法,二、在连线上反映信息,(1)用粗线表示向量,为了能比较直观地区别各个模块之间传输的数据是数据还是矩阵(向量),可以选择模型文件菜单Format下的Wide vector Lines选项,这样传输向量的连线就会变粗。如果再选择Format 下的Vector Lines Widths选项,在传输矩阵的连线上方会显示出通过该连线的矩阵维数。如图,模块State Space的输入为二维矩阵,在加粗的输入输出线的上方分别标出了相应矩阵的维数。,图7.3.12 用粗线表示向量,7.3 建模方法,(2)显示数据类型,在连线上可以显示一个模块输出的数据类型:选择菜单Format下的Port Data Types选项。结果如图所示。,图7.3.13 在连线上显示数据类型,(3)信号标记,为了使模型更加直观、可读性更强,我们可以为传输的信号,作标记。,建立信号标记的办法是:双击要做标记的线段,出现一个小,文本编辑框,在里面输入标记的文本,这样就建立了一个信,号标记。信号标记可以随信号的传输从一些模块中进行传递。,支持这种传递的模块有Mux、Demux、Inport、From、,Selector、Subsystem和Enable。,7.3 建模方法,要实现信号标记的传递,需要在上面列出的某个模块的输出端建立一个以“Creat Subsystem】,Simulink将会用一个子系统模块代替被选中的模块组,如图所示。,图7.5.5 压缩后的模型图,7.5子系统和子系统的封装,步骤三:,子系统模块将有一个默认输入端口和输出端口。输入端口和输出端口的默认名分别为In1和Out1。调整子系统和模型窗口的大小使之美观,如图所示。,图7.5.6 压缩后的模型图,7.5子系统和子系统的封装,若想查看子系统内容或对子系统进行再编辑,可以双击子系统模块,则会出现一个显示子系统内容的新窗口。在窗口内,除了原始的模块外,Simulink自动添加了输入模块和输出模块,分别代表子系统的输入端口和输出端口。改变它们的标签会使子系统的输入输出端口的标签也随着变化。,特别注意:,菜单命令【Edit/Creat Subsystem】没有相反的操作命令。也就是说一旦将一组模块压缩成子系统,就没有直接还原的处理方法了(UNDO除外)。因此一个理想的处理方法是在压缩子系统之前先把模型保存一下,作为备份。,二、子系统模块,在创建模型的时候,如果需要一个子系统,也可以直接在子系统窗口中创建。这样就省去了上面的压缩子系统和重新安排窗口的步骤。,要使用子系统模块创建新的子系统,先从Signals&Systems模块库中拖一个子系统模块到模型窗口中。双击子系统模块,就会出现一个子系统编辑窗口。,注意:,在信号输入端口要使用一个输入模块,在信号输出端口要使用一个输出模块。,子系统创建完毕后,关闭子系统窗口。关闭子系统窗口之前不需要做任何保存操作。子系统作为模型的一部分,当模型被保存时,子系统会自动保存。,7.5子系统和子系统的封装,7.5子系统和子系统的封装,例7.5.1 模拟如图所示的弹簧质量系统的运动状态。,单个小车系统的运动方程如下:,图7.5.7 弹簧质量系统,先建立如图所示的单个小车系统的子系统,图7.5.8 单个小车系统,7.5子系统和子系统的封装,使用子系统模块创建如图所示的子系统,此子系统用来模拟一个小车的运动。子系统的输入为小车的左距x(n-1)和右距x(n+1),输出为小车的当前位置x(n).,子系统完成之后,关闭 子系统窗口。复制两次此子系统模块,并如图所示链接起来。,图7.5.9 小车1的子系统模型,图7.5.10 使用子系统的三小车模型,7.5子系统和子系统的封装,为了可以对每个小车的参数进行赋值,要做以下设置:,对小车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。,7.5子系统和子系统的封装,此时就可以很方便地 使用Matlab变量对弹簧常数k1,k2,k3和小车质量m1,m2,m3进行赋值。这里使用了一个名为set_k_m 的M文件对它进行赋值,如下所示:,&set the spring constants and block mass values,k1=1;,k2=2;,k3=4;,m1=1;,m2=3;,m3=2;,仿真开始之前在Matlab命令窗口中运行此M文件。,然后,指定示波器模块把显示数据保存到工作间中,并设置仿真的起始时间(StartTime)为0,终止时间(StopTime)为100。,仿真结束后,在Matlab窗口中把所得到的小车3的显示数据绘制成图。,7.5子系统和子系统的封装,7.5.2 子系统的封装,封装技术是将Simulink子系统“包装”成一个模块,并可以如同使用Simulink内部模块一样使用的技术。每个封装模块都可以有一个自定义的图标用来设定参数的对话框,参数设定方法也与Simulink模块库中的内部模块完全相同。,为了更好的理解封装的含义,见图所示的模型。此模型与例中的模型完全等价,但它要更容易使用。双击Spring-mass1模块可以打开该模块属性的对话框。与例中打开每个模块去修改参数不同,这里可以直接在此对话框中输入参数。对话框的结构与形式都和“原装”的模型毫无两样。,本节将主要以此弹簧质量系统为例来详细介绍创建一个封装模块的步骤。,7.5子系统和子系统的封装,创建一个封装模块的主要步骤分为三步:,创建一个子系统;,选中子系统,选择模型窗口菜单中的【EditMask subsystem】选项生成封装模块;,使用封装编辑器设置封装文本、对话框和图标。,一、子系统到封装模块的转换,当按照上节中介绍的方法创建以弹簧质量子系统模块之后(如图所示),将其复制到一个新的窗口中,如图所示。选中此模块,在窗口的菜单中执行【EditMask subsystem】指令,弹出如图所示的一个封装编辑对话框。该对话框有三个选项卡。下面分别讨论这三个选项卡的功能和使用。,7.5子系统和子系统的封装,图7.5.11 将子系统复制到新窗口 图7.5.12 封装编辑对话框,7.5子系统和子系统的封装,(1)文本页 Documentation,图是编辑器的文本页。它也包括三个区域,每个区域都为一个自由区,既可填写也可以不填写。,Mask type,:该区内容将作为模块的类型显示在封装模块的对话框中。,Block description,:此区中的内容将显示在封装模块对话框的上部,它的位置在后面的图中可能看得更清楚。其内容脑壳描述模块的功用的简短语句或其它关于使用此模块的注意事项等。,Block help,:当对话框中的【help】按钮按下时,MATLAB的帮助系统将显示此区中的内容,其内容应当包括使用此模块的详细说明。,7.5子系统和子系统的封装,(2)初始化页 Initialization,初始化页是用来设置封装模块参数项的,如图所示。此页也包括三个区域。,上区为Mask type区。此封装类型区与文本页中的封装类型区是等同的,可以在任意一页中定义或改变封装类型。,中区是用来设置封装模块对话框中的输入变量项目,如输入变量或操作选择等等。此区包括一个滚动项目列表、一套“加入”、“删除”和“移动”按钮,以及5个设置项目属性的编辑区。,底区为Initialization commands,在此区中可以输入MATLAB语句,如定义变量、初始变量值等等。,7.5子系统和子系统的封装,封装子系统与非封装子系统的一个重要的区别在于,模块对话框中变量的作用范围,。非封装子系统模块中的变量可以直接在MATLAB工作间中赋值。而封装子系统的模块则不能。,封装子系统有一个独立于MATLAB工作间及其它子系统的内部存储空间、这个特点可以防止模块变量与其它工作间中无关变量的冲突。,因此,在封装模块中用到的变量要在封装编辑器对话区或初始命令区中设置。,7.5子系统和子系统的封装,图7.5.13 封装编辑器的文本页 图7.5.14 封装编辑器的初始化页,7.5子系统和子系统的封装,(3)图标页 Icon,编辑器的图标页如图所示,它是用来给封装模块设计自定义图标的。此页分6个区。顶区的【Mask type】同其它两页中的【Mask type】是等同的。【Deawing commands】区是以MATLAB语句来绘制图标的编辑区。其余的4个区是用来指定图标的属性,理解了图标的这些属性再来分析图标的绘制命令是很容易的。,Icon fram:,第一个属性为图标框选项,他由一个下拉菜单组成,分别有可见、不可见选项。所谓的图标框即图标的边界线。,Icon transparency,:第二个属性为图标的透明度选项,也是由一个下拉菜单组成,有两个选项,透明和不透明。,Icon rotation,:第三个选项为图标旋转选项,其下拉菜单选项为固定和旋转。这个选项决定了当执行【FormatFlip block】或【FormalRotate Block】指令时的图标形状。,Drawing cooedenates,:最后一个区是图形坐标区,用来设置绘图的比例。它有三个选项:,Pixed,:用来设置绘图系为绝对坐标系,其效果为当模块图调整大小时,图标不随其大小的改变而改变。此参数下的坐标系应为象素点坐标,图标的左下角为坐标系的原点。,Autoscale,:该选项使得图标图形恰好充满整个模块。,Normalized,:该选项是设置绘图比例在0河1之间的选项。图标的左下角的坐标定
展开阅读全文