1、天马行空官方博客:http:/ Simulink模型元素关联图 天马行空官方博客:http:/ Sinks7.2.2 Sinks库库表表7.2.3 Discrete7.2.3 Discrete库库表表7.2.4 Continuous7.2.4 Continuous库库天马行空官方博客:http:/ 7.2.5 MathMath库库表表7.2.6 Function and Tables7.2.6 Function and Tables函数函数 表表7.2.7 Nonlinear 7.2.7 Nonlinear 库库表表7.2.8 7.2.8 Signal Signal and and Syste
2、msSystems库库表表7.2.8 Signal and Systems7.2.8 Signal and Systems库库图图7.2.3 Sinks7.2.3 Sinks库库 图图7.2.4 Discrete7.2.4 Discrete库库 图图7.2.5 Continuous7.2.5 Continuous库库 图图7.2.6 Math7.2.6 Math库库 图图7.2.7 Nonlinear7.2.7 Nonlinear库库 图图7.2.8 Signak&Systems7.2.8 Signak&Systems库库 图图7.2.9 Subsystems7.2.9 Subsystems库
3、库 图图7.2.10 Functions&Tables7.2.10 Functions&Tables库库 图图7.2.11 7.2.11 积分模块属性对话框积分模块属性对话框 图图7.3.1 7.3.1 选取多个模块选取多个模块 图图7.3.2 7.3.2 在同一模在同一模型窗口内型窗口内复制模块复制模块 图图7.3.3 7.3.3 模块参数设置对话模块参数设置对话 图图7.3.4 7.3.4 模块特性设置对话框模块特性设置对话框 如果参数的值不是字符串或数字,参数值的位置会显示N/S(not supported)。如果参数名无效,参数值的位置将显示“?”。图图7.3.5 7.3.5 设置属性
4、格式字符串后的效果设置属性格式字符串后的效果图图7.3.7 7.3.7 模块的阴影效果模块的阴影效果 图图7.3.6 7.3.6 调整模块的方向调整模块的方向 图图7.3.8 7.3.8 两模块不在同一水平线上两模块不在同一水平线上 图图7.3.9 7.3.9 调整连线的位置(一)调整连线的位置(一)图图7.3.10 7.3.10 调整连线的位置(二)调整连线的位置(二)图图7.3.11 7.3.11 连线的连线的分支分支 图图7.3.12 7.3.12 用粗线表示用粗线表示向量向量 图图7.3.13 7.3.13 在连线上显示数据类型在连线上显示数据类型 (3)(3)信号标记信号标记 为了使
5、模型更加直观、可读性更强,我们可以为传输的信号 作标记。建立信号标记的办法是:双击要做标记的线段,出现一个小 文本编辑框,在里面输入标记的文本,这样就建立了一个信 号标记。信号标记可以随信号的传输从一些模块中进行传递。支持这种传递的模块有Mux、Demux、Inport、From、Selector、Subsystem和Enable。图图7.3.14 7.3.14 信号标记的建立信号标记的建立 图图7.3.15 7.3.15 信号标记的传递信号标记的传递 xeFwFhF图图7.4.1 7.4.1 斜坡上的汽车斜坡上的汽车 由牛顿第二定律,汽车的运动方程为:hweFFFxm eFKgFe100,1
6、0002000汽车的质量为假设其中m代表汽车的质量,x为汽车的位移。在实际系统中总会有下界和上界,上界为发动机的最大推动力,下界为刹车时的最大制动力。22VP001.02ACDtVw011.0sin10201.0sin20001.0txFwx0001.0sin0093.0 xFh0001.0sin30 xxKFdesiredeccFdesiredx eK50eK比例控制器的输入为汽车的期望速度值,它由一个滑块增益模块(Slider Gain)外加一个常数输入模块(Constant)组成。比例控制器由一个用来计算速度误差的求和模块(Sum)和一个增益模块Ke组成。发动机输出力的上界和下界由两个最
7、值模块来实现(也可以用非线性模块库中的饱和模块来实现)。图图7.4.2 7.4.2 比例速比例速度控制度控制的汽车的汽车模型模型图图7.4.3 7.4.3 汽车的速度变化曲线汽车的速度变化曲线说明:说明:此模型也是一个轻度刚性问题的很好的例子,为了观察刚性的影响,先以解法0DE45l来运行模型,然后选择0DE15S再运行仿真,观察其区别。图7.4.4 连续PID控制器 vKup0tiivdtKu0iuvKuddTkvkvud1zzTKzVzUdd1图图7.4.5 7.4.5 离散控制器的汽车模型离散控制器的汽车模型 75,75.0,50dipKKK图图7.4.6 7.4.6 汽车速度控制曲线汽
8、车速度控制曲线图图7.5.1 7.5.1 比例速度比例速度控制的汽控制的汽车模型车模型 图图7.5.2 7.5.2 子模块化了的汽车模型子模块化了的汽车模型 (a)(a)控制子系统控制子系统(b)(b)发动机动力子系统发动机动力子系统图7.5.3 子系统分解 子系统的另外一个重要的功能是把反复使用的模块组压缩成子系统后重复使用。在本例中,如果要比较在同一控制系统控制下不同发动机的工作效率,只需要替换新的发动机子系统而不是重建一个新的系统。这样的控制系统就可以反复利用。注意:这种做法不仅节省了建模时间,而且可以保证在多次建模中不会因失误而在控制子系统中出现差错,这在大型的复杂系统建模中是非常重要
9、的。创建Simulink子系统共有两种方法:一种办法是对已存在的模型的某些部分或全部使用菜单命令【Edit/Create Subsystem】进行压缩转化,使之成为子系统;另一种方法是使用Connections模块库中的Subsystem模块直接创建子系统。下面分别介绍这两种方法。一、压缩子系统一、压缩子系统把已经存在的Simulink模型中的某个部分或全部压缩成子系统的操作如下:步骤一:步骤一:首先使用范围框将要压缩成子系统的部分选中,包括模块和信号线,如图7.5.4所示。图7.5.4 选中要压缩的模块注意:注意:在这种情况下只能用范围框,而不能用Shift逐个选定。为了能使范围框框住所有需
10、要的模块,重新安排模块的 位置常常似乎是必要的。步骤二:步骤二:在模块窗口菜单选项中选择【EditCreat Subsystem】,Simulink将会用一个子系统模块代替被选中的模块组,如图7.5.5所示。图图7.5.5 7.5.5 压缩后的模型图压缩后的模型图 步骤三:步骤三:子系统模块将有一个默认输入端口和输出端口。输入端口和输出端口的默认名分别为In1和Out1。调整子系统和模型窗口的大小使之美观,如图7.5.6所示。图图7.5.6 压缩后的模型图压缩后的模型图 若想查看子系统内容或对子系统进行再编辑,可以双击子系统模块,则会出现一个显示子系统内容的新窗口。在窗口内,除了原始的模块外,
11、Simulink自动添加了输入模块和输出模块,分别代表子系统的输入端口和输出端口。改变它们的标签会使子系统的输入输出端口的标签也随着变化。特别注意:特别注意:菜单命令【Edit/Creat Subsystem】没有相反的操作命令。也就是说一旦将一组模块压缩成子系统,就没有直接还原的处理方法了(UNDO除外)。因此一个理想的处理方法是在压缩子系统之前先把模型保存一下,作为备份。二、子系统模块二、子系统模块在创建模型的时候,如果需要一个子系统,也可以直接在子系统窗口中创建。这样就省去了上面的压缩子系统和重新安排窗口的步骤。例7.5.1 模拟如图7.5.7所示的弹簧质量系统的运动状态。单个小车系统的
12、运动方程如下:nnnnnnnxxknxkmx1111 1x2x3x图图7.5.7 弹簧质量系统弹簧质量系统 先建立如图7.5.8所示的单个小车系统的子系统 nx1nx1nx图图7.5.8 单个小车系统单个小车系统 使用子系统模块创建如图7.5.9所示的子系统,此子系统用来模拟一个小车的运动。子系统的输入为小车的左距x(n-1)和右距x(n+1),输出为小车的当前位置x(n).子系统完成之后,关闭 子系统窗口。复制两次此子系统模块,并如图7.5.10所示链接起来。图图7.5.9 7.5.9 小车小车1 1的子系统模型的子系统模型 图图7.5.10 使用子系统的三小车模型使用子系统的三小车模型为了
13、可以对每个小车的参数进行赋值,要做以下设置:对小车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,
14、标签为RightSpring 的增益模块的增益系数设置为k4,标签为1/mass的增益模块的增益系数设置为1/m3。设置速度积分模块的初始值为0,位置积分模块的初始值为1。7.5.2 子系统的封装子系统的封装封装技术是将Simulink子系统“包装”成一个模块,并可以如同使用Simulink内部模块一样使用的技术。每个封装模块都可以有一个自定义的图标用来设定参数的对话框,参数设定方法也与Simulink模块库中的内部模块完全相同。为了更好的理解封装的含义,见图7.5.10所示的模型。此模型与例7.5.1中的模型完全等价,但它要更容易使用。双击Spring-mass1模块可以打开该模块属性的对话
15、框。与例7.5.1中打开每个模块去修改参数不同,这里可以直接在此对话框中输入参数。对话框的结构与形式都和“原装”的模型毫无两样。本节将主要以此弹簧质量系统为例来详细介绍创建一个封装模块的步骤。创建一个封装模块的主要步骤分为三步:创建一个子系统;选中子系统,选择模型窗口菜单中的【EditMask subsystem】选项生成封装模块;使用封装编辑器设置封装文本、对话框和图标。一、子系统到封装模块的转换一、子系统到封装模块的转换当按照上节中介绍的方法创建以弹簧质量子系统模块之后(如图7.5.10所示),将其复制到一个新的窗口中,如图7.5.11所示。选中此模块,在窗口的菜单中执行【EditMask
16、 subsystem】指令,弹出如图7.5.12所示的一个封装编辑对话框。该对话框有三个选项卡。下面分别讨论这三个选项卡的功能和使用。图图7.5.11 将子系统复制到新窗口将子系统复制到新窗口 图图7.5.12 封装编辑对话框封装编辑对话框(1)文本页文本页 Documentation图7.5.13是编辑器的文本页。它也包括三个区域,每个区域都为一个自由区,既可填写也可以不填写。Mask type:该区内容将作为模块的类型显示在封装模块的对话框中。Block description:此区中的内容将显示在封装模块对话框的上部,它的位置在后面的图中可能看得更清楚。其内容脑壳描述模块的功用的简短语句
17、或其它关于使用此模块的注意事项等。Block help:当对话框中的【help】按钮按下时,MATLAB的帮助系统将显示此区中的内容,其内容应当包括使用此模块的详细说明。(2)初始化页初始化页 Initialization初始化页是用来设置封装模块参数项的,如图7.5.14所示。此页也包括三个区域。上区为Mask type区。此封装类型区与文本页中的封装类型区是等同的,可以在任意一页中定义或改变封装类型。中区是用来设置封装模块对话框中的输入变量项目,如输入变量或操作选择等等。此区包括一个滚动项目列表、一套“加入”、“删除”和“移动”按钮,以及5个设置项目属性的编辑区。底区为Initializa
18、tion commands,在此区中可以输入MATLAB语句,如定义变量、初始变量值等等。封装子系统与非封装子系统的一个重要的区别在于模块对话框中变量的作用范围。非封装子系统模块中的变量可以直接在MATLAB工作间中赋值。而封装子系统的模块则不能。封装子系统有一个独立于MATLAB工作间及其它子系统的内部存储空间、这个特点可以防止模块变量与其它工作间中无关变量的冲突。因此,在封装模块中用到的变量要在封因此,在封装模块中用到的变量要在封装编辑器对话区或初始命令区中设置。装编辑器对话区或初始命令区中设置。图图7.5.13 封装编辑器的文本页封装编辑器的文本页 图图7.5.14 封装编辑器的初始化页
19、封装编辑器的初始化页(3)图标页图标页 Icon编辑器的图标页如图7.5.12所示,它是用来给封装模块设计自定义图标的。此页分6个区。顶区的【Mask type】同其它两页中的【Mask type】是等同的。【Deawing commands】区是以MATLAB语句来绘制图标的编辑区。其余的4个区是用来指定图标的属性,理解了图标的这些属性再来分析图标的绘制命令是很容易的。Icon fram:第一个属性为图标框选项,他由一个下拉菜单组成,分别有可见、不可见选项。所谓的图标框即图标的边界线。Icon transparency:第二个属性为图标的透明度选项,也是由一个下拉菜单组成,有两个选项,透明和
20、不透明。Icon rotation:第三个选项为图标旋转选项,其下拉菜单选项为固定和旋转。这个选项决定了当执行【FormatFlip block】或【FormalRotate Block】指令时的图标形状。Drawing cooedenates:最后一个区是图形坐标区,用来设置绘图的比例。它有三个选项:Pixed:用来设置绘图系为绝对坐标系,其效果为当模块图调整大小时,图标不随其大小的改变而改变。此参数下的坐标系应为象素点坐标,图标的左下角为坐标系的原点。Autoscale:该选项使得图标图形恰好充满整个模块。Normalized:该选项是设置绘图比例在0河1之间的选项。图标的左下角的坐标定义
21、为(0,0),模块的右上角坐标定义为(1,1)。当模块调整大小的时候,坐标系同样被调整。二、查看封装和解封装二、查看封装和解封装对于一个已封装的子系统要想查看其封装前子系统的具体内容,可以选着菜单命令【EditLook Under mask】。若要对已经封装的模块进行解封装操作,要先选中此模块,打开封装编辑器,按下Unmask按钮,则封装就被解开。若要再次封装此子系统,选着【EditMask subsystem】即可。回调是一种回调是一种MATLAB命令,他在某种事件,如打开模块或命令,他在某种事件,如打开模块或双击模块等情况发生时执行。双击模块等情况发生时执行。例如,通常双击一个模块时,屏幕
22、上将会显示出此模4块的对话框。而对示波器模块,双击它将会执行一个显示示波器的回调函数。回调与回调与MATLAB的图形处理有着很紧密的联系。的图形处理有着很紧密的联系。例如,当使用图形处理工具创建一个菜单时,每个菜单选项通常是与同一个回调相对应的,它会在选项被选中时自动执行。回调可以是一句非常简单的MATLAB命令。例如,若菜单选项为【Close Figure】,比较合适的回调语句是MATLAB命令close。回调在更多的情况下是一个可以完成指定操作的回调在更多的情况下是一个可以完成指定操作的M文文件。件。7.6.1 回调函数的介绍回调函数的介绍使用MATLAB的set_param命令可以加载回
23、调,具体格式为set_param(object,parameter,value)其中:object为包含模型名或模块路径的MATLAB字符串。如果回调是关于模型动作的,则object为模型名。例如,一模型以car_mod.mdl为名保存,则object应当为car_mod。如果回调是关于模块的,则此模块的Simulink路径将成为object。例如,对于car_mod模型中的子系统Controller中的Gain_1模块,object应为字符串car_mod/Controller/Gain_1。parameter是一个包含回调参数的MATLAB字符串。value是包含回调函数名的字符串。例如,
24、回调一名为set_gain.m的M文件,则value应为字符串set_gain。例7.6.1 考虑图7.6.1所示的Simulink模型。若模型以callb_1.mdl为名保存,其中常数块的值设置为In_val。希望在用户打开模型的时候,模型会自动提示要求输入In_val的值。图图7.6.1 使用回调初始化的模型图使用回调初始化的模型图用下面名为initm_1.m的简单M文件来实现回调,此M文件只有一个一条语句:In_val=input(Enter the valuv:);为了在模型打开的时候自动加载此回调,打开模型,并在MATLAB命令窗口中输入:set_param(callb_1,Prel
25、oadFcn,inetm_1)保存此模型并关闭。下一次打开模型的时候,MATLAB会自动提示:Enter the value:并将输入值赋给In_val变量。若希望当仿真开始之前而不是模型打开时再输入参数值,则需要下面的命令来加载回调:set_param(callb_1,InitFcn,inetm_1)7.6.2 基于回调的图形用户界面基于回调的图形用户界面使用回调可以很容易地为使用回调可以很容易地为Simulink模型创建一个图形用户界模型创建一个图形用户界面。面。线性模块库中的滑块增益模块就是一个很好的例子。此模块是一个带有回调所产生的用户界面的增益模块,其界面如图7.6.2所示。本小节介
26、绍这种图形界面的创建过程和相关的程序问题。图图7.6.2 滑块增益模块的用户界面窗口滑块增益模块的用户界面窗口 在Simulink模型中,带有基于回调的图形界面的模块可以通过双击使回调函数加载。打开后应响应如下事件:双击模块打开用户界面(OpenFcn)。此回调应包括创建界面图形并对其初始化的程序,而且程序还要确认在打开之前没有其它同一模块的图形界面打开。删除该模块(DeleteFcn),则关闭相应的界面图形。包含该模块的模型被关闭(ModelCloseFcn),则关闭界面。包含该模块的子系统被关闭(ParentCloseFcn),则关闭界面。界面窗口的控制按钮操作。经验表明在回调M文件中加入
27、加载回调的语句是非常有用的。一旦程序被执行,则回调将会成为模型的一个参数部分,运行速度大大提高。如下所示的一段程序代码可以作为回调函数M文件的一个样板,读者可以从中看出此类文件的一般规律,稍作修改,即可应用于其它情况。function clbktplt(varargin)%Callback function template%Install this callback by invoking it with the command%clbktplt(init_block)%at the MATLAB prompt with the appropriate model file open and
28、 selected.%To use the template,save a copy under a new name.Then replace%clbktplt with the new name everywhere it appears.action=varargin1 ;switch action,case init_block,init_fcn;%Block initialization function,%located in this M-file case create_fig,if(findobj(UserData,gcb)%Dont open two for same bl
29、ock disp(Only open one instance per block can be opened)else%Here,put all commands needed to set up the figure and its%callbacks.left=100;%Figure position values bottom=100;width=100;height=100;h_fig=figure(Position,left bottom width height,.MenuBar,none);set(h_fig,UserData,gcb);%Save name of curren
30、t block in%the figures UserData.This is%used to detect that a clbktplt fig%is already open for the current block,%so that only one instance of the figure%is open at a time.end case close_fig,%Close if open when model is closed.h_fig=findobj(UserData,gcb);if(h_fig)%Is the figure for current block ope
31、n?close(h_fig);%If so,close it.end case rename_block,%Change the name in the figure UserData.h_fig=findobj(UserData,gcb);if(h_fig)%Is the figure open?set(h_fig,UserData,gcb);%If so,change the name.end%*%*init_fcn *%*case UserAction1,%Place cases for various user actions%here.These callbacks should b
32、e defined%when the figure is created.endfunction init_fcn()%Configure the block callbacks%This function should be executed once when the block is created%to define the callbacks.After it is executed,save the model%and the callback definitions will be saved with the model.There is no need%to reinstal
33、l the callbacks when the block is copied;they are part of the%block once the model is saved.sys=gcs;block=sys,/InitialBlockName;%Replace InitialBlockName with the%name of the block when it is%created and initialized.This does%not need to be changed when the block%is copied,as the callbacks wont be%r
34、einstalled.set_param(block,OpenFcn,clbktplt create_fig,.ModelCloseFcn,clbktplt close_fig,.DeleteFcn,clbktplt close_fig,.NameChangeFcn,clbktplt rename_block);S函数函数是扩展Simulink功能的强有力工具,它使用户可以利用MATLAB、C语言、C+语言等程序创建自己定义的Simulink模块。例如,对一个工程的几个不同的控制系统进行设计,而此时已经用M文件建立了一个动态模型,在这种情况下,可以将模型加入到S函数中,然后使用独立的Simul
35、ink模型来模拟这些控制系统。S函数还可以改善仿真的效率,尤其是在带有代数环的模型中。S函数使用一种特殊的调用规则来使得用户可以与Simulink的内部解法器进行交互,这种交互通Simulink内部解法器与内置的模块之间的交互非常相似。而且可以适用于不同性质的系统,例如连续系统、离散系统以及混合系统。图图7.7.1 包含包含S函数的模型函数的模型 图图7.7.2 S函数模块的对话框函数模块的对话框 7.7.2 S函数的工作原理函数的工作原理S函数具有一套不同的调用方法,可以在仿真的不同阶段完成不同的调用任务。在模型仿真的不同阶段,Simulink会对模型中S函数模块选择适当的方法来完成调用。S
36、函数可以完成的任务大体分为以下几种。(1)初始化初始化。在进入仿真循环之间,Simulink首先初始化S函数,主要完成任务:初始化包含S函数信息的仿真结构SimStruct。设置输入输出端口的数目和维数。设置模块的采样时间。分派内存区和sizes数组。(2)计算下一个采样点计算下一个采样点。若用户使用了可变采样时间的模块,在这一阶段需要计算下一个采样点时间,也就是说要计算下一个时间步长。(3)计算主时间步的输出量。计算主时间步的输出量。此调用结束后,所有模块的输出端口对当前的时间步都是有效的。(4)更新主时间步的离散状态。更新主时间步的离散状态。(5)积分计算积分计算。这一步只有当模型带有连续
37、状态或带有非采样过零点时才有效。若S函数带有连续状态,则Simulink以较小的时间步长来调用S函数的输出和微分方法;若S函数具有非采样过零点,Simulink将以较小的时间步来计算S函数的输出和过零点部分。7.7.3 S函数中的几个概念函数中的几个概念S函数中有几个关键的概念需要详细解释,对这几个概念的深入理解对正确使用S函数是非常重要的。(1)直接馈入直接馈入所谓的直接馈入是指模块的输出或采样时间是由它的一个输入端口的值直接控制。判断S函数地输入端口是否有直接馈入的判据有:输出函数(mdlOutpits或者flag=3)是一个参数包含u的函数。若改S函数是一个可变采样时间的S函数,且下一个
38、采样时间点的计算中要用到输入参数u时,也可以判断此S函数为直接馈入型。(2)动态尺寸的输入动态尺寸的输入S函数可以支持任意维的输入,此时,输入的维数是由输入变量的维数动态确定的。同时,输入变量的维数也决定了连续和离散状态量的个数以及输出变量的维数。M文件S函数只能有一个输入端口,并且输入端口只能接收一维信号。然而,信号可以是变宽度的。在一个M文件S函数里,为了指定输入的宽度是动态的,可以指定sizes结构的适当区域的值为1。也可以在S函数调用的时候使用length(u)来确定实际输入的宽度。若指定宽度值为0,则输入端口会从S函数模块中去掉。例如,图7.7.3所示表示了在同一个模型中使用同一个S
39、函数模块的两种情况,前者的S函数模块是由一个三元素向量驱动,后者则是由一个标量输出模块信号驱动,为了表明S函数函数模块的输入是动态的,两个S函数模块是完全相同的Simulink自适应地使用合适的尺寸来调用函数。类似地,若其它模块属性如输出变量数和状态数也被指定为动态尺寸的,Simulink将会定义这些变量与输入变量同维。图图7.7.3 同一个模型中使用同一个同一个模型中使用同一个S函数模块的两种情况函数模块的两种情况(3)采样时间的设置与采样延迟采样时间的设置与采样延迟M文件S函数和C语言S函数都在指定S函数的运行时间上有高度的自适应度。Simulink为采样时间提供了下面的几种选着。连续采样
40、时间连续采样时间:适用于具有连续状态和非采样过零点的S函数。这种S函数的输出按最小时间步改变。连续但固定最小步长的采样时间连续但固定最小步长的采样时间:适用于需要在每一个主仿真时间步执行,但在最小仿真步内值不改变的。离散采样时间离散采样时间:若S函数得行为发生具有离散时间间隔的函数,用户可以定义一个采样时间来规定Simulink何时调用函数。而且用户还可以定义一个延迟时间offset来延迟采样点,但offset的值不能超过采样周期。若用户定义了一个离散采样时间,则Simulink就会在所定义的每个采样点调用S函数的mdlOutpit和mdlUpdate方法。可变采样时间可变采样时间:相邻采样点
41、的时间间隔可变得离散采样时间。在这种采样时间的情况下,S函数要在每一步仿真的开始,计算下一个采样点的时刻。继承采样时间继承采样时间:在有些情况下,S函数模块自身没有特定的采样时间,它本身的状态是连续的还是离散的完全取决于系统中的其它模块。此时,该S函数模块的采样时间属性可以设为继承。例如gain模块就是一个继承输入信号采样时间的例子。一般,一个模块可以从以下几个方式来继承采样时间:继承驱动模块的采样时间;继承目标模块的采样时间;继承系统中最快的采样时间。7.7.4 S函数动画函数动画基于S函数地动画就是一个由没有状态函数、没有输出变量的S函数生成的动画。因此它们只能作常规显示。这种S函数有两个
42、主要部分:初始化部分初始化部分和更新部分更新部分。在初始化过程中要创建图形窗口及动画对象;在更新过程中,动画对象的属性将作为S函数模块的输入函数,且它的变化导致动画对象的运动可能会以其它形式变化。(1)动画的初始化S函数动画的初始化语句包括S函数的初始化和图形的初始化。采样时间应设置为较小的数值以便动画可以看起来更加连续。但同时也不能太小,因为那会使得仿真过程运行起来太慢。首先需要检验与当前S函数模块相联系的动画图形是否已打开。这里使用的方法是将当前模块的路径保存到图形的UserData参数中。此时使用gcd函数是一种比较安全的方法,因为在S函数的执行过程中,gcd总会返回S函数模块的路径。完
43、成此任务的MATLAB命令可为如下形式:if(findobj(UserData,gcb)%若模型已经打开,则不作任何事 else%初始化图形 end其中的初始化图形语句可由figure命令实现,例如 h_fig=figure(Position,x_pos,y_pos,width,height然后,将当前S函数模块的路径保存到图形UserData中,这样对图形的存在性检验才会正常工作。下面的语句可以用来设置UserData:set(h_fig,UserData,gcb);使用MATLAB绘图命令绘制动画图形。接着保存这些图形元素的句柄。例如,要绘制由向量x_array和y_array定义的曲线,
44、使用下面的语句:hdl=plot(x_array,y_array);图形初始化的最后一步是保存这些仿真元素的句柄。这里使用的方法是将这些元素成组地保存到一个MATLAB变量中,并把此变量保存到S函数模块的UserData中。UserData中可以保存MATLAB的任何变量,包括单元数组合结构。假设要绘制两个图形元素的动画,而它们的句柄名分别为hd1和hd2,下面的语句会把它们保存到一个结构中。t_data.hd1=hd1;t_data.hd2=hd2;set_param(gcd,UserData,t_data);(2)动画的更新动画的更新由于设置采样时间为正数,所以动画S函数可以被看成是离散模
45、块。Simulink将以flag=2在采样时间执行S函数。更新函数会从S函数模块UserData中读取即将改变得图形对象的句柄。例如,如果句柄以结构变量的形式储存,则它们可以写成如下形式。T_data=get_param(gcd,UserData);hd1=t_data.hd1;hd2=t_data.hd2;然后计算改变得对象属性的新值,并使用set命令更新属性。Set(handle,propertyName,propertyValue);其中handle为对象的句柄,propertyName为有即将改变得对象属性的对象名构成的MATLAB字符串。propertyValue为新的属性值。例7.
46、7.1 在本例中,将创建一个在半球形槽内往复滚动的圆盘的动画。分析:假设圆盘在槽内做无滑动的滚动,则系统的运动方程为)(5.1sinrRg 2.32,2,12grRg其中:,为重力加速度,和的动力学关系为rrR 图7.7.4为此系统运动方程的Simulink模型,它用一个动画S函数模块来显示圆盘运动。S函数为一个M文件,其程序代码如下,function sys,x0,str,ts=s_anm81s(t,x,u,flag)%S-file animation example 1%This example demonstrates buidling an animation%using a sing
47、le S-file with no callbacks.%Based on sfuntmpl.m,supplied with SIMULINK%Copyright(c)1990-96 by The MathWorks,Inc.%switch flag,case 0,%Initialization sys,x0,str,ts=mdlInitializeSizes;case 1,%Derivatives sys=mdlDerivatives(t,x,u);case 2,sys=mdlUpdate(t,x,u);case 3,sys=mdlOutputs(t,x,u);%Compute output
48、 vector case 4,%Compute time of next sample sys=mdlGetTimeOfNextVarHit(t,x,u);case 9,%Finished.Do any needed sys=mdlTerminate(t,x,u);otherwise%Invalid input error(Unhandled flag=,num2str(flag);end%*%*mdlInitializeSizes *%*function sys,x0,str,ts=mdlInitializeSizes()%Return the sizes of the system vec
49、tors,initial%conditions,and the sample times and offets.sizes=simsizes;%Create the sizes structuresizes.NumContStates =0;sizes.NumDiscStates =0;sizes.NumOutputs =0;sizes.NumInputs =1;sizes.DirFeedthrough=0;sizes.NumSampleTimes=1;sys=simsizes(sizes);x0 =;%There are no statesstr=;%str is always an emp
50、ty matrix%Update the figure every 0.25 sects =0.25 0;%initialize the array of sample times.%Initialize the figure%The handles of the disk and index mark are stored%in the blocks UserData.if(findobj(UserData,gcb)%Figure is open,do nothingelse h_fig=figure(Position,200 200 400 300,.MenuBar,none,Number