您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > s函数说明书(自编)
付振虎自用1、s函数的应用S函数,即Systemfunction系统函数的简称,是指采用非图形化语言(即计算机语言,而非SIMULINK系统模块)的方式描述功能模块,是强有力的SIMULINK扩展工具。用户可以通过MATLAB语言、C语言、C++语言、FORTRAN、Ada等语言编写S函数,来定义SIMULINK的特殊功能模块。而用c或c++等语言写的s函数还可以实现对硬件端口的操作,并且可处理除了double之外的数据类型、复数输入、矩阵输入等,但是需要编译连接执行,耗费较多的开发时间(后面只就M文件的S函数进行说明)。S函数用特殊的调用规则来与SIMULINK的内部解算器进行交互,使得S函数功能模块与SIMULINK的内置模块极为相似,可以适用于连续系统、离散系统和混合系统中。使用S函数可以建立一个通用的仿真模块,并可以在仿真模型中多次调用该模块,在使用时只需根据不同仿真要求改变该模块的参数即可。S-Function模块是一个“单输入单输出”模块。(对于多个输入输出可以用Demux模块来进行组合。)S函数有两种类型:一种是用matlab语言编写的M文件形式,另一种是C语言、C++语言、FORTRAN、Ada等语言编写的MEX文件形式。M文件形式有两种,Lev1和Lev2两种。以下是几种形式的对比。注:Lev1和Lev2形式的S函数的包装模块是不同的。表一各种S函数对比类型优点缺点M文件Lev1运行速度快,能处理矩阵数据,只能处理点数据,不能处理复数以及基于帧的数据Lev2能够处理的数据类型多。包括矩阵、复数、及基于帧的数据处理。运行速度慢MEX文件具有最快的执行速度,能够处理复数数据,可以对硬件端口进行操作对矩阵类型的数据处理能力有点力不从心对于下文中提到的S函数,只是指Lev1型的M文件。2、s函数模块S-Function模块,位于SIMULINK/User-DefinedFunctions模块库中,是使S函数图形化的模板工具,为S函数创建一个定制的对话框和图标。付振虎自用图1s函数模块的属性S-Function模块使得对S函数外部输入参数的修改更加灵活,可以看作是S函数的一个“外壳”或者“面板”。S-Function模块及其参数设置窗口如图1所示。该模块的参数设置方法如下:S-functionname:填入S函数的函数名称,这样就建立了S-Function模块与M文件形式的S函数之间的对应关系,点击后面的“Edit”按钮可以打开S函数的M文件的编辑窗口。S-functionparameters:填入S函数需要输入的外部参数的名称,如果有多个变量的话,中间用逗号隔开(如:a,b,c)。注:此外部参数就是后面主程序中输入参量的数值,应该注意其顺序与s主函数命名时的顺序一致。也可以使用SIMULINK中的masking工具将模块封装,这样就可以直观的填写这些外部参数。S-functionmodules:只有S函数是用C语言编写并用MEX工具编译的CMEX文件时,才需要填写该参数。设置完这些参数后,S-Function模块就成为了一个具有指定功能的模块,他的功能取决于S函数的内容,也可以通过修改S函数来改变该模块的功能。由此可见,S函数编写就成了构建特殊功能模块的重要一环。下面将详细介绍SIMULINK的仿真流程和S函数的设计方法。付振虎自用3、s函数的计算流程S函数为SIMULINK中的一个模块,其运算过程符合SIMULINK模块的仿真过程。下面介绍SIMULINK一般模块的仿真流程。3.1SIMULINK仿真流程SIMULINK中的任何模块,包括S-Function模块,都有一个共同的特征:一个输入向量U,一个状态向量X和一个输出向量Y,如下图所示。状态向量可能包含连续状态、离散状态或者前两者的混合状态。U、X和Y之间的数学关系可以用式(1)表示。图2SIMULINK仿真模型10'(,,)(,,)(,,)kcdduyftxuxftxuxftxu+===(输出)(导数)(更新)(1)其中,dcxxx+=。SIMULINK可将状态向量分为两部分:第一部分为连续状态cx,第二部分为离散状态dx。没有状态的模块,其状态量x是一个空的向量。SIMULINK在每个仿真步长中把方程(1)对应为不同的仿真阶段,它们分别是计算模块的输出、更新离散变化量或计算连续状态的微分。在仿真的开始和结束时,还包括初始化阶段和结束仿真阶段。仿真过程中的具体流程如图3所示。从该流程图可以看出,仿真启动后,SIMULINK首先模型进行初始化,在这个阶段主要完成模型中所有模块的具体化、传播采样时间和数据类型、对各模块的各种参数进行赋值并对模块进行排序等操作,初始化阶段还没有进入仿真循环阶段,是进入仿真循环阶段的准备工作。初始化完成后,进入仿真循环阶段,在仿真循环的每个阶段,SIMULINK会按照在初始化阶段确定的模块顺序执行模块。对于离散状态,会更新当前时刻的离散状态并进行输出;对于连续时间则处理起来比较复杂,他会计算两次输出,这两次输出会在求解器当中进行一致性检查,当超过求解器设置得容限时,求解器会以一个更小的步长进行计算输出,而且在连续时间状态下存在一个过零检测的问题,记载仿真循环当中如果检测到过零点,SIMULINK系统会自动在此过零点周围进行插值。X(状态)U(输入)Y(输出)付振虎自用图3SIMULINK仿真流程图仿真过程是有求解器和SIMULINK系统交互控制的,他们之间的关系可以有图4进行说明:步长、输入量、状态量输出量、导数解算器*确定采样时间*状态量求积分*传递模块输出量SIMULINK系统*模块输出*状态量求微分*状态量更新*过零点检测图4解算器与SIMULINK相互交互的关系3.2s函数仿真流程S函数包括主函数和6个功能子程序,包括初始化、连续状态微分、离散状态更新、模块输出、计算下次采样时刻和仿真结束。同时,这6个子程序也是S函数仿真流程中的不同的阶段,并且每个阶段对应不同的Flag值(仿真流程标志向量)。在SIMULINK仿真过程中,利用switch-case语句,根据Flag的值的不同调用S函数不同的子程序,来完成对S函数模块仿真流程的控制(通常必须处理flag0、3、9子程序)。S函数仿真流程中各阶段的名称及对应的子程序和初始化模块计算下一步的采样步长计算输出更新离散状态量计算微分值计算输出值计算微分值寻找过零点积分(积分微步)在最后一步时清除仿真循环付振虎自用Flag值如图5所示。由流程图可知,S函数的仿真流程图和SIMULINK的仿真流程图十分类似,都包含初始化、仿真结束、以及仿真循环部分(包括微分计算、更新离散状态、计算输出和计算下一个采样时间)。初始化模块计算下一个采样时间(只用于变采样时间模块)计算输出是否是连续系统计算微分值更新离散状态量仿真结束NYFlag=0mdlInitializeSizesFlag=4mdlGetTimeOfNextVarHitFlag=3mdlOutputsFlag=2mdlUpdateFlag=1mdlDerivatiFlag=9mdlTerminate图5S函数的仿真流程4、S函数的结构S函数格式非常严格,在SIMULINK中有一个模板M文件,使用时可以在此模板上简单修改进行使用。此模板M文件(存放于toolbox/simulink/blocks中)由主函数以及6个子函数(不同flag值调用的函数)组成。下面分别就主函数和子函数进行解释。注:模板文件只是Simulink为方便用户而提供的一种参考格式,并不是编写s-function的语法要求,用户完全可以改变子函数的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方便,而且条理清晰。4.1主函数function[sys,x0,str,ts,simStateCompliance]=sfuntmpl(t,x,u,flag)%sys,x0,str,ts为输出参量,不可变更顺序或名称。%sys为一个通用的返回参数,返回值取决于flag的值,变化由SIMULINK自动完成。%例如:flag=0返回7个初始设定值,flag=3则返回包含s函数的输出%当FLAG=0,以下信息必须赋值回传。%SYS(1)=连续状态量的个数%SYS(2)=离散状态量的个数%SYS(3)=输出量的个数付振虎自用%SYS(4)=输入量的个数%注:以上任何SYS变量的前四个值都可以赋值为-1,来表示他们他们是动态的值%SYS(5)=保留值.必须为0%SYS(6)=直接贯通标志(1=yes,0=no).如果U在flag=3和%flag=4时被子函数直接调用表明S函数是直接贯通的,赋值%为1;反之为0.如果没有按规则赋值,将会出现不可预知的错%误。%SYS(7)=采样时间值个数.它是TS矩阵的行数%注:flag=0的SYS值会在子函数中以sys=simsizes(sizes)函数赋值。%x0初始状态值。若没有状态量赋值为空[],除flag=0外,都会被忽略%strs函数保留参数,一般设定为空[].%ts一个n*2的矩阵。两列分别为采样时间间隔和偏移量。%其固定赋值如下%TS=[00,:连续采样时间.用于具有连续状态和/或非过零%采样的S-function。对于这种类型的%S-function,其输出在每个微步上变化。%01,:连续但微步长固定采样时间。用于需要在每一%个主仿真步上执行,但在微步长(第一个仿真%微步)内值不发生变化的S-function%采样时间间隔偏移量:用来自定义产生采样时间序列。其中采样时间%间隔需大于零,偏移量应小于采样时间间隔(连%续但微步长固定采样时间除外)%-20;:变步长离散采样时间,flag=4的子函数用来决%定下一个采样时间。%-10]:继承采样时间。有时,S-function块没有专%门的采样时间特性(即,它既可以是连续的也可%以是离散的,取决于系统中其它块的采样时间)。%你可以指定这种块的采样时间为inherited%(继承)。比如,一个增益块就是继承采样时间%的例子,它从其输入块继承采样时间。一个块%可以从以下几种块中继承采样时间:%*输入块%*输出块%*系统中最快的采样时间%注:若采样继承采样采样时间,而且希望在微步内不变化,应%设TS=[-1,1]%例如,如果你希望你的S-function在每个时间步(连续采样时间)都运行,%则应设置为[0,0];如果你希望你的S-function按照其所连接块的速率来运%行,则应设置为[-1,0];如果你希望它在仿真开始的0.1秒后每0.25秒(离%散采样时间)运行一次,则应设置为[0.25,0.1]。你可以创建一个%S-function按照不同的速率来执行不同的任务(如:一个多速率%S-function)。在这种情况下,ts应该按照采样时间升序排列来指定%S-function所需使用的全部采样速率。例如,假设你的S-function每0.25%秒执行一个任务,同时在仿真开始的0.1秒后每1秒执行另一个任务,那么你付振虎自用%的S-function应设置ts为[0.25,0;1.0,0.1]。这将使Simulink按%照这样的时间序列来执行S-function:[0,0.1,0.25,0.5,0.75,1,%1.1,...]。你的S-function必须确定在每一个采样时间点执行哪一个任务。%你也可以一个S-function来连续地执行一些任务(如:在每个时间步),%同时按照离散间隔时间执行另一些任务。%%t,x,u,flag为输入参量,后面可以加自定义的输入参量%t代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采%样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。%x表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是如此。它具%有很灵活的运用。%u表示输入变量%S函数中要用到的自定义参数,例如sfuntmpl(t,x,u,flag,f1,f2……)。Sfuntmpl为m%函数的名称,可以自己定义,最好和m文件名同名。%%%以下是
本文标题:s函数说明书(自编)
链接地址:https://www.777doc.com/doc-4274946 .html