Simulink建模和仿真课件.ppt
第七章 Simulink建模和仿真,在计算机技术飞速发展的今天,许多科学研究、工程设计由于其复杂性越来越高,因此与计算机的接合日趋紧密。也正是计算机技术的介入,改变了许多学科的结构、研究内容和研究方向。例如,计算流体力学、计算物理学、计算声学等新兴学科的兴起,均与计算机技术的发展分不开。控制理论、仿真技术本身与计算机的接合就十分紧密,而随着专业领域的研究深入和计算机软硬件技术的发展,这种联系呈现更加紧密。计算控制论的建立,足以说明这个问题。而这种发展,又以系统仿真技术的发展分不开的。为了满足用户对工程计算的要求,一些软件公司相继推出一批数学类科技应用软件,如Matlab、Xmath、Mathematica、Maple等。其中MathWorks公司推出的Matlab由于有强大的功能和友好的用户界面受到越来越多的科技工作者的青睐,尤其是控制领域的专家和学者.,天马行空官方博客:http:/;QQ:1318241189,第七章 Simulink建模和仿真,Matlab具有友好的工作平台和编程环境、简单易学的编程语言、强大的科学计算和数据处理能力、出色的图形和图像处理功能、能适应多领域应用的工具葙、适应多种语言的程序接口、模块化的设计和系统级的仿真功能等,诸多的优点和特点。支持Matlab仿真是Simulink工具箱,Simulink一般可以附在Matlab上同时安装,也有独立版本来单独使用。但大多数用户都是附在Matlab上,以便能更好地发挥Matlab在科学计算上的优势,进一步扩展Simulink的使用领域和功能。本章详细地向用户介绍Simulink地建模方法、使用操作、以及使用Simulink进行系统级的仿真和设计原理。使读者通过本章地学习,不但可以进一步掌握计算机仿真的基本概念和理论,也可以初步学会使用Simulink去真正地运用仿真技术解决科研和工程中地实际问题。,第七章 Simulink建模和仿真 7.1 Simulink的概述和基本操作,近几年来,在学术界和工业领域,Simulink已经成为动态系统建模和仿真领域中应用最为广泛的软件之一。Simulink可以很方便地创建和维护一个完整地模块,评估不同地算法和结构,并验证系统的性能。由于Simulink是采用模块组合方式来建模,从而可以使得用户能够快速、准确地创建动态系统的计算机仿真模型,特别是对复杂的不确定非线性系统,更为方便。Simulink模型可以用来模拟线性和非线性、连续和离散或者两者的混合系统,也就是说它可以用来模拟几乎所有可能遇到动态系统。另外Simulink还提供一套图形动画的处理方法,使用户可以方便的观察到仿真的整个过程。Simulink没有单独的语言,但是它提供了S函数规则。所谓的S函数可以是一个M函数文件、FORTRAN程序、C或C+语言程序等,通过特殊的语法规则使之能够被Simulink模型或模块调用。S函数使Simulink更加充实、完备,具有更强的处理能力。,天马行空官方博客:http:/;QQ:1318241189,第七章 Simulink建模和仿真 7.1 Simulink的概述和基本操作,同Matlab一样,Simulink也不是封闭的,他允许用户可以很方便的定制自己的模块和模块库。同时Simulink也同样有比较完整的帮助系统,使用户可以随时找到对应模块的说明,便于应用。综上所述,Simulink就是一种开放性的,用来模拟线性或非线性的以及连续或离散的或者两者混合的动态系统的强有力的系统级仿真工具。目前,随着软件的升级换代,在软硬件的接口方面有了长足的进步,使用Simulink可以很方便地进行实时的信号控制和处理、信息通信以及DSP的处理。世界上许多知名的大公司已经使用Simulink作为他们产品设计和开发的强有力工具。,第七章 Simulink建模和仿真 7.1 Simulink的概述和基本操作,图7.1.1 Simulink模型元素关联图,7.1.2 基本操作 一、模型基本结构 一个典型的Simulink模型包括如下三种类型的元素:信号源模块 被模拟的系统模块 输出显示模块 如图7.1.1所示说明了这三种元素之间的典型关系。系统模块作为中心模块是Simulink仿真建模所要解决的主要部分;信号源为系统的输入,它包括常数信号源函数信号发生器(如正弦和阶跃函数波等)和用户自己在Matlab中创建的自定义信号或Matlab工作间中三种。输出模块主要在Sinks库中。,第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作,Simulink模型并不一定要包含全部的三种元素,在实际应用中通常可以缺少其中的一个或两个。例如,若要模拟一个系统偏离平衡位置后的恢复行为,就可以建立一个没有输入而只有系统模块加一个显示模块的模型。在某种情况下,也可以建立一个只有源模块和显示模块的系统。若需要一个由几个函数复合的特殊信号,则可以使用源模块生成信号并将其送入Matlab工作间或文件中。二、仿真运行原理 Simulink仿真包括两个阶段;初始化阶段和模型执行阶段(1)模块初始化 在初始化阶段主要完成以下工作:模型参数传给Matlab进行估值,得到的数值结果将作为模型的实际参数;展开模型的各个层次,每一个非条件执行的子系统被它所包含的模块所代替;,天马行空官方博客:http:/;QQ:1318241189,第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作,模型中的模块按更新的次序进行排序。排序算法产生一个列表以确保具有代数环的模块在产生它的驱动输入的模块被更新后才更新。当然,这一步要先检测出模型中存在的代数环。决定模型中有无显示设定的信号属性,例如名称、数据类型、数值类型以及大小等,并且检查每个模块是否能够接受连接到它输入端的信号。Simulink使用属性传递的过程来确定未被设定的属性,这个过程将源信号的属性传递到它所驱动的模块的输入信号;决定所有无显示设定采样时间的模块的采样时间;分配和初始化用于存储每个模块的状态和输入当前值的存储空间。完成这些工作后就可以进行仿真了。2)模型执行 一般模型是使用数值积分来进行仿真的。所运用的仿真解法器(仿真算法)依赖于模型提供它的连续状态微分能力。计算微分可以分两步进行:,第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作,首先,按照排序所决定的次序计算每个模块的输出。然后,根据当前时刻的输入和状态来决定状态的微分;得到微分向量后再把它返回给解法器;后者用来计算下一个采样点的状态向量。一旦新的状态向量计算完毕,被采样的数据源模块和接受模块才被更新。在仿真开始时模型设定待仿真系统的初始状态和输出。在每一个时间步中,Simulink计算系统的输入、状态和输出,并更新模型来反映计算出的值。在仿真结束时,模型得出系统的输入、状态和输出。在每个时间步中,Simulink所采取的动作依次为:按排列好的次序更新模型中模块的输出。Simulink通过调用模块的输出函数计算模块的输出。Simulink只把当前值、模块的输入以及状态量传给这些函数计算模块的输出。对于离散系统,Simulink只有在当前时间是模块采样时间的整数倍时,才会更新模块的输出。,第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作,按排列好的次序更新模型中模块的状态,Simulink计算一个模块的离散状态的方法时调用模块的离散状态更新函数。而对于连续状态,则对连续状态的微分(在模块可调用的函数里,有一个用于计算连续微分的函数)进行数值积分来获得当前的连续状态。检查模块连续状态的不连续点。Simulink使用过零检测来检测连续状态的不连续点。计算下一个仿真时间步的时间。这是通过调用模块获得下一个采样时间函数来完成的。(3)定模块更新次序在仿真中,Simulink更新状态和输出都要根据事先确定的模块更新次序,而更新次序对方针结果的有效性来说非常关键。特别当模块的输出是当前输入值的函数时,这个模块必须在驱动它的模块被更新之后才能被更新,否则,模块的输出将没有意义。,第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作,注意:不要把模块保存到模块文件的次序与仿真过程模块被更新的次序相混淆。Simulink在模块初始化时以将模块排好正确的次序。为了建立有效的更新次序,Simulink根据输入和输出的关系将模块分类。其中,当前输出依赖于当前输入的模块称为直接馈入模块,所有其他的模块都称为非虚拟模块。直接馈入模块的例子有Gain、Product和Sum模块;非直接馈入模块的例子有Integrator模块(它的输出只依赖于它的状态),Constant模块(没有输入)和Memory模块(它的输出只依赖于前一个模块的输入)。基于上述分类,Simulink使用下面两个基本规则对模块进行排序:每个模块必须在它驱动的所有模块更新之前被更新。这条规则确保了模块被更新时输入有效。若非直接馈入模块在直接馈入模块之前更新,则它们的更新次序可以是任意的。这条规则允许Simulink在排序过程中忽略非虚拟模块。另外一个约束模块更新次序的因素是用户给模块设定优先级,Simulink在低优先级模块之前更新高优先级模块。,天马行空官方博客:http:/;QQ:1318241189,第七章 Simulink建模和仿真 7.2 基本模块,由于大多数物理系统都可以用微分方程组和代数方程组来描述,Simulink也采用的是本教材第四章介绍的面向结构图的数字仿真原理。但其功能块的类型、数值解法、功能快的描述、以及建模方式和方法远远超出CSS仿真程序包,其界面也更加友好。Simulink 4把功能块分成9类,分别放置在9个库中,如图7.2.1所示:源模块库(Sources)、输出显示库(Sinks)、离散模块库(Discrete)、连续模块库(Continuous)、非线性模块库(Nonlinear)、数学函数库(Math)、通用函数及列表库(Functions and Tables)、信号处理及系统类模块库(Signal and Systems)和子系统模块库(Subsystems)。表7.2.1到表7.2.8列出了个库包含的主要模块及简单说明。图7.2.2到图7.2.10列出了各库包含的主要模块种类图形。,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.1 Source库,天马行空官方博客:http:/;QQ:1318241189,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.2 Sinks库,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.3 Discrete库,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.4 Continuous库,天马行空官方博客:http:/;QQ:1318241189,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.5 Math库,第七章 Simulink建模和仿真 7.2 基本模块,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.6 Function and Tables函数,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.7 Nonlinear 库,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.8 Signal and Systems库,第七章 Simulink建模和仿真 7.2 基本模块,表7.2.8 Signal and Systems库,第七章 Simulink建模和仿真 7.2 基本模块,图7.2.1 库的类型 图7.2.2 Sources库,第七章 Simulink建模和仿真 7.2 基本模块,图7.2.3 Sinks库,图7.2.4 Discrete库,图7.2.5 Continuous库,第七章 Simulink建模和仿真 7.2 基本模块,图7.2.6 Math库,图7.2.7 Nonlinear库,第七章 Simulink建模和仿真 7.2 基本模块,图7.2.8 Signak&Systems库,第七章 Simulink建模和仿真 7.2 基本模块,图7.2.9 Subsystems库,第七章 Simulink建模和仿真 7.2 基本模块,图7.2.10 Functions&Tables库,第七章 Simulink建模和仿真 7.2 基本模块,在Simulink中,各功能模块的参数描述都可以由用户通过该模块的模块属性对话框进行操作给出或修改。图7.2.11是积分模块的属性对话框,从图可见,它有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 若此项被选中,则模块上将增加一个状态端口。,第七章 Simulink建模和仿真 7.2 基本模块,(9)Absolute tolerance 此参数用来设置模块状态的绝对误差。,图7.2.11 积分模块属性对话框,第七章 Simulink建模和仿真 7.3 建模方法,利用Simulink建立物理系统和数学系统的仿真模型,关键是对Simulink提供的功能模块进行操作,即用适当的方式将各种模块连接在一起。本小节将介绍模块的基本操作。在介绍具体的操作之前先对建模过程提两点建议:在建模之前,应对模块和信号线有一个整体、清晰和仔细的安排,以便能减少建模时间;及时对模块和信号线命名、及时对模型加标注,以增强模型的可读性。本小节将详细介绍创建Simulink仿真模型的过程,包括模块操作、编辑信号线及标注模型等。,第七章 Simulink建模和仿真 7.3 建模方法,7.3.1 模块的操作模块是建立Simulink模型的基本单元。用适当的方法把各种模块连接在一起就能够建立任何动态系统的模型。一、选取模块当选取单个模块时,只要用鼠标在模块上单击即可,这是模块的角上出现黑色的小方块。选取多个模块时,在所有模块所占区域的一角按下鼠标左键不放,拖向该区域的对角,在此过程中会出现虚框,当虚框包住了要选的所有模块后,放开鼠标左键,这时在所有被选模块的角上都会出现小黑方块,表示模块被选中了。此过程如图7.3.1所示。,图7.3.1 选取多个模块,第七章 Simulink建模和仿真 7.3 建模方法,二、复制、删除模块(1)在不同的窗口之间复制当我们建立模型时,需要从模块库窗口或者已经存在的窗口把需要的模块复制到新建模型文件的窗口。要对已经存在的模块进行编辑时,有时也需要从模块库窗口或另一个已经存在的模型窗口复制模块。最简单的办法是用鼠标左键点住要复制的模块(首先打开源模块和目标模块所在的窗口),按住左键移动鼠标到相应窗口(不用按住Ctrl键),然后释放,该模块就会被复制过来,而源模块不会被删除。当然还可以使用Edit菜单的Copy和Paste命令来完成复制:先选定要复制的模块,选择Edit菜单下的Copy命令,到目标窗口的Edit菜单下选择Paste命令。(2)在同一个模型窗口内复制有时一个模型需要多个相同的模块,这时的复制方法如下:用鼠标左键点住要复制的模块,按住左键移动鼠标,同时按下Ctrl键,到适当位置释放鼠标,该模块就被复制到当前位置。更简单的方法是按住鼠标右键(不按Ctrl键)移动鼠标。,第七章 Simulink建模和仿真 7.3 建模方法,另一种方法是先选定要复制的模块,选择Edit下的Copy命令,然后选择Paste命令。在图7.3.2的复制结果中我们会发现复制出的模块名称在原名称的基础上又加了编号,这是Simulink的约定:每个模型中的模块和名称是一一对应的,相同的模块或不同的模块都不能用同一个名字。,图7.3.2 在同一模型窗口内复制模块,第七章 Simulink建模和仿真 7.3 建模方法,(3)删除模块选定模块,选择Edit菜单下的Cut(删除到剪贴板)或Clear(彻底删除)命令。或者在模块上单击鼠标右键,在弹出菜单上选择Cut或Clear命令。三、模块的参数和特性设置Simulink中几乎所有模块的参数(Parameter)都允许用户进行设置。只要双击要设置参数的模块就会弹出设置对话框,如图7.3.3所示。这是正弦波模块的参数设置对话框,您可以设置它的幅值、频率、相位、采样时间等参数。模块参数还可以用set-param命令修改,这在后面将会讲到。,第七章 Simulink建模和仿真 7.3 建模方法,每个模块都有一个内容相同的特性(Properties)设置对话框,如图7.3.4所示。它包括如下几项:(1)说明(Description)是对该模块在模型中用法的注释。(2)优先级(Priority)规定该模块在模型中相对于其他模块执行的有限顺序。优先级的数值必须是整数或不输入数值,这时系统会自动选取合适的优先级。优先级的数值越小(可以是负整数),优先级越高。(3)标记(Tag)用户为模块添加的文本格式的标记。(4)调用函数(Open function)当用户双击该模块时调用的Matlab函数。(5)属性格式字符串(Attributes format string),第七章 Simulink建模和仿真 7.3 建模方法,图7.3.3 模块参数设置对话,图7.3.4 模块特性设置对话框,第七章 Simulink建模和仿真 7.3 建模方法,指定在该模块的图标下显示模块的那个参数,以什么格式显示。属性格式字符串由任意的文本字符串加嵌入式参数名组成。例如,对一个传递函数模块指定如下的属性格式字符串:优先级n传函分母该模块显示如图7.3.5的内容:,如果参数的值不是字符串或数字,参数值的位置会显示N/S(not supported)。如果参数名无效,参数值的位置将显示“?”。,图7.3.5 设置属性格式字符串后的效果,第七章 Simulink建模和仿真 7.3 建模方法,四、模块外形的调整(1)改变模块的大小选定模块,用鼠标点住其周围的四个黑方块中的任意一个拖动,这时会出现虚线的矩形表示新模块的位置,到需要的位置后释放鼠标即可。(2)调整模块的方向选定模块,选取菜单Format下的Rotate Block使模块旋转90,Flip Block使模块旋转180。效果如图7.3.6所示。(3)给模块加阴影选定模块,选取菜单Format下的Show Drop Shadow使模块产生阴影效果。如图7.3.7所示。,图7.3.7 模块的阴影效果,图7.3.6 调整模块的方向,第七章 Simulink建模和仿真 7.3 建模方法,五、模块名的处理(1)模块名的显示与否选定模块,选取菜单Format下的Hide Name,模块名就会被隐藏,同时Hide Name改为Show Name。选取Show Name就会使模块隐藏的名字显示出来.(2)修改模块名用鼠标左键单击模块名的区域,这时会在此处出现编辑状态的光标,在这种状态下能够对模块名随意修改。模块名和模块图标中的字体也可以更改,方法是选定模块,在菜单Format下选取Font,这时会弹出Set Font的对话框,在对话框中选取想要的字体。(3)改变模块名的位置模块名的位置有一定的规律,当模块的接口在左右两侧时,模块名只能位于模块的上下两侧,缺省在下侧:当模块的接口在上下两侧时,模块名只能位于模块的左右两侧,缺省在左侧。因此模块名只能从原位置移到相对的位置。可以用鼠标拖动模块名到其相对的位置;也可以选定模块,用菜单Format下的Flip Name实现相同的移动。,第七章 Simulink建模和仿真 7.3 建模方法,7.3.2 模块的连接上面我们介绍了对模块本身的各种操作。当我们设置好了各个模块后,还需要把它们按照一定的顺序连接起来采能组成一个完整的系统模型。一下我们将讨论模块连接的相关问题。一、在模块间连线(1)连接两个模块这是最基本的情况:从一个模块的输出端连到另一个模块的输入端。方法是在移动鼠标到输出端,鼠标的箭头会变成十字形光标,这是点住鼠标左键,移动鼠标到另一个模块的输入端,当十字光标出现“重影”时,释放鼠标左键就完成了连接。如果两个模块不在同一水平线上,连线是一条折线。要用斜线表示,需要在连接时按住Shift键。两种连接的结果见图7.3.8。,图7.3.8 两模块不在同一水平线上,第七章 Simulink建模和仿真 7.3 建模方法,(2)模块间连线的调整如图7.3.9,这种调整模块间连线位置的情况采用鼠标简单拖动的办法实现。即先把鼠标移到需要移动的线段的位置,按住鼠标左键,移动鼠标到目标位置,释放鼠标左键。还有一种情况如图7.3.10所示,要把一条直线分成斜线段。调整方法和前一种情况类似,不同之处在于按住鼠标之前要先按下Shift键,出现小黑方框之后,鼠标点住小黑方框移动,移动好后释放Shift键和鼠标。,图7.3.9 调整连线的位置(一),图7.3.10 调整连线的位置(二),第七章 Simulink建模和仿真 7.3 建模方法,(3)在连线之间插入模块把该模块用鼠标拖到连线上,然后释放鼠标即可。(4)连线的分支我们经常会碰到一些情况,需要把一个信号输送到不同的模块,这时就需要分支结构的连线。如图7.3.11所示,要把正弦波信号实时显示出来,同时还要到存到文件。这种情况地步骤是:在先连好一条线以后,把鼠标移到支线的起点位置,先按下键,然后按住Ctrl鼠标拖到目标模块的输入端,释放鼠标和Ctrl键。,图7.3.11 连线的分支,第七章 Simulink建模和仿真 7.3 建模方法,二、在连线上反映信息(1)用粗线表示向量为了能比较直观地区别各个模块之间传输的数据是数据还是矩阵(向量),可以选择模型文件菜单Format下的Wide vector Lines选项,这样传输向量的连线就会变粗。如果再选择Format 下的Vector Lines Widths选项,在传输矩阵的连线上方会显示出通过该连线的矩阵维数。如图7.3.12,模块State Space的输入为二维矩阵,在加粗的输入输出线的上方分别标出了相应矩阵的维数。,图7.3.12 用粗线表示向量,第七章 Simulink建模和仿真 7.3 建模方法,(2)显示数据类型在连线上可以显示一个模块输出的数据类型:选择菜单Format下的Port Data Types选项。结果如图7.3.13所示。,图7.3.13 在连线上显示数据类型,(3)信号标记 为了使模型更加直观、可读性更强,我们可以为传输的信号 作标记。建立信号标记的办法是:双击要做标记的线段,出现一个小 文本编辑框,在里面输入标记的文本,这样就建立了一个信 号标记。信号标记可以随信号的传输从一些模块中进行传递。支持这种传递的模块有Mux、Demux、Inport、From、Selector、Subsystem和Enable。,第七章 Simulink建模和仿真 7.3 建模方法,要实现信号标记的传递,需要在上面列出的某个模块的输出端建立一个以“”开头的标记。如图7.3.14所示。当开始仿真或执行Edit菜单下的Updata Diagram命令时,传输过来的信号标记就会显示出来。图7.3.15显示出了这个传递的结果。,图7.3.14 信号标记的建立,图7.3.15 信号标记的传递,第七章Simulink建模和仿真 7.4 系统仿真举例,利用Simulink仿真,其仿真工作过程与我们前面几节所介绍的仿真方法类似,对应与Simulink采用的图形输入方式。因此,我们对其建模有以下基本要求:清晰性一个大的系统往往由许多子系统组成,因此对应的系统模型也由许多子模型组成。在子模型与子模型之间,除了为实现研究目的所必需的信息联系以外,相互耦合要尽可能少,结构尽可能清晰。切题性系统模型只应该包括与研究目的有关的方面,也就是与研究目的有关的系统行为子集的特征描述。对于同一个系统,模型不是唯一的,研究目的不同,模型也不同。如研究空中管制问题,所关心的是飞机质心动力学与坐标动力学模型;如果研究飞机的稳定性和操纵性问题,则关心的是飞机绕质心的动力学和驾驶仪动力学模型。,第七章 Simulink建模和仿真 7.4 系统仿真举例,精确性同一个系统的模型按其精确程度要求可以分为许多级。对不同的工程,精确程度要求不一样。例如用于飞行器系统研制全过程的工程仿真器要求模型的精度较高,甚至要考虑到一些小参数对系统的影响,这样的系统模型复杂,对仿真计算机的性能要求也高;但用于训练飞行员的飞行仿真器,对模型的精度要求则相对低一些,只要被培训人员感觉“真”即可。集合性这是指把一些个别的实体能组成更大实体的程度,有时要尽量从能合并成一个大的实体的角度考虑对一个系统实体的分割。例如对武器射击精度的鉴定,并不十分关心每发子弹的射击偏差,而着重讨论多发子弹的统计特性。,第七章Simulink建模和仿真 7.4 系统仿真举例,7.4.1非线性系统的模拟例7.4.1 汽车行驶如图7.4.1所示的斜坡上通过受力分析可知在平行于斜面的方向上有三个力作用于汽车上:发动机的力、空气阻力和重力沿斜面的分量下滑力。设计汽车控制系统并进行仿真。,图7.4.1 斜坡上的汽车,由牛顿第二定律,汽车的运动方程为:,其中m代表汽车的质量,x为汽车的位移。,在实际系统中总会有下界和上界,上界为发动机的最大推动力,下界为刹车时的最大制动力。,。,第七章Simulink建模和仿真 7.4 系统仿真举例,空气阻力的值为阻力系数,汽车前截面积A和动力学压力P三项的乘积。其中其中,表示空气的密度,表示汽车速度与风速之和。假设且风速以下式的规律变化:因此,空气阻力可以近似为:下面假设马路的斜角于位移的变化率符合规律:则下滑力为:用简单的比例控制法来控制车速:其中,为驱动力,为期望速度值,为反馈增益。这样驱动力正比于速度误差。实际中的驱动力是在上面所设的上下界中变化。于是选。此系统的Simulink模型如图7.4.2所示,仿真时间为1000s。,第七章Simulink建模和仿真 7.4 系统仿真举例,比例控制器的输入为汽车的期望速度值,它由一个滑块增益模块(Slider Gain)外加一个常数输入模块(Constant)组成。比例控制器由一个用来计算速度误差的求和模块(Sum)和一个增益模块Ke组成。发动机输出力的上界和下界由两个最值模块来实现(也可以用非线性模块库中的饱和模块来实现)。,图7.4.2 比例速度控制的汽车模型,第七章Simulink建模和仿真 7.4 系统仿真举例,非线性的下滑力和空气阻力分别由函数模块来计算。其中标签为Aero Force 的函数模块的对话框中的【Expression】区中应填写0。001*(u1+20*sin(0.01*u2)2,标签为Hill Force的应填写30*sin(0.0001*u1)。显示模块(Display)用作速度表,而示波器模块(Scope)则记录了速度变化曲线,如图7.4.3所示。,图7.4.3 汽车的速度变化曲线,说明:此模型也是一个轻度刚性问题的很好的例子,为了观察刚性的影响,先以解法0DE45l来运行模型,然后选择0DE15S再运行仿真,观察其区别。,第七章Simulink建模和仿真 7.4 系统仿真举例,7.4.2 混和系统PID控制器仿真混合系统包括连续和离散两种元素。下面的例子可以更加具体的说明混和系统的创建过程。例7.4.2 为了说明混和系统模型的结构,可以对例7.4.1中的连续控制器用一个采样时间为0。5s的离散比例积分微分控制器代替。图7.4.4显示了连续的PID控制器。此控制器包括三个部分:比例部分、积分部分和微分部分。这三个部分都对计算误差v进行操作。,图7.4.4 连续PID控制器,第七章Simulink建模和仿真 7.4 系统仿真举例,其中比例部分对v信号提供一个比例增益,其表达式为:积分部分用来消除静态误差。其表达式为:对此积分部分需要注意的问题是,若plant模块对起输入信号的变化响应相对比较饱满,则积分就会很快的增加,这种现象成为“积分饱和”。积分饱和可以通过对 加一个上界或下界加以消除。微分部分在模型中起衰减的作用。其输出正比于v的变化率:,第七章Simulink建模和仿真 7.4 系统仿真举例,这就是连续的PID控制器。而离散的PID控制器是在此基础上用离散积分器代替积分部分,有用离散微分模块来近似微分部分。一阶数值微分近似为:此微分近似的传递函数为:,第七章Simulink建模和仿真 7.4 系统仿真举例,图7.4.5所示即为使用了离散PID控制器的汽车模型。其中 此模型除控制器的部分之外都与例1是完全相同的。,图7.4.5 离散控制器的汽车模型,第七章Simulink建模和仿真 7.4 系统仿真举例,它的控制器的三个部分分别是:比例部分由一个领零阶保持和一个比例增益模块组成。比例增益系数也是50。积分部分由一个时间离散积分模块和一个增益模块组成。在离散积分模块中,选择【Limite Output】,并设置饱和限为。控制器的微分部分包括一个离散传递函数模块和一个增益模块。在此例中设仿真运行时间为100s,滑块增益为80。得示波器图形如图7.4.6所示。,图7.4.6 汽车速度控制曲线,在前面的章节中,介绍了连续离散和混合系统创建器Simulink模型的基本方法。根据前面的介绍,基本可以创建任何物理系统的模型。然而随着模型越来越复杂,用这些基本操作创建的Simulink模变得越来越庞大而难于读懂。在接下来的章节中,将介绍一系列的Simulink特殊处理技术来使得模型变得更加简捷易懂易用。本节先介绍一种类似于程序设计语言中的子程序的处理方法Simulink子系统,然后讲解一种更加好用的封装子系统技术。,第七章Simulink建模和仿真 7.5子系统和子系统的封装,7.5.1 Simulink子系统绝大多数的程序设计语言都有使用子程序的功能。在FORTRAN里有subroutine子程序和function子程序;C语言中的子程序被称为“函数”;Matlab的子程序称为函数式M文件。Sinlulilnk也提供了类似的功能子程序。随着模型越来越大、越来越复杂,人们很难轻易的读懂它们。在这种情况下,子系统通过把大的模型分割成几个小的模型系统以使得整个系统模型更简捷、可读性更高,而且这种操作并不复杂。举一个简单的例子,考虑在例1中提到的汽车模型,其Simulink模型图见图7.5.1。,第七章Simulink建模和仿真 7.5子系统和子系统的封装,图7.5.1 比例速度控制的汽车模型,整个模型包括两个主要部分:发动机动力系统和控制系统。但是在模型图中哪些模块代表发动机动力系统,那些模块代表控制系统并不明确。在图7.5.2中,将模型的这两个部分转化为子系统。经过转化后,主模型图中的结构就变得很明了了,只是两个子系统的具体结构被隐藏起来了,双击子系统模块,则会在一个新的窗口中显示子系统的模块图。如图7.5.3所示。,第七章Simulink建模和仿真 7.5子系统和子系统的封装,图7.5.2 子模块化了的汽车模型,第七章Simulink建模和仿真 7.5子系统和子系统的封装,(a)控制子系统,(b)发动机动力子系统,图7.5.3 子系统分解,第七章Simulink建模和仿真 7.5子系统和子系统的封装,子系统的另外一个重要的功能是把反复使用的模块组压缩成子系统后重复使用。在本例中,如果要比较在同一控制系统控制下不同发动机的工作效率,只需要替换新的发动机子系统而不是重建一个新的系统。这样的控制系统就可以反复利用。,注意:这种做法不仅节省了建模时间,而且可以保证在多次建模中不会因失误而在控制子系统中出现差错,这在大型的复杂系统建模中是非常重要的。,创建Simulink子系统共有两种方法:一种办法是对已存在的模型的某些部分或全部使用菜单命令【Edit/Create Subsystem】进行压缩转化,使之成为子系统;另一种方法是使用Connections模块库中的Subsystem模块直接创建子系统。,第七章Simulink建模和仿真 7.5子系统和子系统的封装,下面分别介绍这两种方法。,一、压缩子系统把已经存在的Simulink模型中的某个部分或全部压缩成子系统的操作如下:步骤一:首先使用范围框将要压缩成子系统的部分选中,包括模块和信号线,如图7.5.4所示。,图7.5.4 选中要压缩的模块,第七章Simulink建模和仿真 7.5子系统和子系统的封装,注意:在这种情况下只能用范围框,而不能用Shift逐个选定。为了能使范围框框住所有需要的模块,重新安排模块的 位置常常似乎是必要的。步骤二:在模块窗口菜单选项中选择【EditCreat Subsystem】,Simulink将会用一个子系统模块代替被选中的模块组,如图7.5.5所示。,图7.5.5 压缩后的模型图,第七章Simulink建模和仿真 7.5子系统和子系统的封装,步骤三:子系统模块将有一个默认输入端口和输出端口。输入端口和输出端口的默认名分别为In1和Out1。调整子系统和模型窗口的大小使之美观,如图7.5.6所示。,图7.5.6 压缩后的模型图,第七章Simulink建模和仿真 7.5子系统和子系统的封装,若想查看子系统内容或对子系统进行再编辑,可以双击子系统模块,则会出现一个显示子系统内容的新窗口。在窗口内,除了原始的模块外,Simulink自动添加了输入模块和输出模块,分别代表子系统的输入端口和输出端口。改变它们的标签会使子系统的输入输出端口的标签也随着变化。特别注意:菜单命令【Edit/Creat Subsystem】没有相反的操作命令。也就是说一旦将一组模块压缩成子系统,就没有直接还原的处理方法了(UNDO除外)。因此一个理想的处理方法是在压缩子系统之前先把模型保存一下,作为备份。二、子系统模块在创建模型的时候,如果需要一个子系统,也可以直接在子系统窗口中创建。这样就省去了上面的压缩子系统和重新安排窗口的步骤。,要使用子系统模块创建新的子系统,先从Signals&Systems模块库中拖一个子系统模块到模型窗口中。双击子系统模块,就会出现一个子系统编辑窗口。注意:在信号输入端口要使用一个输入模块,在信号输出端口要使用一个输出模块。子系统创建完毕后,关闭子系统窗口。关闭子系统窗口之前不需要做任何保存操作。子系统作为模型的一部分,当模型被保存时,子系统会自动保存。,第七章Simulink建模和仿真 7.5子系统和子系统的封装,第七章Simulink建模和仿真 7.5子系统和子系统的封装,例7.5.1 模拟如图7.5.7所示的弹簧质量系统的运动状态。单个小车系统的运动方程如下:,图7.5.7 弹簧质量系统,先建立如图7.5.8所示的单个小车系统的子系统,图7.5.8 单个小车系统,第七章Simulink建模和仿真 7.5子系统和子系统的封装,使用子系统模块创建如图7.5.9所示的子系统,此子系统用来模拟一个小车的运动。子系统的输入为小车的左距x(n-1)和右距x(n+1),输出为小车的当前位置x(n).子系统完成之后,关闭 子系统窗口。复制两次此子系统模块,并如图7.5.10所示链接起来。,图7.5.9 小车1的子系统模型,图7.5.10 使用子系统的三小车模型,第七章Simulink建模和仿真 7.5子系统和子系统的封装,为了可以对每个小车的参数进行赋值,要做以下设置:对小车1,将标签为LeftSpring的增益模块的增益系数设置为k1,标签为RightSpring 的增益模块的增益系数设置为