第7章:动态系统Simulink建模与仿真_第1页
第7章:动态系统Simulink建模与仿真_第2页
第7章:动态系统Simulink建模与仿真_第3页
第7章:动态系统Simulink建模与仿真_第4页
第7章:动态系统Simulink建模与仿真_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章:动态系统Simulink建模与仿真本章内容:Simulink工具箱简介Simulink建模与仿真基本方法 动态系统Simulink仿真模型的建立 Simulink子系统技术S-函数与Simulink仿真 *模糊逻辑工具箱简介7.1 Simulink工具箱简介7.1.1 Simulink工具箱简介 Simulink是Simulation(仿真)与link(连接)的简写形式,它提供一个动态系统建模、仿真和综合分析的集成环境 ,是MATLAB最重要的组件之一,也是其它仿真工具箱的可视化仿真平台 。优点:建模方便灵活, 适用面广, 结构和流程清晰, 效率高等。 1 Simulink启动(1)在

2、MATLAB命令窗口输入“simulink”命令。(2)单击MATLAB主窗口左下角的“Start”按钮,在弹出的快捷菜单中单击【Simulink】【Library Browser】命令。(3)单击MATLAB主窗口工具栏里的工具。7.1.2 Simulink组成组成图7-1 Simulink窗口界面Commonly Used Blocks(常用模块库)Continuous(连续系统模块库)Discontinuous(非连续系统模块库)Discrete(离散系统模块库)Logic and Bit Operations(逻辑与位操作模块库)Lookup Tables(查询表模块库)Math Op

3、erations(数学操作模块库)Model Verification(模型验证模块库)2 Simulink模块库组件模块库组件 Simulink7.1模块库共包含16个子模块库,它们是:Model-Wide Utility,Ports & Subsystems(接口与子系统模块库),Signal Attributes(信号属性模块库)Signal Routing(信号路由模块库)Sinks(输出模块库)Sources(信号源模块库)User-Defined Functions(用户自定义模块库)Additional Math & Discrete (附加数学和离散系统模块库)

4、 是为了加快建模速度,节省建模过程中寻找模块的时间而将最常用的基本模块集中放在一起形成的,在初学Simulink建模与仿真时,是使用最为频繁的模块库。 (1) Commonly Used Blocks(常用模块库)图7-2v常用模块库包括总线信号生成器(Bus Creator)模块、总线信号选择器(Bus Selector)模块、常数模块(Constant)、数据类型转换(Data Type Conversion)模块,信号分离器(Demux)模块,离散时间积分(Discrete-Time Integrator)模块,增益(Gain)模块,信号地(Ground)模块,输入接口(In1)模块,积

5、分(Integrator)模块,逻辑操作(Logic Operator)模块,信号合成器(Mux)模块,输出接口(Out1)模块,乘法(Product)模块,关系操作(Relational Operator)模块,饱和(Saturation)模块,示波器(Scope)模块,子系统(Subsystem)模块,求和模块(Sum),开关转换模块(Switch),信号终端(Terminator)模块,单位延迟(Unit Delay)模块。 连续系统(Continuous)模块库提供了连续系统Simulink建模与仿真的基本模块,有: 微分环节模块(Derivative),积分环节模块(Integrat

6、or),状态空间模型(State-space),传递函数功能模块(Transfer Fun),传输延迟模块(Transport Delay),可变时间延迟模块(Veriable Transport Delay),可变传输延迟模块(Veriable Transport Delay)零极点增益模块(Zero-Pole) (2) 连续系统模块库连续系统模块库 图7-3v非连续系统模块库(DisContinity)在以前版本中也称为非线性模块库,包含一些常用的非线性运算模块,主要包括: (3) 非连续系统模块库非连续系统模块库 饱和非线性模块(Saturation)死区非线性模块(Dead Zone)

7、变化率限幅模块(Rate Limiter)变化率动态限幅模块(Rate Limiter Dynamic)用于设置饱和输出上下限。动态饱和非线性模块(Saturation Danymic)可以根据输入端口Up和Lo的设定值动态设置输出的上限和下限。用于设定死区区间。动态死区非线性模块(Dead Zone Danymic)可以根据输入端口Up和Lo的设定值动态设置死区区间。用于设置信号输出变化率限幅,即:上升变化率限幅(Rising slew rate)和下降变化率限幅(Falling slew rate)。可以根据输入端口Up和Lo的设定值动态设置信号上升变化率限幅参数R和下降变化率限幅参数L。

