您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 《控制系统数字仿真与cad》第9章Simulink的扩展工具S-函数
1本章内容(1)S-函数的基本概念和工作原理;(2)掌握m-文件S-函数的建立及其使用;(3)了解CMEXS-函数的组成;(4)S-函数模块化的方法,利用S-function模块可形成用户自行定义的S-函数模块;(5)利用S-函数编译器建立CMEXS-函数的方法及CMEXS-函数的使用。第9章Simulink的扩展工具S-函数29.1S-函数简介1.S-函数的基本概念S-函数是系统函数(SystemFunction)的简称,是指采用非图形化的方式(即计算机语言,区别于Simulink的系统模块)描述的一个功能块。用户可以采用MATLAB、C、C++、FORTRAN或Ada等语言编写S-函数。S-函数由一种特定的语法构成,用来描述并实现连续系统、离散系统以及复合系统等动态系统,S-函数能够接收来自Simulink求解器的相关信息,并对求解器发出的命令做出适当的响应,这种交互作用非常类似于Simulink系统模块与求解器的交互作用。一个结构体系完整的S-函数包含了描述动态系统所需的全部能力,所有其他的使用情况都是这个结构体系的特例。往往S-函数模块是整个Simulink动态系统的核心。32.S-函数的工作原理(1)动态系统的描述Simulink中的大部分模块都具有一个输入向量u、一个输出向量y和一个状态向量x,如图9-1所示。–状态向量可能包括连续状态、离散状态或连续状态与离散状态的组合。输入、输出和状态之间的数学关系可以用以下关系表示:输出方程:y=f0(t,x,u)连续状态方程:dx=fd(t,x,u)离散状态方程:xk+1=fu(t,x,u)其中x=[dxxk+1]4(2)仿真过程Simulink的仿真过程包含两个主要阶段,第一个阶段是初始化,初始化所有的模块,这时模块的所有参数都已确定下来。初始化过后,进入仿真的第二个阶段——运行阶段,仿真开始运行。仿真过程是由求解器和系统(Simulink引擎)交互控制的。5S-函数的仿真过程,可以概括为:1)初始化:在仿真开始前,Simulink在这个阶段初始化S-函数。初始化结构体SimStruct,它包含了S-函数的所有信息;设置输入输出端口数;设置采样时间;分配存储空间。62)数值积分:用于连续状态的求解和非采样过零点。如果S-函数存在连续状态,Simulink就在minorsteptime内调用mdlDdrivatives和mdlOutput两个S-函数子函数。如果存在非采样过零点,Simulink将调用mdlOutput和mdlZeroCrossings子函数(过零点检测子函数),以定位过零点。73)更新离散状态:此子函数在每个步长处都要执行一次,可以在这个子函数中添加每一个仿真步都需要更新的内容,例如离散状态的更新。4)计算输出:计算所有输出端口的输出值。5)计算下一个采样时间点:只有在使用变步长求解器进行仿真时,才需要计算下一个采样时间点,即计算下一步的仿真步长。6)仿真结束:在仿真结束时调用,可以在此完成结束仿真所需的必要工作。83.S-函数的工作方式引入S-函数的目的是为了使Simulink有能力构作一般仿真框图,去处理如下各种系统的仿真:连续系统、离散系统、离散--连续混和系统、多频采样系统、嵌套系统等。通常S-函数的调用格式为sys=model(t,x,u,flag)其中model为系统的模型文件名,t,x,u分别为当前的时刻、状态向量和输入向量,而变量flag的值控制返回变量sys的信息,如表9-1所示。9在flag=0时,调用S-函数的格式为[sys,x0]=model(t,x,u,flag)这时返回参数x0表示状态向量的初始值,而返回参数sys各分量的含义如下sys(1)―连续状态变量数sys(2)―离散状态变量数sys(3)―输出变量数sys(4)―输入变量数sys(5)―系统中不连续根的数量sys(6)―系统中有无代数循环的标志(有置1)sys(7)―采样时间数109.2S-函数的建立S-函数从本质上讲是具有特殊调用格式的MATLAB函数,它表征系统动态特性,用户在建立起Simulink系统模型框图时,Simulink就会利用该框图中的信息,生成一个S-函数(即mdl文件),S-函数是Simulink如何运作的核心所在,每个框图都有一个与之同名的S-函数,而该S-函数正是Simulink在仿真和分析中交互作用的载体,简单地说S-函数代表Simulink模型,S-函数模块是整个Simulink动态系统的核心。11考虑著名的范德坡方程(vendelpolEpuation)。写成状态方程的形式为于是可构造Simulink方框图如图9-2所示。0dd)1(dd222xtxxtx1222211)1(xxxxxx12图9-213在方框图形成的同时,与之相应的S-函数(即mdl文件)也随之产生,当生成的框图被保存后,相应的S-函数就被记录在磁盘上,这个mdl文件包含了该方框图所有的图形及数学关系信息。然而,当在框图视窗中进行仿真时,MATLAB并非去解释运行该mdl文件,而是运行保存于Simulink内存中的S-函数映象文件。当此方框图以vdps.mdl文件存盘后,就可以在MATLAB中访问该系统,并通过设置flag的值得到系统的动态信息。14例9-1设置flag=0,查询图9-2系统vdps.mdl的维数和初始条件。解在MATLAB指令方式下,运行以下命令[sys,x0]=vdps([],[],[],0)结果显示sys=2000002x0=0.25000.250015返回变量sys的各分量表明,该系统有两个连续状态,没有离散状态,没有输入和输出,状态是连续的,没有代数循环,变量x0给出两个状态的初始值。由方框图创建的S-函数的映象文件,即mdl文件比较繁琐,因这一函数除了用来对原始模型进行描述外,还可以绘制出系统的框图结构。若用户只想对系统进行仿真分析,而不想得到系统的结构图,则用户可利用标准的m文件、C、C++、FORTRAN以及Ada等语言编写S-函数,即按照规则建立某种简单的描述方法,S-函数不管用什么方式创建,一旦建立,它既可以在框图中使用,也可以在指令中使用。16由上可知,S-函数是由一些仿真功能模块(函数)组成的。这些函数就是S-函数所有的语法构成,用户的任务就是编写这些函数,供Simulink及求解器调用。创建S-函数源文件有多种方法,当然可以按照S-函数的语法格式自行书写每一行代码,但是这样做容易出错且麻烦。Simulink为用户提供了大量的S-函数模板和例子,用户可以根据自己的需要修改相应的模板或例子即可。限于篇幅,下面仅对最常用的m文件S-函数和CMEXS-函数做一介绍。179.2.1用m文件创建S-函数1.m文件S-函数的模板在MATLAB6p1/toolbox/simulink/blocks目录下保存有大量的用m文件编写的S-函数。其中包含一个用m文件编写的S-函数的模板文件sfuntmpl.m。表9-2列出了这些用m文件编写的S-函数及其简要说明。18文件名说明sfuntmpl.m模板文件csfunc.m以状态空间形式定义一个连续系统dsfunc.m以状态空间形式定义一个离散系统limintm.m实现连续限定积分器,其输出被限制在上下边界内,初值也限定mixedm.m实现有一个连续积分器和一个单位延迟串联的混合系统simom.m一个具有A,B,C,D内部矩阵的状态空间m文件S-函数simom2.m一个具有A,B,C,D外部矩阵的状态空间m文件S-函数sfun_varargm.m显示如何使用MATLABvararg灵活性的m文件S函数例子vdpm.m实现VandelPol等式vsfunc.m实现一个变步长延时,第一个输入延时有第二个输入确定的时间vlimintm.m连续限定积分器,示范如何使用大小输入为-1来建立一个提供动态输入/状态宽度的S函数vdlmintm.m一个离散限定积分器,与vlimintm.m一样,但积分器是离散的表9-2m文件S-函数例子19模板文件sfuntmpl.m定义了S-函数完整的框架结构,此文件中包含1个主函数和6个子函数,在主函数内程序根据标志变量flag,由一个开关转移结构(Switch-Case)根据标志将执行流程转移到相应的子函数。flag标志量作为主函数的参数由系统调用时给出。在MATLAB窗口中输入以下命令可打开此模板文件。editsfuntmpl20%主函数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);otherwiseerror(['Unhandledflag=',num2str(flag)]);end21%mdlInitializeSizes%初始化子函数function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;%生成sizes数据结构sizes.NumContStates=0;%连续状态数,默认为0sizes.NumDiscStates=0;%离散状态数,默认为0sizes.NumOutputs=0;%输出量个数,默认为0sizes.NumInputs=0;%输入量个数,默认为0sizes.DirFeedthrough=1;%是否存在代数循环(1-存在,0-不存在,默认为1)sizes.NumSampleTimes=1;%采样时间个数,每个系统至少有一个sys=simsizes(sizes);%返回sizes数据结构所包含的信息x0=[];%设置初值状态tr=[];%保留变量置空ts=[00];%采样时间,即[采样周期偏移量],采样周期为0表示是连续系统22%mdlDerivatives%计算导数子函数:它根据t,x,u计算连续状态的导数functionsys=mdlDerivatives(t,x,u)sys=[];%sys表示状态导数,即dx,用户应在此给出连续系统的状态方程%mdlUpdate%更新离散状态子函数:它根据t,x,u计算离散系统下一时刻的状态值functionsys=mdlUpdate(t,x,u)%更新离散状态子函数sys=[];%sys表示下一个离散状态,即x(k+1),%用户应在此子函数中给出离散系统的状态方程23%mdlOutputs%计算输出子函数:它根据t,x,u计算系统functionsys=mdlOutputs(t,x,u)sys=[];%sys表示输出y,用户应在此子函数中给出系统的输出方程%mdlGetTimeOfNextVarHit%计算下一个采样点子函数:此子函数仅在系统是变采样时间时调用functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;%设置采样时间sys=t+sampleTime;%sys表示下一个采样时间点%mdlTerminate%仿真结束子函数:仿真结束时调用,用户可以在此完成结束仿真所需的必要工作functionsys=mdlTerminate(t,x,u)sys=[];242.m文件S-函数的模块化在动态系统设计、仿真与分析中,用户可以使用Function&Tables模块库中的S-function模块来
本文标题:《控制系统数字仿真与cad》第9章Simulink的扩展工具S-函数
链接地址:https://www.777doc.com/doc-3921678 .html