S函数M文件matlab示范详解教程
- 格式:pdf
- 大小:107.38 KB
- 文档页数:3
S函数的简介及编写摘自恒润科技S-function的编写1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。
在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。
2. S函数模板的相关基础:1)M文件S函数的引导语句为:xtflagfuFunction[psysxstrtsp,,12,...),,,0,],(,S函数默认的四个输入参数:t ,x ,u ,flagS函数默认的四个输出函数:sys ,x0 ,str ,ts各个参数的含义如下:T :代表当前的仿真时间,该输入决定了下一个采样时间;X :表示状态向量,行向量,引用格式:X(1),X(2)U :表示输入向量;Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值;Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x、X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ]Str :空矩阵,无具体含义;Ts :包含模块采样时间与偏差的矩阵。
[period, offset]当Ts为-1时,表示与输入信号同采样周期。
2)S函数工作方式:Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件与Sizes数组;Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。
Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间与主时间步的要求;Flag = 3时,调用mdlOutputs函数,计算S函数的输出;Flag = 4时,调用mdlGetTimeOfNextVarHit函数,计算下一个采样点的绝对时间,这个方法仅仅就是使用户在mdlInitializeSize 里说明一个可变的离散采样时间;Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。
function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)% SFUNTMPL 是M—文件S函数模板% 通过剪裁,用户可以生成自己的S函数,不过一定要重新命名%利用S函数可以生成连续、离散混合系统等,实现任何模块的功能%%M-文件S函数的语法为:%[SYS,X0,STR,TS]= SFUNC(T,X,U,FLAG,P1,。
,Pn)%% 参数含义:% t是当前时间% x是S函数相应的状态向量% u是模块的输入%flag是所要执行的任务%%FLAG 结果功能% -——-- -——--———-----—--———————--—----—-—--—----—-------—-% 0 [SIZES,X0,STR,TS]模块初始化% 1 DX 计算模块导数% 2 DS 更新模块离散状态% 3 Y 计算模块输出% 4 TNEXT 计算下一个采样时间点% 9 []结束仿真%%% 用户切勿改动输出参数的顺序、名称和数目%输入参数的数目不能小于1,这四个参数的名称和排列顺序不能改动% 用户可以根据自己的要求添加额外的参数,位置依次为第5,6,7,8,9等.% S函数的flag参数是一个标记变量,具有6个不同值,分别为0,1,2,3,4,9 % flag的6个值分别指向6个不同的子函数% flag所指向的子函数也成为回调方法(Callback Methods)switch flag,%初始化,调用“模块初始化"子程序%case 0,[sys,x0,str,ts]=mdlInitializeSizes;%连续状态变量计算,调用“计算模块导数”子函数%case 1,sys=mdlDerivatives(t,x,u);%更新,调用“更新模块离散状态”子函数%case 2,sys=mdlUpdate(t,x,u);%输出,调用“计算模块输出”子函数%case 3,sys=mdlOutputs(t,x,u);%计算下一时刻采样点,调用“计算下一个采样时刻点"子函数%case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);%结束,调用“结束仿真"子函数%case 9,sys=mdlTerminate(t,x,u);%其他的flag%otherwiseDAStudio.error(’Simulink:blocks:unhandledFlag', num2str(flag));end% end sfuntmpl%============================================================= ================%“模块初始化”子函数% 返回大小、初始条件和样本function [sys,x0,str,ts]=mdlInitializeSizes%调用simsizes函数,返回规范格式的sizes构架% 这条指令不要修改sizes = simsizes;% 模块的连续状态个数,0是默认值%用户可以根据自己的要求进行修改sizes.NumContStates = 0;%模块的离散状态个数,0是默认值%用户可以根据自己的要求进行修改sizes.NumDiscStates = 0;% 模块的输出个数,0是默认值% 用户可以根据自己的要求进行修改sizes.NumOutputs = 0;%模块的输入个数,0是默认值% 用户可以根据自己的要求进行修改sizes。
MATLAB S-Function是一种特殊的M文件函数,用于创建自定义的Simulink模块。
它允许用户编写自己的Simulink块,以扩展Simulink的功能和适应特定的应用需求。
在MATLAB中,S-Function通过定义M文件和一组参数来实现。
在使用MATLAB S-Function时,参数起着至关重要的作用。
参数用于在S-Function和Simulink模型之间进行数据传递和通信。
它们可以控制S-Function的行为,影响模型的仿真结果,以及改变模型的外部接口。
了解和熟练使用S-Function参数是使用MATLAB进行模型开发和仿真的重要技能。
接下来,我们将详细介绍MATLAB S-Function参数的使用方法和技巧,帮助用户更好地理解和应用S-Function。
一、S-Function参数的作用S-Function参数是S-Function的输入和输出。
它们可以用于以下几个方面:1. 控制S-Function的行为。
通过设置参数来开启或关闭某些功能,调整模型的参数等。
2. 设置S-Function的输入和输出端口。
参数可以指定输入和输出端口的数量、名称、类型等。
3. 传递数据到S-Function中。
参数可以作为S-Function的输入,传递数据到S-Function中,影响S-Function的行为和输出结果。
4. 从S-Function中获取数据。
参数可以作为S-Function的输出,将S-Function的计算结果返回给Simulink模型其他部分使用。
二、S-Function参数的定义和声明在编写S-Function时,首先需要定义和声明参数。
通常,参数的定义和声明是在S-Function的初始化函数中完成的。
以下是一个简单的示例:```matlabfunction [sys,x0,str] = sfun(t,x,u,flag,param1,param2,param3) switch flagcase 0 Initialization[sys,x0,str] = mdlInitializeSizes(param1,param2,param3);case 3 Outputssys = mdlOutputs(t,x,u,param1,param2,param3);case {1, 2, 4, 9} Unused flagssys = [];otherwiseerror(['Unhandled flag = ',num2str(flag)]); endendfunction [sys,x0,str,ts] = mdlInitializeSizes(param1,param2,param3) Initialize the state xx0 = 0;sys = 0;Return the details of the S-functionsizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 1;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);str = [];ts = [0 0];endfunction sys = mdlOutputs(t,x,u,param1,param2,param3)Compute the output of the S-functiony = u(1) + param1 * u(1) + param2 * u(1)^2 + param3 * u(1)^3; sys = y;end```在上面的例子中,我们定义了三个参数param1、param2和param3,并在初始化函数和输出函数中使用了这些参数。
matlab中s函数编写心得函数是system Function的简称,用它来写自己的simulink模块。
(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用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函数的结构。
它的第一行是这样的:function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys 输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag,%判断flag,看当前处于哪个状态case0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的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*ux(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;其他的可以不变。