8、磁滞回环模块(Backlash):建立间隙模型。继电模块(Relay)量化模块(Quantizer):用于输入信号的量化处理。穿越值检测模块(Hit Crossing):库仑与黏性摩擦(Coulomb & Viscous Friction):返回零模块(Wrap to Zero)继电模块输出值可以在两个设定值之间切换。当继电器吸合时,它保持吸合状态输出直到输入信号值小于继电断开值(Switch off point)。当继电器分离时,它保持分离状态输出直到输入信号值大于继电吸合值(Switch on point)。可按设定的穿越检测方向(Hit crossing direction)检测

9、信号达到设定值的时间。此时输出一个正脉冲。在零值为不连续点,在其它值为连续线性增益。当输入信号值超过设定的极限值(Threshold),输出信号返回到零值。单位延迟模块(Unit Delay):延迟一个采样周期整数延迟模块(Integer Delay):延迟输入N个采样周期,N为自然数。触发延迟模块(Tapped Delay):延迟N个采样周期后并输出全部的输入信息。离散时间积分器(Discrete-Time Integrator):离散积分器模块可以代替积分器用来建立纯离散采样系统。在离散积分器模块参数对话框里,可以设定初始状态值、增益值、输出饱和值。离散传递函数功能模块(Discrete

10、Transfer Fcn):可以建立离散传递函数模型。离散滤波器模块(Discrete Filter):用于建立离散系统滤波器仿真模型。离散零极点增益模型(Discrete Zero-Pole):使用零点、极点、增益值建立离散系统的零极点增益模型。离散微分模块(Difference):输出当前输入信号值与前一个采样值之差。派生离散微分模块(Discrete Derivative):模块的输出值按下式计算:(3)离散系统模块库)离散系统模块库离散系统模块库主要包括用于建立离散采样系统的模块 ,包括:图7-4离散状态空间模型(Discrete State-Space):离散状态空间模型实现下面系统

11、模型 一阶离散传递函数功能模块(Transfer Fcn First Order):用于建立一阶的离散传递函数模型。传递函数引导或终止模块(Transfer Fcn Lead or Lag):用于实现输入信号的离散时间引导或终止补偿。实数零点传递函数功能模块(Transfer Fcn Real Zero):用于实现具有一个实数零点而无极点的传递函数模型。加权滑动平均模块(Weighted Moving Average):模块采样并保持最近N个输入信号,并根据设定的权重参数值(weights)计算它们的平均值。该模块适用于SISO系统或SIMO系统模型。记忆模块(Memory):输出前一时刻的输

12、入信号值。一阶保持器(First-Order Hold):实现离散采样系统的一阶采样保持功能。零阶保持器(Zero-Order Hold):实现离散采样系统的零阶采样保持功能。v其它模块请参考MATLAB软件!7.2 Simulink建模与仿真基本方法v7.2.1 简单系统仿真模型的建立简单系统仿真模型的建立 建立上图所示系统框图的Simulink仿真模型的基本方法如下; 1.启动MATLAB/Simulink工具箱 2.建立Simulink空白模型Simulink空白模型的建立可方法如下:在MATLAB主窗口中选择菜单File/New/Model。选择Simulink模块库浏览器窗口的菜单F

13、ile/New/Model。单击Simulink模块库浏览器工具栏的新建图标“”。3.根据系统框图选择模块 4.模块的复制与删除操作在模块库选中模块后,按住鼠标左键不放并拖动到Simulink模型窗口指定位置,释放鼠标左键,完成模块的复制操作。在模块库选中模块后,单击鼠标右键,在弹出的快捷菜单中,单击“Add to Example_Model”命令将模块添加到指定模型窗口,完成模块的复制操作。在模块库选中模块后,在库浏览器窗口的Edit菜单中选择Copy命令,用鼠标单击目标模型窗口中指定位置,再从模型窗口的Edit菜单中选择Paste,完成模块的复制操作。当模型窗口已有所需模块时,也可以直接从

14、该处复制模块,操作方是单击鼠标右键,在弹出的快捷菜单中单击“Copy”命令,然后用鼠标右键单击模型窗口空白处,在弹出的快进诶菜单中单击“Paste”命令来完成粘贴任务。此外,也可以使用编辑菜单进行复制、粘贴操作。当然还可以用鼠标右键按住所需复制的模块不放,并拖动到指定位置完成复制操作,这可大大加快建模速度。5.模块的连接 将鼠标移动到模块的输出端子上,当鼠标出现“十字”符号后,按下鼠标左键并拖动到下级模块的输入端子上,完成模块信号的连接。如上图所示。选中信号输出模块,按下键盘“Ctrl”键并单击下级模块完成模块信号的连接。在已存在的信号线上引出新的信号线时,可用鼠标右键单击源信号线,并按住不放

