




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、付振虎lj用1、S函数的应用S函数,即Systemfunction系统函数的简称,是指采用非图形化语言(即计算机语言,而非SIMULINK系统模块)的方式描述功能模块,是强有力的SIMULINK扩展工具。用户可以通过MATLAB语言、C语言、C卄语言、FORTRANAda等语言编写S函数,來定义SIMULINK的特殊功能模块。而用c或c卄等语言写的s函数还可以实现对硬件端口的操作,并且可处理除了double之外的数据类型、复数输入、矩阵输入等,但是需要编译连接执行,耗费较多的开发时间(后面只就M文件的S函数进行说明)。S函数用特殊的调用规则來与SIMULINK的内部解算器进行交互,使得S函数功
2、能模块与SIMULINK的内置模块极为相似,可以适用丁连续系统、离散系统和混合系统中。使用S函数可以建立一个通用的仿真模块,并可以在仿真模型中多次调用该模块,在使用时只需根据不同仿真耍求改变该模块的参数即可。S-Function模块是一个“单输入单输出”模块。(对丁多个输入输出可以用Demux模块来进行组合。)S函数有两种类型:一种是用matlab语言编写的M文件形式,另一种是C语言、C+十语言、FORTRANAda等语言编写的MEX文件形式。M文件形式有两种,Levi和Lev2两种。以下是儿种形式的对比。注:Levi和Lev2形式的S函数的包装模块是不同的。表一各种S函数对比类型优点缺点M文
3、件Levi运行速度快,能处理矩阵数据,只能处理点数据,不能处理复数以及基丁帧的数据Lev2能够处理的数据类型多。包括矩阵、复数、及基丁帧的数据处理。运行速度慢MEX文件具有最快的执行速度,能够处理复数数据,可以对硬件端口进行操作对矩阵类型的数据处理能力有点力不从心对丁下文中提到的S函数,只是指Levi型的M文件。2、s函数模块S-Function模块,位丁SIMULINK/User-DefinedFunctions模块库中,是使S函数图形化的模板工具,为S函数创建一个定制的对话框和图标。WSir.uD色pEnter86arenternLtJ注sSearchReeuns:-none.Lbrary
4、:SirruInJLger-3&finedFundtons勺輛Snulnk?CommonlyUsoStocks:ContinuousD3contrute-DtaCreteLogieand5KOperat)nsLookupTabbsI4sth0paraton8-Hoc?verrc3tionMcxJeUVvkJeUtkbsPr&Sjbsy鲨cf3SignalAttroitesSignalRouting-SinksS-urctionuntileaAS-CurdionExamplesx.yor厘S-FunsiorSuilciwWFunctionBlockPammeters:SFinno”5-Fun*t
5、:onZ-.SourcesUsjer-CefiiedFunctions-AddtonaVa:h6DcreleAe*-32pac8bck2:Corunc3:onsStockse:ControlSystemToolboxDataAccursrionoolbox”导EDA5muatorunfcDSBccDescrotonSimulinkfUscr-inC.Mickl).x.uend伽an-rfl-fl-nr*rrsh怙ShowrgSrnuindFuicEditulowSirrpntcriS-rjrctionReadyVser-definableolccZ2ndsu:tconferstoS-funct
6、ionztxrdArcz.aut:zatic2;-ytotnaS-lunctionbrSpari=*T*r:m*S-funet:onparzxaTCY:rBlockscantebitteninC:H(levtl-iFortran:andZda.h.Ujandflssarcar:pcc:rrnavarxablcz:ulxnxYouaid.:r:ncS-fun*tienD:oscreaulresadJltlona:scurcefilesfortreTorkshoobuildorceeBS.soeclfrthmfllenaaeBInthm1S-functionBOdJies,field,-nterr
7、i:enaae5cnly;donotuseezterftionftoxfullpathnazes-e.g.snterArcarcXJnetArc.cszcl.c*?ara-itcrz100%虫”Lyode45图1s函数模块的屈性S-Function模块使得对S函数外部输入参数的修改更加灵活,可以看作是S函数的一个“外壳”或者“面板”。S-Function模块及其参数设置窗口如图1所示。该模块的参数设置方法如下:Sfunctionname:填入S函数的函数名称,这样就建立了S-Function模块与M文件形式的S函数之间的对应关系,点击后面的“Edit”按钮可以打开S函数的M文件的编辑窗口。Sf
8、unctionparameters:填入S函数需耍输入的外部参数的名称,如果有多个变量的话,中间用逗号隔开(如:a,b,c)。注:此外部参数就是后面主程序中输入参量的数值,应该注意其顺序与s主函数命名时的顺序一致。也可以使用SIMULINK中的masking工具将模块封装,这样就可以直观的填写这些外部参数。S-functionmodules:只有S函数是用C语言编写并用MEX工具编译的CMEX文件时,才需耍填写该参数。设置完这些参数后,S-Function模块就成为了一个具有指定功能的模块,他的功能取决TS函数的内容,也可以通过修改S函数來改变该模块的功能。由此可见,S函数编写就成了构建特殊功
9、能模块的重要一环。下面将详细介绍SIMULINK的仿真流程和S函数的设计方法。3、s函数的计算流程S函数为SIMULINK中的一个模块,其运算过程符合SIMULINK模块的仿真过程。下面介绍SIMULINK一般模块的仿真流程。3.1SIMULINK仿真流程SIMULINK中的任何模块,包括S-Function模块,都有一个共同的特征:一个输入向量U,个状态向量X和一个输出向量Y,如下图所示。状态向量可能包含连续状态、离散状态或者前两者的混合状态。U、X和Y之间的数学关系可以用式(1)表示。U(输入)(状态)Y(输出)付振虎lj用付振虎lj用图2SIMULINK仿真模型(1)y=f0(t,x,u
10、)(输出)=(导数)叽=加,3)(更新)其中,兀=兀+心。SIMULINK可将状态向量分为两部分:第一部分为连续状态兀,第二部分为离散状态没有状态的模块,其状态量是一个空的向量。SIMULINK在每个仿真步长中把方程(1)对应为不同的仿真阶段,它们分别是计算模块的输出、更新离散变化量或计算连续状态的微分。在仿真的开始和结束时,还包括初始化阶段和结束仿真阶段。仿真过程中的具体流程如图3所示。从该流程图可以看出,仿真启动后,SIMULINK首先模型进行初始化,在这个阶段主要完成模型中所有模块的具体化、传播采样时间和数据类型、对各模块的各种参数进行赋值并对模块进行排序等操作,初始化阶段还没有进入仿真
11、循环阶段,是进入仿真循环阶段的准备工作。初始化完成后,进入仿真循环阶段,在仿真循环的每个阶段,SIMULINK会按照在初始化阶段确定的模块顺序执行模块。对丁离散状态,会更新当前时刻的离散状态并进行输出;对丁连续时间则处理起来比较复杂,他会计算两次输出,这两次输出会在求解器当中进行一致性检査,当超过求解器设置得容限时,求解器会以一个更小的步长进行计算输出,而且在连续时间状态下存在一个过零检测的问题,记载仿真循环当中如果检测到过零点,SIMULINK系统会H动在此过零点周围进行插值。付振虎Il用付振虎lj用初始化模块图3SIMULINK仿真流程图仿真过程是有求解器和SIMULINK系统交互控制的,
12、他们之间的关系可以3.2s函数仿真流程S函数包括主函数和6个功能子程序,包括初始化、连续状态微分、离散状态更新、模块输出、计算下次采样时刻和仿真结束。同时,这6个子程序也是S函数仿真流程中的不同的阶段,并且每个阶段对应不同的Flag值(仿真流程标志向量)。在SIMULINK仿真过程中,利用switch-case语句,根据Flag的值的不同调用S函数不同的子程序,来完成对S函数模块仿真流程的控制(通常必须处理flag。、3、9子程序)。S函数仿真流程中各阶段的名称及对应的子程序和Flag值如图5所示。由流程图可知,S函数的仿真流程图和SIMULINK的仿真流程图十分类似,都包含初始化、仿真结束、
13、以及仿真循环部分(包括微分计算、更新离散状态、计算输出和计算下一个采样时间)。Flag=lmdIDcrivatiFlag=OmdllnitializeSizesFlag=4mdlGctTimeOfNextVarHitFlag=3mdlOutputsFlag=2mdlUpdatcFlag=9mdlTerminate图5S函数的仿真流程4、S函数的结构S函数格式非常严格,在SIMULINK中有一个模板M文件,使用时可以在此模板上简单修改进行使用。此模板M文件(存放J:toolbox/smiuliiik/blocks中)由主函数以及6个子函数(不同flag值调用的函数)组成。下面分别就主函数和子函数
14、进行解释。注:模板文件只是Simulmk为方便用户而提供的一种参考格式,并不是编写s-finiction的语法要求,用户完全可以改变子函数的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方便,而且条理清晰。4.1主函数functionsys,xO,str,ts,simStateCompliance=sfuntmpl(t,x,u,flag)%sySzxO/Str,ts为输出参量,不可变更顺序或劣称。%sys为一个通用的返回参数,返回值取决于flag的值,变化由SIMULINK自动完成。%例如:flag=0返回7个初始设定值,lag=3则返回包含s函数的输出%当FLAG=0,以下信
15、息必须赋值回传。%SYS(l)=连续状态量的个数%SYS(2)=离散状态量的个数%SYS(3)=输出量的个数%SYS(4)=输入虽:的个数%注:以上任何SYS变量的前四个值都可以赋值为-1,来表示他们他们是动态的值%SYS(5)=保留值.必须为0%SYS(6)=直接贯通标志(1=yes,0=no).如果U在flag=3和%flag=4时被子函数直接调用表明S函数是直接贯通的,赋值%为I;反之为0.如果没有按规则赋值,将会出现不可预知的错%误。%SYS(7)=采样时间值个数.它是TS矩阵的行数%注:flag=O的SYS值会在子函数中以sys=simsizes(sizes)函数赋值。%xO初始状态
16、值。若没有状态量赋值为空,除f1ag=O外,都会被忽略%strs函数保留参数,一般设定为空.%其固定賦值如下%TS=00,%0lz%采样时间间隔偏移量%-20;%-10%ts一个n*2的矩阵。两列分别为采样时间间隔和偏移量。:连续采样时间.用于具有连续状态和/或非过零采样的S-function。对于这种类型的S-function,其输出在每个微步上变化。:连续但微步长固立采样时间。用于需要在每一个主仿真步上执行,但在微步长(第个仿真微步)内值不发生变化的S-function:用来自泄义产生采样时间序列。其中采样时间间隔需大于零,偏移屋应小于采样时间间隔(连续但微步长固定采样时间除外):变步长离
17、散采样时间,flag=4的子函数用来决定下一个采样时间。:继承采样时间。有时,S-function块没有专门的采样时间特性(即,它既可以是连续的也可以是离散的,取决于系统中其它块的采样时间)。你可以指定这种块的采样时间为inherited(继承)。比如,一个增益块就是继承采样时间%的例子,它从其输入块继承采样时间。一个块%可以从以下几种块中继承采样时间:%*输入块%*输出块%*系统中最快的采样时间%注:若采样继承采样采样时间,而且希望在微步内不变化,应%设TS=-1Z1%例如,如果你希望你的S-function在每个时间步(连续采样时间)都运行,%则应设置为0,0:如果你希望你的S-funct
18、ion按照其所连接块的速率来运%行,则应设置为-1,0:如果你希望它在仿真开始的0.丄秒后每0.25秒(离%散采样时间)运行一次,则应设置为0.25,0.1.你可以创建一个%S-function按照不同的速率来执行不同的任务(如:一个多速率%S-function)。在这种情况下,ts应该按照采样时间升序排列来指定%S-function所需使用的全部采样速率。例如,假设你的S-function每0.25%秒执行一个任务,同时在仿真开始的0.1秒后每1秒执行另一个任务,那么你%的S-function应设置ts为0.250;1.0,0.1这将使Simulink按%照这样的时间序列来执行S-funct
19、ion:0,0.1,0.25,0.5,0.75,1,%1.1.你的S-function必须确定在每一个采样时间点执行哪一个任务。%你也可以一个S-function来连续地执行一些任务(如:在每个时间步),%同时按照离散间隔时间执行另一些任务。%t,x,uzflag为输入参量,后面可以加自定义的输入参虽:%t代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采%样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。%x表示状态向虽:,这个参数是必须的,甚至在系统中不存在状态时也是如此。它具%有很灵活的运用。%u表示输入变量咎S函数中要用到的自定义参数,例tosfuntm
20、pl(t,x,u,flag,f1,f2)。Sfuntmpl为m*函数的名称,可以自己定义,最好和m文件名同名。%以下是S函数的主函数%switchflag,咎模板文件使用的是switch语句来完成对子函数标志的指定,这种结构并不唯一,可以使用殆if语句完成相同的指令,并且可以根据实际需要来去掉某些值,因为并不是每个模块都需要咎经过所有的子函数调用。%初始化%case0,sys,x0zstr,tszsimStateCompliance=mdlInitializeSizes;%计算连续状态导数%case1zsys=mdlDerivatives(tzxzu);%更新离散状态量%case2Zsys=m
21、dlUpdate(tzxzu);%计算输出%case3/sys=mdlOutputs(t,x,u);%计算下一步采样时刻%付振虎lj用付振虎lj用%case4,sys=mdlGetTimeOfNextVarHit(tzxzu);%结朿仿真%case9,sys=mdlTerminate(t,x,u);%咎未知的fXg值%otherwiseDAStudio.error(Simulink:blocks:unhandledFlag1,num2str(flag);end%S函数主程序结束4.2子函数%=%mdllnitializeSizes%返回S函数的sizes.初始参数和采样时间%functions
22、ysxOstr/ts,simStateCompliance=mdlInitializeSizes%利用simsizes函数为sizes结构赋值,然后填写其每个的数值%simsizes函数是S函数模块内部特有的。他的结构基及代码是固定的。sizes=simsizes;sizesNumContStates=0;sizesNumDiscStates=0;sizesNumOutputs=0;sizesNumlnputs=0;sizesDirFeedthrough=1;sizesNumSampleTimes=1;sys=simsizes(sizes);%状态值初始化%xO=;%str总是为空%str=;
23、%咎连续状态量的个数咎离散状态量的个数咎输岀虽:的个数令输入量的个数殆直接贯通标示%釆样时间的个数,至少应该有一个采样时间付振虎自用付振虎lj用%初始化采样时间%=00;指定模块的simStateComliance值.此值从r2008版本后存在。允许的赋值为:默认值;warnandSamesimstate1UnknownSimState1,1DefaultSimState1,assumeDefaultSimStateasabuilt-inblock1HasNoSimState,Nosimstate1DisallowSimState1Erroroutvzhensavingorrestoringt
24、hemodel付振虎自用付振虎lj用simstatesimStateCompliance=1UnknownSimState;%mdlInitializeSizes子函数结束%=%mdlDerivatives%返回连续状态量的导数.%=%functionsys=mdlDerivatives(t,xzu)sys=;%mdlDerivctives子函数结束%=%mdlUpdate%更新离散状态,采样时间和主时间步的要求.%=%functionsys=mdlUpdate(tzx,u)sys=;%mdlUpdate子函数结束%=%mdlOutputs%计算并返回模块的输出量.%=%functionsys
25、=mdlOutputs(trx,u)sys=;%mdlOutputs子函数结束%=%mdlGetTimeOfNextVarHit%返回下一个采样时间.注意返回的结果是一个绝对时间。并且这个函数只能在采样时间TS%赋值为-20的时候应用。%mdllnitializeSizes社=%functionsys=mdlGetTimeOfNextVarHit(t,xzu)sampleTime=1;%举例。决怎下一个采样时间sys=t+sampleTime;%mcUGetTimeOfNextVarHit子函数结束%社=%mdlTerminate%仿真结朿.社=%functionsys=mdlTerminate(tzx,u)sys=;%mdlTerminate-Tlni付振虎自用付振虎lj用附IS函数自带实例子目录smiulii
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出租责任合同范本
- 买卖合同和定制合同范本
- 佣金类合同范本
- 电气控制PLC习题(含答案)
- 厂房检查合同范本
- 上海旅游心得体会
- 三年级第一学期语文教学计划
- 三八妇女节工会活动策划方案
- 亚克力板材合同范本
- 厂房带看合同范本
- 好习惯成就好人生
- 大学物理马文蔚版PPT
- 内蒙古自治区高层建筑工程结构抗震基本参数表(2022年版)
- FZ/T 07010-2021绿色设计产品评价技术规范针织服装
- 2023年北京市中学生数学竞赛高一年级复赛试题及解答
- 乙酰基乙烯酮(双烯酮;二乙烯酮;双乙烯酮)的理化性质及危险特性表
- 酒店机房巡视签到表
- API-650-1钢制焊接石油储罐
- 鼠疫演练脚本
- 变压器试验精品课件
- 危险化学品从业单位安全生产标准化宣贯
评论
0/150
提交评论