资源预览内容
第1页 / 共68页
第2页 / 共68页
第3页 / 共68页
第4页 / 共68页
第5页 / 共68页
第6页 / 共68页
第7页 / 共68页
第8页 / 共68页
第9页 / 共68页
第10页 / 共68页
亲,该文档总共68页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章:动态系统Simulink建模与仿真本章内容:Simulink工具箱简介Simulink建模与仿真基本方法动态系统Simulink仿真模型的建立Simulink子系统技术S-函数与Simulink仿真*模糊逻辑工具箱简介7.1Simulink工具箱简介7.1.1Simulink工具箱简介Simulink是Simulation(仿真)与link(连接)的简写形式,它提供一个动态系统建模、仿真和综合分析的集成环境,是MATLAB最重要的组件之一,也是其它仿真工具箱的可视化仿真平台。优点:建模方便灵活,适用面广,结构和流程清晰,效率高等。1Simulink启动(1)在MATLAB命令窗口输入“simulink”命令。(2)单击MATLAB主窗口左下角的“Start”按钮,在弹出的快捷菜单中单击【Simulink】【LibraryBrowser】命令。(3)单击MATLAB主窗口工具栏里的工具。7.1.2 Simulink组成组成图7-1 Simulink窗口界面CommonlyUsedBlocks(常用模块库)Continuous(连续系统模块库)Discontinuous(非连续系统模块库)Discrete(离散系统模块库)LogicandBitOperations(逻辑与位操作模块库)LookupTables(查询表模块库)MathOperations(数学操作模块库)ModelVerification(模型验证模块库)2 Simulink模块库组件模块库组件Simulink7.1模块库共包含16个子模块库,它们是:Model-WideUtility,Ports&Subsystems(接口与子系统模块库),SignalAttributes(信号属性模块库)SignalRouting(信号路由模块库)Sinks(输出模块库)Sources(信号源模块库)User-DefinedFunctions(用户自定义模块库)AdditionalMath&Discrete(附加数学和离散系统模块库)是为了加快建模速度,节省建模过程中寻找模块的时间而将最常用的基本模块集中放在一起形成的,在初学Simulink建模与仿真时,是使用最为频繁的模块库。(1)CommonlyUsedBlocks(常用模块库)图7-2v常用模块库包括总线信号生成器(BusCreator)模块、总线信号选择器(BusSelector)模块、常数模块(Constant)、数据类型转换(DataTypeConversion)模块,信号分离器(Demux)模块,离散时间积分(Discrete-TimeIntegrator)模块,增益(Gain)模块,信号地(Ground)模块,输入接口(In1)模块,积分(Integrator)模块,逻辑操作(LogicOperator)模块,信号合成器(Mux)模块,输出接口(Out1)模块,乘法(Product)模块,关系操作(RelationalOperator)模块,饱和(Saturation)模块,示波器(Scope)模块,子系统(Subsystem)模块,求和模块(Sum),开关转换模块(Switch),信号终端(Terminator)模块,单位延迟(UnitDelay)模块。连续系统(Continuous)模块库提供了连续系统Simulink建模与仿真的基本模块,有:微分环节模块(Derivative),积分环节模块(Integrator),状态空间模型(State-space),传递函数功能模块(TransferFun),传输延迟模块(TransportDelay),可变时间延迟模块(VeriableTransportDelay),可变传输延迟模块(VeriableTransportDelay)零极点增益模块(Zero-Pole)(2) 连续系统模块库连续系统模块库图7-3v非连续系统模块库(DisContinity)在以前版本中也称为非线性模块库,包含一些常用的非线性运算模块,主要包括:(3) 非连续系统模块库非连续系统模块库饱和非线性模块(Saturation)死区非线性模块(Dead Zone)变化率限幅模块(Rate Limiter)变化率动态限幅模块(RateLimiterDynamic)用于设置饱和输出上下限。动态饱和非线性模块(SaturationDanymic)可以根据输入端口Up和Lo的设定值动态设置输出的上限和下限。用于设定死区区间。动态死区非线性模块(DeadZoneDanymic)可以根据输入端口Up和Lo的设定值动态设置死区区间。用于设置信号输出变化率限幅,即:上升变化率限幅(Risingslewrate)和下降变化率限幅(Fallingslewrate)。可以根据输入端口Up和Lo的设定值动态设置信号上升变化率限幅参数R和下降变化率限幅参数L。磁滞回环模块(Backlash):建立间隙模型。继电模块(Relay)量化模块(Quantizer):用于输入信号的量化处理。穿越值检测模块(HitCrossing):库仑与黏性摩擦(Coulomb&ViscousFriction):返回零模块(WraptoZero)继电模块输出值可以在两个设定值之间切换。当继电器吸合时,它保持吸合状态输出直到输入信号值小于继电断开值(Switchoffpoint)。当继电器分离时,它保持分离状态输出直到输入信号值大于继电吸合值(Switchonpoint)。可按设定的穿越检测方向(Hitcrossingdirection)检测信号达到设定值的时间。此时输出一个正脉冲。在零值为不连续点,在其它值为连续线性增益。当输入信号值超过设定的极限值(Threshold),输出信号返回到零值。单位延迟模块(UnitDelay):延迟一个采样周期整数延迟模块(IntegerDelay):延迟输入N个采样周期,N为自然数。触发延迟模块(TappedDelay):延迟N个采样周期后并输出全部的输入信息。离散时间积分器(Discrete-TimeIntegrator):离散积分器模块可以代替积分器用来建立纯离散采样系统。在离散积分器模块参数对话框里,可以设定初始状态值、增益值、输出饱和值。离散传递函数功能模块(DiscreteTransferFcn):可以建立离散传递函数模型。离散滤波器模块(DiscreteFilter):用于建立离散系统滤波器仿真模型。离散零极点增益模型(DiscreteZero-Pole):使用零点、极点、增益值建立离散系统的零极点增益模型。离散微分模块(Difference):输出当前输入信号值与前一个采样值之差。派生离散微分模块(DiscreteDerivative):模块的输出值按下式计算:(3)离散系统模块库)离散系统模块库离散系统模块库主要包括用于建立离散采样系统的模块,包括:图7-4离散状态空间模型(DiscreteState-Space):离散状态空间模型实现下面系统模型一阶离散传递函数功能模块(TransferFcnFirstOrder):用于建立一阶的离散传递函数模型。传递函数引导或终止模块(TransferFcnLeadorLag):用于实现输入信号的离散时间引导或终止补偿。实数零点传递函数功能模块(TransferFcnRealZero):用于实现具有一个实数零点而无极点的传递函数模型。加权滑动平均模块(WeightedMovingAverage):模块采样并保持最近N个输入信号,并根据设定的权重参数值(weights)计算它们的平均值。该模块适用于SISO系统或SIMO系统模型。记忆模块(Memory):输出前一时刻的输入信号值。一阶保持器(First-OrderHold):实现离散采样系统的一阶采样保持功能。零阶保持器(Zero-OrderHold):实现离散采样系统的零阶采样保持功能。v其它模块请参考MATLAB软件!7.2Simulink建模与仿真基本方法v7.2.1简单系统仿真模型的建立简单系统仿真模型的建立建立上图所示系统框图的Simulink仿真模型的基本方法如下;1.启动MATLAB/Simulink工具箱2.建立Simulink空白模型Simulink空白模型的建立可方法如下:在MATLAB主窗口中选择菜单File/New/Model。选择Simulink模块库浏览器窗口的菜单File/New/Model。单击Simulink模块库浏览器工具栏的新建图标“”。3.根据系统框图选择模块4.模块的复制与删除操作在模块库选中模块后,按住鼠标左键不放并拖动到Simulink模型窗口指定位置,释放鼠标左键,完成模块的复制操作。在模块库选中模块后,单击鼠标右键,在弹出的快捷菜单中,单击“AddtoExample_Model”命令将模块添加到指定模型窗口,完成模块的复制操作。在模块库选中模块后,在库浏览器窗口的Edit菜单中选择Copy命令,用鼠标单击目标模型窗口中指定位置,再从模型窗口的Edit菜单中选择Paste,完成模块的复制操作。当模型窗口已有所需模块时,也可以直接从该处复制模块,操作方是单击鼠标右键,在弹出的快捷菜单中单击“Copy”命令,然后用鼠标右键单击模型窗口空白处,在弹出的快进诶菜单中单击“Paste”命令来完成粘贴任务。此外,也可以使用编辑菜单进行复制、粘贴操作。当然还可以用鼠标右键按住所需复制的模块不放,并拖动到指定位置完成复制操作,这可大大加快建模速度。5.模块的连接将鼠标移动到模块的输出端子上,当鼠标出现“十字”符号后,按下鼠标左键并拖动到下级模块的输入端子上,完成模块信号的连接。如上图所示。选中信号输出模块,按下键盘“Ctrl”键并单击下级模块完成模块信号的连接。在已存在的信号线上引出新的信号线时,可用鼠标右键单击源信号线,并按住不放拖动到指定位置,完成信号线的分支连接。如图所示,在模块没有完成连接时,以红色虚线显示,当连接完成后以黑色实线显示。v将各子模块连接起来后,构成如图所示的系统模型7.2.2Simulink仿真模型参数设置1.基本模块参数设置在完成模块的信号线连接并建立起系统的Simulink仿真模型后,需要设置模块的参数。在Simulink模型里,双击需要修改参数的模块,弹出参数设置对话框。2.仿真参数设置仿真参数设置单击模型窗口的“Simulation”菜单,在弹出的下拉菜单中单击“ConfigurationParameters”命令,打开“ConfigurationParameters”对话框如图所示。3.运行仿真与仿真输出运行仿真与仿真输出双击“Scope”模块,弹出如图所示仿真输出结果仿真参数配置完毕后,可运行仿真,方法有三种:单击模型窗口工具栏 工具单击“Simulation”菜单,在弹出的下拉菜单中单击“Start”命令同时按下快捷键“Ctrl+T”。7.3动态系统Simulink仿真模型的建立v由系统框图建立由系统框图建立Simulink仿真模型仿真模型v由传递函数建立由传递函数建立Simulink仿真模型仿真模型v由状态方程建立由状态方程建立Simulink仿真模型仿真模型v由微分方程建立由微分方程建立Simulink仿真模型仿真模型7.1.1 由系统框图建立由系统框图建立Simulink仿真模型仿真模型v在控制领域,控制系统通常以功能框图的形式进行描述,与在控制领域,控制系统通常以功能框图的形式进行描述,与Simulink仿真模型在结构上十分相似,因此通过被控系统的仿真模型在结构上十分相似,因此通过被控系统的框图,很容易建立其框图,很容易建立其Simulink仿真模型。下面以直流电机双仿真模型。下面以直流电机双闭环调速系统为例来说明通过系统框图建立闭环调速系统为例来说明通过系统框图建立Simulink仿真模仿真模型的基本方法。型的基本方法。r(t)为给定输入,采用阶跃信号。y(t)为系统输出,表示直流电机的转速。ASR和ACR分别为转速调节器、电流调节器,由PI调节器组成。根据直流双闭环调速系统工程整定方法,进行ASR和ACR的参数整定时,首先断开转速环,整定电流调节器ACR。然后接通转速环,整定转速环ASR,同时调节电流环参数。根据上述分析,首先建立直流双闭环调速系统的高层仿真模型,其中转速调节器和电流调节器由空白子系统组成,如图所示。转速调节器子系统Simulink模型电流调节器子系统Simulink模型7.1.2 由传递函数建立由传递函数建立Simulink仿真模型仿真模型v由系统传递函数建立Simulink仿真模型可直接使用Continue模块库的TransferFun模块,下面以实例说明。【例题】已知某单位负反馈系统开环传递函数为试建立其Simulink仿真模型并进行仿真。建立模型过程如下:(1)建立一个空白的Simulink仿真模型窗口,如图(a)所示。(3)建立传递函数的模型。(2)选择系统所需的Simulink模块(4)连接模块并设置仿真参数(5)运行仿真7.1.3 由状态方程建立由状态方程建立Simulink仿真模型仿真模型v由系统状态方程建立Simulink仿真模型可直接使用Continue模块库的State-space模块,下面以实例说明。【例】已知某系统状态空间模型为:试建立其simulink仿真模型,并求其单位阶跃响应。求解过程如下:(2)选择系统所需的Simulink模块(1)建立一个Simulink空白仿真模型窗口(3)连接模块并设置参数(4)设置仿真参数并运行仿真7.1.4 由微分方程建立由微分方程建立Simulink仿真模型仿真模型第一是将系统微分方程转换为传递函数模型,第二是将微分方程转换为状态空间模型,第三是由微分方程直接建立第三是由微分方程直接建立Simulink仿真模型。仿真模型。由微分仿真建立Simulink仿真模型有三种方法,【例】已知某系统数学模型是一个高阶微分方程:且输出量y的各阶导数初始值均为零,试建立其Simuink仿真模型。求解过程如下:(1)将高阶微分方程转换为一组一阶微分方程:设输出方程。则得:(2)建立每个一阶微分方程的Simulink仿真模型这里首先需要知道微分环节的Simulink模型如图(a)所示因此可以建立Simulink仿真模型如图(b、c、d)所示(3)建立微分方程组的simulink仿真模型。将各个微分单元连接起来就构成了整个系统的Simulink仿真模型,结果如下图所示。(4)设置Simulink仿真参数。上图中u取单位阶跃响应信号,Simulink求解器取默认参数配置。运行仿真得输出响应曲线如图下图所示。7.4Simulink子系统技术在使用Simulink进行建模与仿真时,经常会遇见很复杂的系统,难以用一个简单的Simulink框图模型来进行描述。与软件开发方法一样,此时可将复杂系统的模型进行功能划分,将其分割为各个独立的子系统,然后再采用以下两种策略加以实现:(1)自下而上的策略:首先建立复杂系统中的每一个功能模块,然后再组合这些模块,逐渐建立整个系统的模型。(2)自上而下的策略:首先建立复杂系统的整体结构模型,然后再逐一实现每一部分的模型。无论那种策略,对于复杂系统模型的建立,都要用到子系统技术。本节主要介绍子系统及其封装技术。7.4.1子系统的创建方法子系统的创建方法1.通过port&subsystem模块库建立子系统在建立子系统时,比较方便的是首先使用Port&Subsystem的Subsystem模块建立一个空白子系统,然后对空白子系统进行编辑,最后再建立系统整体的Simulink仿真模型。这里以闭环系统的PID控制为例来说明子系统的建立方法。如图所示v在已经建立好的复杂系统模型之中建立子系统。其基本方法是:首先选择将要生成子系统的一组模块,然后选择Simulink模型编辑器的菜单【Edit:CreateSubsystem】或者单击鼠标右键选择CreateSubsystem选项,都将生成子系统模块。如图所示。2.直接建立子系统7.4.2子系统的封装方法子系统的封装方法v在上述PID控制的子系统模型中,如果需要修改PID的参数,则需要打开其子系统模型窗口。为了能不打开该子系统模块窗口而修改其内部参数,Simulink提供了子系统封装技术。v以上述建立的PID控制器子系统为例来说明子系统封装的基本步骤。(1)选中子系统,单击鼠标右键,在弹出的对话框中单击“MaskSubsystem”命令或者单击菜单【Edit】【MaskSubsystem】,弹出子系统封装编辑窗口,如图所示。在“Drawingcommands”编辑窗口,可以给模块图标上绘制图形,如使用plot绘制图形、disp显示文字、image显示已有图形(1)子系统图标设置,单击Icon按钮,设置子系统图标。在“Drawingcommands”编辑窗口,可以给模块图标上绘制图形,如使用plot绘制图形、disp显示文字、image显示已有图形例:使用如下命令可得到如图所示结果disp(PIDController)plot(sin(0:0.1:2*pi),cos(0:0.1:2*pi)/2)image(imread(library.bmp)封装编辑框基本设置封装编辑框基本设置(2)参数设置:单击Parameters按钮,建立封装模块内部变量与封装对话框之间的联系。单击按钮或按钮可以增加或删除变量“Type”可选择参数为:“Edit”表示用文本编辑框输入参数“Popup”表示以下拉菜单形式输入参数“checkbox”表示以复选框形式输入参数此处变量名称要与子系统参数名称相同(3)初始化设置:单击“Initialization”按钮,弹出封装编辑器参数初始化设置对话框。(4)文档编辑。单击“Documentation”按钮,弹出如图所示的文档编辑窗口。在这里可建立子系统的文档说明。经过上述操作,完成对PID子系统的封装操作,双击子系统模块,弹出参数设置对话框如图所示。7.5S-函数与Simulink仿真v7.5.1 S-函数简介函数简介S-函数是系统函数(SystemFunction)的简称,是指用指定语言描述的一个非图形化功能模块(以区别Simulink的系统模块),是Matlab为用户提供的一个扩展功能接口。用户可以采用MATLAB语言,C、C+,Fortran或者Ada等语言编写S函数。S-函数由一种特定的语法构成,用来描述并实现连续系统、离散系统、混合系统等模型。S函数可接收来自Simulink求解器的相关信息,并对求解器发出的命令作出响应,这种交互作用类似Smulink系统模块与求解器的交互作用。7.5.2.S-函数的用法v在动态系统设计、仿真与分析中,用户可以使用Simulink浏览器里用户自定义模块库中的S-Functiong模块来调用已编写的S-函数。S-Function模块默认为一个单输入单输出的系统模块,如果有多个输入或者输出信号,可以采用Mux模块和Demux模块对信号进行组合和分离操作。在Simulink空白模板里粘贴“S-Function”模块,双击该模块弹出参数设置对话框,如图所示。创建S-函数源文件。在Simulink模型框图中添加S-Function模块,并进行正确的参数设置。在Simulink模块框图中按照定义好的功能连接输入输出端口进行基本仿真参数设置,单击工具栏工具,运行仿真。一般而言,使用S-函数的基本步骤如下:1.创建S-函数源文件的方法有很多,用户可以按照S-函数语法格式自行编写每一行代码,但是这样做既费时费力,又容易出错。Simulink为用户提供了很多S-函数的模板和例子,我们可以根据自己的需要修改相应的模板或者例子即可。详细的Simulink模板文件在后面介绍。7.5.3S-函数模板v单击SimulinkLibrary的“User-DefinedFunction”前的扩展按钮,再双击“S-functionExamples”模块弹出如图7-477所示的S-函数实例模块库。图中包括用M文件、C语言、C+、Ada、和Fortran语言编写的S-函数实例。【例题】以S-函数完成对输入信号的运算:y3*u+2。解:基本步骤如下:(1)建立Simulink仿真模型,如图所示2)打开S-函数模板源文件如下function sys,x0,str,ts = sfuntmpl(t,x,u,flag)switchflag,case0,sys,x0,str,ts=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwiseDAStudio.error(Simulink:blocks:unhandledFlag,num2str(flag);endfunctionsys,x0,str,ts=mdlInitializeSizessizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=0;sizes.NumOutputs=0;sizes.NumInputs=0;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;定义采用周期的个数sys=simsizes(sizes);x0=;str=;ts=00;functionsys=mdlDerivatives(t,x,u)sys=;functionsys=mdlUpdate(t,x,u)sys=;functionsys=mdlOutputs(t,x,u)sys=;functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=;ts是一个12的向量,ts(1)定义采样周期,ts(2)是偏移量。当ts(1)=0表示系统为连续系统,当ts(1)=-2表示系统采样时间由flag4的mdlGetTimeOfNextVarHit函数决定。输入变量中,t是采样时间,x是状态变量,u是输入变量(从Simulink输入来的变量信息,当有多个输入时,u为一个行向量,flag是仿真过程中的状态标志或称之为控制变量,由它来判断当前将要调用的回调函数;输出变量sys根据flag的不同而返回不同的内容。)在本例题中,为了完成设定的函数功能y=3*u+2,可将上述S-函数的模板进行如下修改(这里只列出需要修改的部分):首先将S函数文件首行修改为:functionsys,x0,str,ts=Mysfun(t,x,u,flag),并将文件另存为Mysfun。其次,找到functionsys,x0,str,ts=mdlInitializeSizes,作如下修改:sizes.NumOutputs=1;sizes.NumInputs=1;然后,再找到functionsys=mdlOutputs(t,x,u),作如下修改:sys=3*u+2;最后,将该文件保存到当前目录下的Mysfun.m文件中。(3)双击仿真模型中的S-function模块打开参数设置对话框,并修改S-function的名称为“Mysfun”。(4)修改仿真参数,完成仿真。这里仿真求解器参数取系统默认值,运行仿真,可得如图所示仿真结果。【例】已知某系统状态方程为:试用S-函数建立其仿真模型,并求其单位阶跃响应曲线。解:首先打开S-函数模板文件。打开S-函数模板文件除了按照上述介绍的方法,也可以在CommandWindows中输入命令:opensfuntmpl或者editsfuntmpl执行命令后系统弹出M文件的S-函数编辑窗口。实现上述系统的S-函数程序代码如下所示:functionsys,x0,str,ts=Mysfun01(t,x,u,flag)switchflag,case0,%初始化%sys,x0,str,ts=mdlInitializeSizes;case1,%求导数sys=mdlDerivatives(t,x,u);case2,%状态更新%sys=mdlUpdate(t,x,u);case3,%计算输出%sys=mdlOutputs(t,x,u);%计算下一个采样时刻%case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,%结束处理%sys=mdlTerminate(t,x,u);otherwise%错误处理%DAStudio.error(Simulink:blocks:unhandledFlag,num2str(flag);endfunctionsys,x0,str,ts=mdlInitializeSizessizes=simsizes;sizes.NumContStates=3;%系统有三个连续状态变量sizes.NumDiscStates=0;sizes.NumOutputs=1;%系统有一个输出变量sizes.NumInputs=1;%系统有一个输入变量sizes.DirFeedthrough=0;%系统不存在直通环节sizes.NumSampleTimes=1;%只有一种采样时间sys=simsizes(sizes);x0=0;0;0;%str=;ts=00;functionsys=mdlDerivatives(t,x,u)x(1)=-1*x(1)+3*u;x(2)=-2*x(2)-22*u;x(3)=-3*x(3)+20*u;sys=x;functionsys=mdlUpdate(t,x,u)sys=;functionsys=mdlOutputs(t,x,u)sys=-x(1)-x(2)-x(3);functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;%设置采样周期sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=;将上述S-函数在当前目录下保存为M文件Mysfun01,再建立Simulink仿真模型如图所示,并设置S-function模块的参数为S-functionname,仿真参数取默认值,运行仿真可得仿真结果如图所示。7.5.4添加用户参数的S-函数v当S-函数需要添加用户参数时,要注意两点。第一,在S-函数源代码中,用到该参数的各个子函数,在函数声明部分均应添加该参数,第二,在Simulink模型中设置“S-function”模块参数时,参数的名称和顺序必须与S-函数源代码中的参数名称和顺序完全一致。下面以建立一个三角波函数发生器为例来说明带参数项的S-函数的建立与使用。【例】试建立Simulink下三角波函数发生器,且三角波频率幅值可调。解:首先编写生成三角波S-函数的M文件,打开M文件模板程序,做如下所改:functionsys,x0,str,ts=sanjiaobo(t,x,u,flag,A,Freq)%输入参数A为三角波幅值,Freq为三角波频率switchflag,case0,sys,x0,str,ts=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u,A,Freq);%注意在输出函数部分用到附加参数case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwiseerror(Unhandledflag=,num2str(flag);endfunctionsys,x0,str,ts=mdlInitializeSizessizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%只有一种采样时间sys=simsizes(sizes);x0=;str=;%initializethearrayofsampletimests=00;functionsys=mdlDerivatives(t,x,u)sys=;functionsys=mdlUpdate(t,x,u)sys=;functionsys=mdlOutputs(t,x,u,A,Freq)T=1/Freq;%求三角波周期m=rem(u,T);%u为外部输入时间信息,rem为求余函数K=floor(u/T);%floor为向零取整r=4*A*Freq;c=T/2;if(m=0)&(m=c)&(m=T)sys=-r*(u-(K+0.75)*T);elsesys=A;endfunctionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=;%仿真结束将上述M文件的S函数在当前目录下保存为sanjiaobo.m文件,建立Simulink仿真模型如图(a)所示。双击“S-function”模块,在弹出的参数设置对话框种,设置“S-functionname”为“saniaobo”,设置“S-functionParameter”为“1,1500”,如图(b)所示。Simulink求解器参数“Maxstepsize”设置为1e-5,“Stoptime”设置为0.2s,其它取系统默认值。单击Simulink模型窗口工具,运行仿真得如图7-56所示结果(图中显示时间范围为07e-3s)。7.5.5离散系统的S-函数【例】已知离散PID表达式为:u(k)=Kp*e(k)+Ki*T*+Kd*e(k-1)-e(k-2)/T试使用S-函数实现离散PID控制器,并建立Simulink仿真模型。v解:首先打开S-函数M-文件的模板程序,建立离散PID的S-函数源文件。结果如下:functionsys,x0,str,ts=sfuntmpl(t,x,u,flag,Kp,Ki,Kd)switchflag,case0,sys,x0,str,ts=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u,Kp,Ki,Kd);case3,sys=mdlOutputs(t,x,u);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwiseDAStudio.error(Simulink:blocks:unhandledFlag,num2str(flag);end%endsfuntmplfunctionsys,x0,str,ts=mdlInitializeSizessizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=4;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=0;sizes.NumSampleTimes=1;%只有一种采样时间sys=simsizes(sizes);x0=0;0;0;0;%在此定义系统状态变量的初始值str=;ts=-20;%ts(1)=-2,表示采样时间由flag4,mdlGetTimeOfNextVarHit(t,x,u)决定下一个采样时刻。functionsys=mdlDerivatives(t,x,u)sys=;functionsys=mdlUpdate(t,x,u)x(3)=x(2);x(2)=x(1);x(1)=u;x(4)=u+x(4);sys=x;functionsys=mdlOutputs(t,x,u,Kp,Ki,Kd)sys=Kp*x(1)+Ki*0.01*x(4)+Kd*(x(2)-x(3)/0.01;functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=0.01;%设置采样周期sys=t+sampleTime;functionsys=mdlTerminate(t,x,u)sys=;v将上述M文件在当前目录下保存为“dPID.m”。建立simulink仿真模型如图所示。双击“S-function”模块,弹出其参数设置对话框,设置“S-functionname”为“dPID”,设置“S-functionParameters”为“6.0,5.0,0.5”。Simulink仿真参数取系统默认值,运行仿真可得如图所示的结果。7.6模糊逻辑工具箱简介vMATLAB提供了建立模糊逻辑推理系统的仿真工具箱FuzzyLogicToolbox,建立模糊逻辑推理系统有两种基本方法,第一种方法是借助模糊推理系统编辑器(FuzzyLogicEditor)的图形界面工具建立模糊逻辑推理系统,第二种方法是利用命令建立模糊逻辑推理系统。第一种方法使用简单、建模方便,适合于初学模糊逻辑控制系统建模与仿真的读者。第二种方法稍难一些,但对深入了解模糊逻辑推理系统的MATLAB仿真知识大有帮助。本课程只讲述第一种建模方法。10.1.1基本模糊推理系统编辑器基本模糊推理系统编辑器v在CommandWindows输入“fuzzy”命令,弹出如下图10-1所示的“FISEditor”(模糊推理系统编辑器)窗口。在这里可以对包括输入、输出模糊语言变量的名称、模糊推理系统的类型和名称、模糊逻辑推理的各种运算(与、或、蕴含、规则合成、解模糊化)等高层属性进行编辑。同时,还可以打开模糊推理系统的隶属函数编辑器(mfedit)、模糊规则编辑器(ruleedit)、模糊规则观测器(ruleview)、模糊推理输入输出曲面观测器(surfview)。10.1.2 隶属度函数编辑器(隶属度函数编辑器(mfedit)v在“FISEditor”编辑窗口中,双击输入(或输出)变量,或者单击菜单【Edit】【MembershipFunctionEditor】,弹出如图所示的隶属函数编辑器。10.1.3 模糊规则编辑器(模糊规则编辑器(Ruleedit)v在“FISEditor”编辑窗口中双击模糊推理系统名称“tipper”,或者单击【Edit】【Rules】菜单,弹出如图所示的模糊规则编辑器。10.1.4 模糊规则观察器模糊规则观察器(RuleView)v在模糊推理系统编辑窗口、隶属函数编辑窗口、模糊规则编辑窗口中单击“View”菜单,在弹出的下拉菜单中单击“RulesView”菜单,弹出如图所示的规则观察器10.1.5 模糊推理输入输出曲面观察器模糊推理输入输出曲面观察器(Surfview)v在模糊推理系统编辑窗口、隶属函数编辑窗口、模糊规则编辑窗口中单击“View”菜单,在弹出的下拉菜单中单击“Surfview”菜单,弹出如图所示的输入输出曲面观察器。vTheEnd
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号