15、拖动到指定位置,完成信号线的分支连接。如图所示,在模块没有完成连接时,以红色虚线显示,当连接完成后以黑色实线显示。v将各子模块连接起来后,构成如图所示的系统模型 7.2.2 Simulink仿真模型参数设置1.基本模块参数设置 在完成模块的信号线连接并建立起系统的Simulink仿真模型后,需要设置模块的参数。在Simulink模型里,双击需要修改参数的模块,弹出参数设置对话框。2. 仿真参数设置仿真参数设置 单击模型窗口的“Simulation”菜单,在弹出的下拉菜单中单击“Configuration Parameters”命令,打开“Configuration Parameters”对话框

16、如图所示。 3. 运行仿真与仿真输出运行仿真与仿真输出 双击“Scope”模块,弹出如图所示仿真输出结果 仿真参数配置完毕后,可运行仿真,方法有三种:单击模型窗口工具栏 工具单击“Simulation”菜单,在弹出的下拉菜单中单击“Start”命令 同时按下快捷键“Ctrl+T”。7.3动态系统Simulink仿真模型的建立v由系统框图建立由系统框图建立Simulink仿真模型仿真模型v由传递函数建立由传递函数建立Simulink仿真模型仿真模型v由状态方程建立由状态方程建立Simulink仿真模型仿真模型v由微分方程建立由微分方程建立Simulink仿真模型仿真模型7.1.1 由系统框图建立

17、由系统框图建立Simulink仿真模型仿真模型v在控制领域,控制系统通常以功能框图的形式进行描述,与在控制领域,控制系统通常以功能框图的形式进行描述,与Simulink仿真模型在结构上十分相似,因此通过被控系统的仿真模型在结构上十分相似,因此通过被控系统的框图,很容易建立其框图,很容易建立其Simulink仿真模型。下面以直流电机双仿真模型。下面以直流电机双闭环调速系统为例来说明通过系统框图建立闭环调速系统为例来说明通过系统框图建立Simulink仿真模仿真模型的基本方法。型的基本方法。r(t)为给定输入,采用阶跃信号。y(t)为系统输出,表示直流电机的转速。ASR和ACR分别为转速调节器、电

18、流调节器,由PI调节器组成。根据直流双闭环调速系统工程整定方法,进行ASR和ACR的参数整定时,首先断开转速环,整定电流调节器ACR。然后接通转速环,整定转速环ASR,同时调节电流环参数。根据上述分析,首先建立直流双闭环调速系统的高层仿真模型,其中转速调节器和电流调节器由空白子系统组成,如图所示。转速调节器子系统Simulink模型 电流调节器子系统Simulink模型 7.1.2 由传递函数建立由传递函数建立Simulink仿真模型仿真模型v由系统传递函数建立Simulink仿真模型可直接使用Continue模块库的Transfer Fun模块,下面以实例说明。【例题】已知某单位负反馈系统开

