MATLAB第5章S函数_第1页
MATLAB第5章S函数_第2页
MATLAB第5章S函数_第3页
MATLAB第5章S函数_第4页
MATLAB第5章S函数_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第5章S-函数,5.1S-函数概述5.2S-函数的工作原理5.3编写M文件S-函数,5.1S-函数概述,5.1.1S-函数的基本概念S-函数是系统函数(SystemFunction)的简称,是指采用非图形化的方式描述的一个功能块。用户可以采用MATLAB代码,C,C+等语言编写S-函数。S-函数由一种特定的语法构成,用来描述并实现连续系统、离散系统以及复合系统等动态系统。,简单来说,用户可以从如下的几个角度来理解S-函数:(1)S-函数为Simulink的“系统”函数。(2)能够响应Simulink求解器命令的函数。(3)采用非图形化的方法实现一个动态系统。(4)可以开发新的Simulink模块。(5)可以与已有的代码相结合进行仿真。(6)采用文本方式输入复杂的系统方程。,(7)扩展Simulink功能。M文件S-函数可以扩展图形能力,CMEXS-函数可以提供与操作系统的接口。,5.1.2如何使用S-函数在动态系统设计、仿真与分析中,用户可以使用Functionssizes.NumInputs=1;,(3)找到函数mdlOutputs,加入以下代码:sys=2*u;(到现在为止我们的第一个S-函数写完了。下面演示一下它的作用。)(4)在Simulink空白页中添加S-function块,打开S-function块对话框,参数S-functionname设置为doublesfunction。按照图5.2添加连接好其余的各个模块。(5)开始仿真,在Scope中观察输出结果,可以看到输入正弦信号被放大为原来的2倍,如图5.2所示。,5.2S-函数的工作原理,5.2.1状态方程在对动态系统建模时,总是能够采用广义的状态空间形式对无论是线性系统还是非线性系统进行描述。这个描述包含以下两个方程:状态方程:输出方程:,其中A、B、C、D分别是状态矩阵、输入矩阵、输出矩阵、前馈矩阵。Simulink框图的大部分模块都具有一个输入向量u、一个输出向量y和一个状态向量x,如图5.3所示。,图5.3Simulink模块,S-函数同样是一个Simulink模块。它的以下几个例程函数清楚地体现了状态空间所描述的特性。(1)S-函数中的连续状态方程描述。状态向量的一阶导数是状态x、输入u和时间t的函数。在S-函数中,状态的一阶导数是在mdlDerivatives例程中计算的,并将结果返回供求解器积分。(2)S-函数中的离散状态方程描述。下一步状态的值依赖于当前的状态输入u和时间t。这是通过mdlUpdate例程完成的,并将结果返回供求解器在下一步时使用。(3)S-函数中的输出方程描述。输出值是状态、输入和时间的函数。,5.2.2Simulink仿真的两个阶段理解S-函数首先要很好地了解Simulink的仿真过程。仿真包含两个主要阶段,第一个阶段是初始化,这时块的所有参数都已确定下来。初始化阶段完成了以下工作:(1)传递参数给MATLAB进行求值。(2)得到的数值作为实际的参数使用。(3)展开模型的层次,每个子系统被它们所包含的块替代。(4)检查信号的宽度和连接。(5)确定状态初值和采样时间。,仿真运行阶段的工作可以概括为:(1)计算输出。(2)更新离散状态。(3)计算连续状态,连续状态的计算过程:每个块按照预先确定的顺序计算输出。每个块使用当前时间、块的输入和状态计算它的导数。导数返回给求解器,通过积分得到下一步状态的值。(4)计算输出,过零可能被激活。,5.2.3S-函数仿真流程S-函数是Simulink的重要组成部分,它的仿真过程包含在Simulink仿真过程之中,所以上一节所述同样适用于S-函数。S-函数的仿真流程也包括初始化阶段和运行阶段两个阶段。,(1)初始化:在仿真开始前,Simulink在这个阶段初始化S-函数。初始化结构体SimStruct,它包含了S-函数的所有信息。设置输入输出端口数。设置采样时间。分配存储空间。(2)计算下一个采样时间点:只有在使用变步长求解器进行仿真时,才需要计算下一个采样时间点,即计算下一步的仿真步长。,(3)计算输出:计算所有输出端口的输出值。(4)更新状态:此例程在每个步长处都要执行一次,可以在这个例程中添加每一个仿真步都需要更新的内容,例如离散状态的更新。(5)数值积分:用于连续状态的求解和非采样过零点。如果S-函数存在连续状态,Simulink就在minorsteptime内调用mdlDdrivatives和mdlOutput两个S-函数例程。,5.3编写M文件S-函数,5.3.1M文件S-函数的工作流程M文件S-函数和上节所介绍的S-函数仿真流程是一致的。它调用例程函数的顺序是通过标志Flag来控制的。图5.6给出了各仿真阶段的标志值、变量值及其对应仿真例程。,图5.6M文件S-函数流程,5.3.2M文件S-函数模板Simulink为我们编写S-函数提供了各种模板文件,其中定义了S-函数完整的框架结构,用户可以根据自己的需要加以剪裁。编写M文件S-函数时,推荐使用S-函数模板文件sfuntmpl.m。这个文件包含了一个完整的M文件S-函数,它包含1个主函数和6个子函数。在主函数内程序根据标志变量Flag,由一个开关转移结构(Switch-Case)根据标志将执行流程转移到相应的子函数,即例程函数。Flag标志量作为主函数的参数由系统(Simulink引擎)调用时给出。了解这个模板文件的最好方式莫过于直接打开看看其代码。,要打开模板文件,可在MATLAB命令行下输入:editsfuntmpl或者双击S-functiondemosM-fileS-functionsM-filetemplate块。下面是删除了其原有注释的代码,结构反而更为清晰紧凑。functionsys,x0,str,ts=sfuntmpl(t,x,u,flag)%主函数%主函数包含四个输出:sys数组包含某个子函数返回的值,它的含义随着调用子函数的不同而不同;x0为所有状态的初始化向量;str是保留参数,总是一个空矩阵;Ts返回系统采样时间。,%仿真流程位置如图5.6所示;此外输入参数后面还可以接续一系列的附带参数。另外别忘了编写自己的S-函数时,应该把函数名sfuntmpl改为S-function块中对应的函数名functionsys,x0,str,ts=sfuntmpl(t,x,u,flag)switchflagcase0sys,x0,str,ts=mdlInitializeSizes;case1sys=mdlDerivatives(t,x,u);case2sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u);case4sys=mdlGetTimeOfNextVarHit(t,x,u);case5sys=mdlTerminate(t,x,u);otherwiseerror(Unhandledflag=,num2str(flag);end%主函数结束%下面是各个子函数,即各个仿真例程%1.初始化例程子函数:提供状态、输入、输出、采样时间数目和初始状态的值。必须有该子函数。,%初始化阶段,标志变量首先被置为0,S-函数被第一次调用时,mdlInitializeSizes子函数首先被调用。这个子函数应当为系统提供S-function块的下列信息:sizes.NumContStates=0;%连续状态的个数sizes.NumDiscStates=0;%离散状态的个数sizes.NumOutputs=0;%输出的个数sizes.NumInputs=0;%输入的个数sizes.DirFeedthrough=1;%是否直接馈通:这是一个布尔量,当输出值直接依赖于同一时刻的输入值时为1;否则为0,sizes.NumSampleTimes=1;%采样时间的个数:每个系统至少有一个采样时间%这些信息是通过一个数据结构sizes来表示的%在该函数中用户还应该提供初始状态x0,采样时间ts。ts是一个m2的矩阵,其中第k行包含了对应与第k个采样时间的采样周期值和偏移量。另外,在该子函数中str设置为空:,str是保留变量,暂时没有任何意义functionsys,x0,str,ts=mdlInitializeSizessizes=simsizes;%生成sizes数据结构sizes.NumContStates=0;%连续状态数,缺省为0sizes.NumDiscStates=0;%离散状态数,缺省为0sizes.NumOutputs=0;%输出量个数,缺省为0,sizes.NumInputs=0;%输入量个数,缺省为0sizes.DirFeedthrough=1;%是否存在直接馈通。1:存在;0:不存在,缺省为1sizes.NumSampleTimes=1;%采样时间个数,至少是一个sys=simsizes(sizes);%返回sizes数据结构所包含的信息x0=;%设置初始状态str=;%保留变量置空ts=00;%采样时间:采样周期偏移量,采样周期为0表示是连续系统,%2.计算导数例程子函数:给定t,x,u,计算连续状态的导数,用户应该在此给出系统的连续状态方程。该子函数可以不存在functionsys=mdlDerivatives(t,x,u)sys=;%sys表示状态导数,即dx%3.状态更新例程子函数:给定t,x,u,计算离散状态的更新。每个仿真步长必然调用该子函数,不论是否有意义。用户除了在此描述系统的离散状态方程外,还可以填入其它每个仿真步长都有必要执行的代码functionsys=mdlUpdate(t,x,u)sys=;%sys表示下一个离散状态即x(k+1),%4.计算输出例程子函数:给定t,x,u,计算输出。该子函数必须存在,用户可以在此描述系统的输出方程functionsys=mdlOutputs(t,x,u)sys=;%sys表示下输

温馨提示

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

评论

0/150

提交评论