matlab中s函数编写心得(转).doc_第1页
matlab中s函数编写心得(转).doc_第2页
matlab中s函数编写心得(转).doc_第3页
matlab中s函数编写心得(转).doc_第4页
matlab中s函数编写心得(转).doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

matlab中s函数编写心得(转)Part I: 所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab、C、C+、Fortran、Ada等语言来写, 这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单) 先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c+等语言写的s函数还可以实现对硬件端口的操作, 还可以操作windows API等 先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段: 一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、 采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、 计算连续状态等等,这个阶段需要反复运行,直至结束. 在matlab的workspace里输入edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构.1. 函数的函数头函数的第一行:function sys,x0,str,ts=sfuntmpl(t,x,u,flag) , 先讲输入与输出变量的含义: t是采样时间, x是状态变量, u是输入(是做成simulink模块的输入), flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等) sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义), x0是状态变量的初始值, str是保留参数(mathworks公司还没想好该怎么用它, 一般在初始化中将它置空就可以了, str=), ts是一个12的向量, ts(1)是采样周期, ts(2)是偏移量 2. 函数分析下面结合sfuntmpl.m中的代码来讲具体的结构: switch flag, %判断flag,看当前处于哪个状态 case 0, sys,x0,str,ts=mdlInitializeSizes; / 解释说明 flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第149行定义. 其中的参数sys是一个结构体,它用来设置模块的一些参数,各个参数详细说明如下 size = simsizes;%用于设置模块参数的结构体用simsizes来生成 sizes.NumContStates = 0; %模块连续状态变量的个数 sizes.NumDiscStates = 0; %模块离散状态变量的个数 sizes.NumOutputs = 0; %模块输出变量的个数 sizes.NumInputs = 0; %模块输入变量的个数 sizes.DirFeedthrough = 1; %模块是否存在直接贯通 sizes.NumSampleTimes = 1; %模块的采样时间个数, 至少是一个 sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*u x(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k) y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u 设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一块用, 我这儿是为了方便说明):sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1; 其他的可以不变, 继续在mdlInitializeSizes函数中往下看: x0 = ; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=0,0(离散和连续的状态变量我们都设它初值为0) str = ; %保留参数, 置就可以了, 没什么用ts = 0 0; %采样周期设为0表示是连续系统, 如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍 case 1, sys=mdlDerivatives(t,x,u); /flag=1表示此时要计算连续状态的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193行的函数mdlDerivatives, 如果设置连续状态变量个数为0, 此处只需sys=就可以了, 按我们上述讨论的那个模型, 此处改成 sys=fc(t,x(1),u)或sys=A*x(1)+B*u, 我们这儿x(1)是连续状态变量, 而x(2)是离散的, 这儿只用到连续的, 此时的输出sys就是微分case 2, sys=mdlUpdate(t,x,u); /flag=2表示此时要计算下一个离散状态, 即上面提到的x(k+1)=fd(t,x,u), 找到mdlUpdate函数, 它这儿sys=表示没有离散状态, 我们这儿可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)case 3, sys=mdlOutputs(t,x,u);/flag=3表示此时要计算输出, 即y=fo(t,x,u), 找到218行的mdlOutputs函数. 如果sys=表示没有输出, 我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出ycase 4, sys=mdlGetTimeOfNextVarHit(t,x,u); /flag=4表示此时要计算下一次采样的时间, 只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0), 连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=. 这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfunc看vsfunc.m这个例子case 9, sys=mdlTerminate(t,x,u);/ flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=就可, 如果你在结束时还要设置什么,就在此函数中写完了. Part II此外, s函数还可以带用户参数, 下面给个例子, 它和simulink下的gain模块功能一样function sys,x0,str,ts = sfungain(t,x,u,flag,gain) switch flag, case 0, sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 1; sizes.NumInputs = 1; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0=; str=; ts=0,0; case 3, sys=gain*u; case 1,2,4,9, sys = ; end 做好了s函数后, simulink - user-defined function下拖一个S-Function到你的模型, 就可以用了. 在simulink - user-defined function还有个s-Function Builder, 他可以生成用c语言写的s函数. 或者在matlab的workspace下打sfundemos, 可以看到很多演示s函数的程序Part IIISIMULINK s-function的设计 Simulink为用户提供了许多内置的基本库模块, 通过这些模块进行连接而构成系统的模型. 对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块, 但它依然是基于Simulink原来提供的内置模块. 而Simulink s-function是一种强大的对模块库进行扩展的新工具.(一) s-function的概念 s-function是一个动态系统的计算机语言描述, 在MATLAB里, 用户可以选择用m文件编写, 也可以用c或mex文件编写, 在这里只给大家介绍如何用m文件编写s-function. S-function提供了扩展Simulink模块库的有力工具, 它采用一种特定的调用语法, 使函数和Simulink解法器进行交互. S-function最广泛的用途是定制用户自己的Simulink模块. 它的形式十分通用, 能够支持连续系统、离散系统和混合系统.(二) 建立m文件s-function 1. 使用模板文件:sfuntmp1.m, 其格式为sys,x0=function(t,x,u,flag). 该该模板文件位于MATLAB根目录下toolbox/simulink/blocks目录下 模板文件里s-function的结构十分简单, 它只为不同的flag的值指定要相应调用的m文件子函数. 比如当flag=3时, 即模块处于计算输出这个仿真阶段时, 相应调用的子函数为sys=mdloutputs(t,x,u). 模板文件使用switch语句来完成这种指定, 当然这种结构并不唯一, 用户也可以使用if语句来完成同样的功能. 而且在实际运用时, 可以根据实际需要来去掉某些值, 因为并不是每个模块都需要经过所有的子函数调用.模板文件只是Simulink为方便用户而提供的一种参考格式, 并不是编写s-function的语法要求, 用户完全可以改变子函数的名称, 或者直接把代码写在主函数里, 但使用模板文件的好处是, 比较方便, 而且条理清晰. 使用模板编写s-function, 用户只需把s-函数名换成期望的函数名称, 如果需要额外的输入参量, 还需在输入参数列表的后面增加这些参数, 因为前面的4个参数是simulink调用s-function时自动传入的. 对于输出参数, 最好不做修改. 接下去的工作就是根据所编s-function要完成的任务, 用相应的代码去替代模板里各个子函数的代码即可. Simulink在每个仿真阶段都会对s-function进行调用. 在调用时, Simulink会根据所处的仿真阶段为flag传入不同的值, 而且还会为sys这个返回参数指定不同的角色. 也就是说尽管是相同的sys变量, 但在不同的仿真阶段其意义却不相同, 这种变化由simulink自动完成.m文件s-function可用的子函数说明如下: mdlInitializeSizes(flag=0) - 定义s-function模块的基本特性, 包括采样时间、连续或者离散状态的初始条件和sizes数组 mdlDerivatives(flag=1) - 计算连续状态变量的微分方程 mdlUpdate(flag=2) - 更新离散状态、采样时间和主时间步的要求 mdlOutputs(flag=3) - 计算s-function的输出 mdlGetTimeOfNextVarHit(flag=4) - 计算下一个采样点的绝对时间, 这个方法仅仅是在用户在mdlInitializeSizes 里说明了一个可变的离散采样时间 概括说来, 建立s-function可以分成两个分离的任务: 第一, 初始化模块特性包括输入输出信号的宽度, 离散连续状态的初始条件和采样时间. 第二, 将算法放到合适的s-function子函数中去。2. 定义s-function的初始信息 为了让Simulink识别出一个m文件是s-function, 用户必须在s-函数里提供有关s-函数的说明信息, 包括采样时间、连续或者离散状态个数等初始条件. 这一部分主要是在mdlInitializeSizes子函数里完成. Sizes数组是s-function函数信息的载体, 它内部的字段意义为: NumContStates(sys(1):连续状态的个数(状态向量连续部分的宽度) NumDiscStates(sys(2):离散状态的个数(状态向量离散部分的宽度) NumOutputs(sys(3): 输出变量的个数(输出向量的宽度) NumInputs(sys(4):输入变量的个数(输入向量的宽度) DirFeedthrough(sys(5):有不连续根的数量 NumSampleTimes(sys(6):采样时间的个数,有无代数循环标志 如果字段代表的向量宽度为动态可变, 则可以将它们赋值为1. 注意DirFeedthrough是一个布尔变量, 它的取值只有0和1两种, 0表示没有直接馈入, 此时用户在编写mdlOutputs子函数时就要确保子函数的代码里不出现输入变量u; 1表示有直接馈入. NumSampleTimes表示采样时间的个数, 也就是ts变量的行数, 与用户对ts的定义有关. 需要指出的是, 由于s-function会忽略端口, 所以当有多个输入变量或多个输出变量时, 必须用mux模块或demux模块将多个单一输入合成一个复合输入向量或将一个复合输出向量分解为多个单一输出.3. 输入和输出参量说明 S-function默认的

温馨提示

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

最新文档

评论

0/150

提交评论