19、环传递函数为15 . 22410*521)(2sssssG试建立其Simulink仿真模型并进行仿真。建立模型过程如下:(1)建立一个空白的Simulink仿真模型窗口,如图 (a)所示。(3)建立传递函数的模型。 (2)选择系统所需的Simulink模块 (4)连接模块并设置仿真参数 (5)运行仿真7.1.3 由状态方程建立由状态方程建立Simulink仿真模型仿真模型v由系统状态方程建立Simulink仿真模型可直接使用Continue模块库的State-space模块,下面以实例说明。【例】已知某系统状态空间模型为: uxx100005221320100001000010 xy0001试

20、建立其simulink仿真模型,并求其单位阶跃响应。 求解过程如下:(2) 选择系统所需的Simulink模块 (1) 建立一个Simulink空白仿真模型窗口 (3) 连接模块并设置参数 (4) 设置仿真参数并运行仿真 7.1.4 由微分方程建立由微分方程建立Simulink仿真模型仿真模型第一是将系统微分方程转换为传递函数模型,第二是将微分方程转换为状态空间模型,第三是由微分方程直接建立第三是由微分方程直接建立Simulink仿真模型。仿真模型。 由微分仿真建立Simulink仿真模型有三种方法,【例】已知某系统数学模型是一个高阶微分方程: uyyyy3252010 且输出量y的各阶导数初

21、始值均为零,试建立其Simuink仿真模型。求解过程如下: (1)将高阶微分方程转换为一组一阶微分方程:设yx 1yx2输出方程。则得:21xyx 32xyx uxxxuyyyyx325201032520101233 1xy (2) 建立每个一阶微分方程的Simulink仿真模型 这里首先需要知道微分环节 的Simulink模型如图(a)所示 dtxx11dtxx22dtxx33因此可以建立 Simulink仿真模型如图(b、c、d)所示 (3) 建立微分方程组的simulink仿真模型。 将各个微分单元连接起来就构成了整个系统的Simulink仿真模型,结果如下图所示。(4) 设置Simul

22、ink仿真参数。 上图中u取单位阶跃响应信号,Simulink求解器取默认参数配置。运行仿真得输出响应曲线如图下图所示。7.4 Simulink子系统技术 在使用Simulink进行建模与仿真时,经常会遇见很复杂的系统,难以用一个简单的Simulink框图模型来进行描述。与软件开发方法一样,此时可将复杂系统的模型进行功能划分,将其分割为各个独立的子系统,然后再采用以下两种策略加以实现:(1)自下而上的策略:首先建立复杂系统中的每一个功能模块,然后再组合这些模块,逐渐建立整个系统的模型。(2)自上而下的策略:首先建立复杂系统的整体结构模型,然后再逐一实现每一部分的模型。无论那种策略,对于复杂系统

23、模型的建立,都要用到子系统技术。本节主要介绍子系统及其封装技术。7.4.1子系统的创建方法子系统的创建方法1.通过port&subsystem模块库建立子系统 在建立子系统时,比较方便的是首先使用Port&Subsystem的Subsystem模块建立一个空白子系统,然后对空白子系统进行编辑,最后再建立系统整体的Simulink仿真模型。这里以闭环系统的PID控制为例来说明子系统的建立方法。如图所示v在已经建立好的复杂系统模型之中建立子系统。其基本方法是:首先选择将要生成子系统的一组模块,然后选择Simulink模型编辑器的菜单【Edit:Create Subsystem】或者

24、单击鼠标右键选择Create Subsystem选项,都将生成子系统模块。如图所示。2.直接建立子系统7.4.2子系统的封装方法子系统的封装方法v在上述PID控制的子系统模型中,如果需要修改PID的参数,则需要打开其子系统模型窗口。为了能不打开该子系统模块窗口而修改其内部参数,Simulink提供了子系统封装技术。v以上述建立的PID控制器子系统为例来说明子系统封装的基本步骤。 (1) 选中子系统,单击鼠标右键,在弹出的对话框中单击“Mask Subsystem”命令或者单击菜单【Edit】【Mask Subsystem】,弹出子系统封装编辑窗口,如图所示。在“Drawing commands

25、”编辑窗口,可以给模块图标上绘制图形,如使用plot绘制图形、disp显示文字、image显示已有图形 (1)子系统图标设置,单击 Icon按钮,设置子系统图标。在“Drawing commands”编辑窗口,可以给模块图标上绘制图形,如使用plot绘制图形、disp显示文字、image显示已有图形例:使用如下命令可得到如图所示结果disp(PID Controller)plot(sin(0:0.1:2*pi),cos(0:0.1:2*pi)/2)image(imread(library.bmp)封装编辑框基本设置封装编辑框基本设置(2)参数设置:单击Parameters按钮,建立封装模块内部

26、变量与封装对话框之间的联系 。单击按钮或按钮可以增加或删除变量 “Type” 可选择参数为:“Edit”表示用文本编辑框输入参数 “Popup”表示以下拉菜单形式输入参数 “checkbox”表示以复选框形式输入参数 此处变量名称要与子系统参数名称相同(3)初始化设置:单击“Initialization” 按钮,弹出封装编辑器参数初始化设置对话框。(4)文档编辑。单击“Documentation”按钮,弹出如图所示的文档编辑窗口。在这里可建立子系统的文档说明。 经过上述操作,完成对PID子系统的封装操作,双击子系统模块,弹出参数设置对话框如图所示。7.5 S-函数与Simulink仿真v7.5

27、.1 S-函数简介函数简介 S-函数是系统函数(System Function)的简称,是指用指定语言描述的一个非图形化功能模块(以区别Simulink的系统模块),是Matlab为用户提供的一个扩展功能接口。用户可以采用MATLAB语言,C、C+,Fortran或者Ada等语言编写S函数。S-函数由一种特定的语法构成,用来描述并实现连续系统、离散系统、混合系统等模型。S函数可接收来自Simulink求解器的相关信息,并对求解器发出的命令作出响应,这种交互作用类似Smulink系统模块与求解器的交互作用。7.5.2.S-函数的用法v在动态系统设计、仿真与分析中,用户可以使用Simulink浏览

28、器里用户自定义模块库中的S-Functiong模块来调用已编写的S-函数。S-Function模块默认为一个单输入单输出的系统模块,如果有多个输入或者输出信号,可以采用Mux模块和Demux模块对信号进行组合和分离操作。在Simulink空白模板里粘贴“S-Function”模块,双击该模块弹出参数设置对话框,如图所示。创建S-函数源文件。在Simulink模型框图中添加S-Function模块,并进行正确的参数设置。在Simulink模块框图中按照定义好的功能连接输入输出端口进行基本仿真参数设置,单击工具栏工具,运行仿真。一般而言,使用S-函数的基本步骤如下: 创建S-函数源文件的方法有很多

29、,用户可以按照S-函数语法格式自行编写每一行代码,但是这样做既费时费力,又容易出错。Simulink为用户提供了很多S-函数的模板和例子,我们可以根据自己的需要修改相应的模板或者例子即可。详细的Simulink模板文件在后面介绍。7.5.3 S-函数模板v单击Simulink Library的“User-Defined Function”前的扩展按钮,再双击“S-function Examples”模块弹出如图7-477所示的S-函数实例模块库。图中包括用M文件、C语言、C+、Ada、和Fortran语言编写的S-函数实例。【例题】以S-函数完成对输入信号的运算:y3*u+2。解:基本步骤如下

30、:(1)建立Simulink仿真模型,如图所示 2)打开S-函数模板源文件如下function sys,x0,str,ts = sfuntmpl(t,x,u,flag)switch flag, case 0, sys,x0,str,ts=mdlInitializeSizes; case 1, sys=mdlDerivatives(t,x,u); case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t,x,u); case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); case 9, sys=mdlTermina

31、te(t,x,u); otherwise DAStudio.error(Simulink:blocks:unhandledFlag, num2str(flag); endfunction sys,x0,str,ts=mdlInitializeSizessizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 0;sizes.NumInputs = 0;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; 定义采用周期的个数sys = si

32、msizes(sizes); x0 = ; str = ; ts = 0 0;function sys=mdlDerivatives(t,x,u) sys = ;function sys=mdlUpdate(t,x,u) sys = ;function sys=mdlOutputs(t,x,u)sys = ;function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1; sys = t + sampleTime;function sys=mdlTerminate(t,x,u)sys = ;ts是一个12的向量,ts(1)定义采样周期,ts(2

33、)是偏移量。当ts(1)=0表示系统为连续系统,当ts(1)=-2表示系统采样时间由flag4的mdlGetTimeOfNextVarHit函数决定。 输入变量中,t是采样时间,x是状态变量,u是输入变量(从Simulink输入来的变量信息,当有多个输入时,u为一个行向量,flag是仿真过程中的状态标志或称之为控制变量,由它来判断当前将要调用的回调函数;输出变量sys根据flag的不同而返回不同的内容。 ) 在本例题中,为了完成设定的函数功能y=3*u+2,可将上述S-函数的模板进行如下修改(这里只列出需要修改的部分):首先将S函数文件首行修改为:function sys,x0,str,ts

34、=Mysfun(t,x,u,flag),并将文件另存为Mysfun。其次,找到function sys,x0,str,ts=mdlInitializeSizes,作如下修改: sizes.NumOutputs= 1; sizes.NumInputs= 1;然后,再找到function sys=mdlOutputs(t,x,u),作如下修改: sys =3*u+2;最后,将该文件保存到当前目录下的Mysfun.m文件中。(3)双击仿真模型中的S-function模块打开参数设置对话框,并修改S-function的名称为“Mysfun”。(4)修改仿真参数,完成仿真。这里仿真求解器参数取系统默认值

35、,运行仿真,可得如图所示仿真结果。【例】已知某系统状态方程为:uxx20223300020001xy111试用S-函数建立其仿真模型,并求其单位阶跃响应曲线。解:首先打开S-函数模板文件。打开S-函数模板文件除了按照上述介绍的方法,也可以在Command Windows中输入命令: open sfuntmpl或者 edit sfuntmpl执行命令后系统弹出M文件的S-函数编辑窗口。实现上述系统的S-函数程序代码如下所示:function sys,x0,str,ts = Mysfun01(t,x,u,flag)switch flag,case 0, % 初始化% sys,x0,str,ts=m

36、dlInitializeSizes;case 1, %求导数 sys=mdlDerivatives(t,x,u);case 2, % 状态更新% sys=mdlUpdate(t,x,u);case 3, %计算输出% sys=mdlOutputs(t,x,u);%计算下一个采样时刻%case 4, sys=mdlGetTimeOfNextVarHit(t,x,u);case 9, % 结束处理 % sys=mdlTerminate(t,x,u);otherwise%错误处理 % DAStudio.error(Simulink:blocks:unhandledFlag, num2str(flag

37、); endfunction sys,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 =

38、 ;ts = 0 0;function sys=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;function sys=mdlUpdate(t,x,u)sys = ;function sys=mdlOutputs(t,x,u)sys = -x(1)-x(2)-x(3);function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1; % 设置采样周期sys = t + sampleTime;function sys=mdlTerm

39、inate(t,x,u)sys = ;将上述S-函数在当前目录下保存为M文件Mysfun01,再建立Simulink仿真模型如图所示,并设置S-function模块的参数为S-function name,仿真参数取默认值,运行仿真可得仿真结果如图所示。7.5.4 添加用户参数的S-函数v 当S-函数需要添加用户参数时,要注意两点。第一,在S-函数源代码中,用到该参数的各个子函数,在函数声明部分均应添加该参数,第二,在Simulink模型中设置“S-function”模块参数时,参数的名称和顺序必须与S-函数源代码中的参数名称和顺序完全一致。下面以建立一个三角波函数发生器为例来说明带参数项的S-

40、函数的建立与使用。【例】试建立Simulink下三角波函数发生器,且三角波频率幅值可调。解:首先编写生成三角波S-函数的M文件,打开M文件模板程序,做如下所改:function sys,x0,str,ts = sanjiaobo(t,x,u,flag,A,Freq)%输入参数A为三角波幅值,Freq为三角波频率switch flag, case 0, sys,x0,str,ts=mdlInitializeSizes; case 1, sys=mdlDerivatives(t,x,u); case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t

41、,x,u,A,Freq);%注意在输出函数部分用到附加参数 case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); case 9, sys=mdlTerminate(t,x,u); otherwise error(Unhandled flag = ,num2str(flag);endfunction sys,x0,str,ts=mdlInitializeSizessizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1; sizes.NumInputs

42、 = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; %只有一种采样时间sys = simsizes(sizes);x0 = ;str = ;% initialize the array of sample timests = 0 0;function sys=mdlDerivatives(t,x,u)sys = ;function sys=mdlUpdate(t,x,u)sys = ;function sys=mdlOutputs(t,x,u,A,Freq)T=1/Freq; %求三角波周期m=rem(u,T); %u为外部输入时间信

43、息,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);else sys=A;endfunction sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime =1; sys = t + sampleTime;function sys=mdlTerminate(t,x,u)sys = ; % 仿真结束 将上述M文件的S函数在当前目录下保存为sanjiaobo.m文件,建立Simulink仿真模型如图(a)所示。双击“

44、S-function”模块,在弹出的参数设置对话框种,设置“S-functionname”为“saniaobo”,设置“S-function Parameter”为“1,1500”,如图(b)所示。Simulink求解器参数“Max step size”设置为1e-5,“Stop time”设置为0.2s,其它取系统默认值。单击Simulink模型窗口工具,运行仿真得如图7-56所示结果(图中显示时间范围为07e-3s)。7.5.5离散系统的S-函数 【例】已知离散PID表达式为:u(k)=Kp*e(k)+Ki*T*kmke0)(+Kd*e(k-1)-e(k-2)/T试使用S-函数实现离散PI

45、D控制器,并建立Simulink仿真模型。v解:首先打开S-函数M-文件的模板程序,建立离散PID的 S-函数源文件。结果如下:function sys,x0,str,ts = sfuntmpl(t,x,u,flag,Kp,Ki,Kd)switch flag,case 0, sys,x0,str,ts=mdlInitializeSizes;case 1, sys=mdlDerivatives(t,x,u);case 2, sys=mdlUpdate(t,x,u,Kp,Ki,Kd);case 3, sys=mdlOutputs(t,x,u);case 4, sys=mdlGetTimeOfNex

46、tVarHit(t,x,u);case 9, sys=mdlTerminate(t,x,u);otherwise DAStudio.error(Simulink:blocks:unhandledFlag, num2str(flag); end % end sfuntmplfunction sys,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 = -2 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论