matlab中s-function的参数设置,初始化设置,中文介绍,例子详细
- 格式:pdf
- 大小:155.77 KB
- 文档页数:3
S-函数概述1、什么是S函数S函数(系统函数)提供一个有力的途径用于扩展Simulink仿真环境的能力。
S函数是用MATLAB、C、C++、Fortran编写的,用来描述Simulink模块。
C、C++、Fortran编写的用mex公用程式编译为MEX文件(具体参考building MEX-File).与其他的MEX文件一样,S 函数是一个MATLAB翻译器可以自动加载执行的动态链接子程序。
S函数使用一种特殊的调用语法条用S函数应用程序,使你们可以与仿真引擎交互。
这种交互同发生在引擎与仿真环境中的模块的交互相似。
S函数遵循一种通用的格式,可以兼容连续、离散和混合系统。
遵守一系列简单的规则,你们可以在S函数中实现算法并且将S函数模块添加到仿真模块中。
当你编写自己的S函数后,将其名字添加到S函数块(在用户定义函数模块库中可以找到),你可以使用masking(在Creating Custom Blocks 中可以查看)来定做用户界面。
你可以用实时Workshop产品使用S函数,你也可以通过编写目标语言编译器文件(TLC)来定制生成S函数的代码,可以查看(Integrating External Code With Generated C and C++)。
2、在建模中使用S函数A、兼容C MEX S函数或者旧版(MATLAB level-1)的S函数,从用户定义函数库拖动S 函数到模型中,然后指定S函数的名字(名字中包含了函数的信息),level-2的版本操作也一样(当路径中有同名的C MEX文件和MATLAB文件时,优选执行C MEX文件)。
B、向S函数传递参数:S函数块的“Parameters”文件允许指定参数值传递到相应的S 函数。
为了使用这些文件,必须知道S函数需要的参数、参数的顺序,如果不知道,可以咨询S函数的作者、文档或者源代码。
输入参数用逗号分开,按照S函数要求的顺序输入,参数的值可以是常数、变量名(定义在MATALB、建模工作空间或者MATALB表达式中)。
matlab函数以及simulink模块的使⽤---S-function⼀、simulink中S-function(S- function模块,位于 Simulink/User- Defined Functions模块库中)1、S- function属性窗⼝介绍(1)S- function name:S- functioni的名字,随便写,⾃⼰认识即可(2)S- function parameters:S- function的模块参数,默认为空(3)S-function modS- function的模块,⽆需修改,采⽤系统默认模块即可也就是说,这三个参数,只需要修改第⼀个参数为模块命名即可(4)点击Edit,可以进⼊S- function!的代码编辑界⾯2、S- function内部函数介绍(1)[sys, X0,str,ts]= functionName(t,x,u,flag)这是函数的总⼊⼝,收到信号后,⾸先进⼊这个函数.这个函数包含⼀个 switch语句,根据情况进⼊不同的⼦函数.(2)[sys, XO,str,ts, simstate Compliance]= mdllnitialize Sizes;S- function进⾏基本的设置,具体参数会在后⾯进⾏介绍。
相当于构造函数(3)sys= mdlDerivatives(t,x,u);该函数仅在连续系统中被调⽤,⽤于产⽣控制系统状态的导数(4)sys= mdlUpdate(t, x,u);该函数仅在离散系统中被词⽤,⽤于产⽣控制系统的下⼀个状态(5)sys= mdlOutputs(t, x,u);产⽣(传递)系统输出(6)sys= mdlGetTimeOfNextVarHit(t,x,u)获得下⼀次系统执⾏( next hit)的时间,该时间为绝对时间,此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调⽤(7)sys= mdiTerminate(t,x,u)相当于构析函数,结束该仿真模块时被调⽤3、S- function的执⾏顺序(1)在仿真开始时,执⾏ mdllnitialize Sizes(2)若系统包含连续部分,则调⽤ mdlDerivatives;若系统包含离散部分,则调⽤ mdlUpdate(3)调⽤ mdlOutputs,产⽣输出(4)若满⾜条件,则执⾏ mdlGetTimeOfNextVarHit(5)循环执⾏1--3,直⾄仿真停⽌(6)执⾏ mdITerminate,仿真停⽌4、S- function输⼊输出参数含义(1)输⼊参数t,x,u,flagt:系统时间x:系统状态u:系统输⼊,即在 simulink models中连接⾄S- function的线上的数据。
Simulink®S-Functions使用S-Function Builder本章概述S-Function Builder优势以及局限在模型中使用S-Function Builder使用S-Function Builder定义S-function各个参数以及算法使用S-Function Builder集成外部源代码S-Function BuilderUser-Defined Functions 库中包含了S-Function Builder 模块,通过该模块提供的图形用户界面,用户可创建C语言S-functionS-Function Builder能够接收和输出Simulink支持的复数,1-D或2-D信号S-Function Builder模块仅能用于C MEX S-function的创建,而且需要系统至少有一个输入和一个输出S-Function Builder 流程积分阶段仿真终止计算输出Outputs计算离散状态更新Discrete Updates 计算连续状态导数Continuous Derivatives计算输出Outputs建立模块i/o 和参数Data Properties设置状态个数,初始化状态以及设置采样时间Initialization使用S-Function Builder: 初始化S-function 名称采样时间状态个数以及初始值使用S-Function Builder: 数据属性使用S-Function Builder: 库外部源文件外部头文件外部函数原型使用S-Function Builder: 输出/求导/更新输出方程导数方程更新方程使用S-Function Builder:编译信息编译S-function 编译状态无状态S-Functions无状态C MEX S-function其中g 为系统输出, P m 和P a 为系统输入。
()()⎪⎪⎩⎪⎪⎨⎧≥−≤≤−−≤≤−≤=a m a m a m a m a a m a a m a m a m P P P P P P P P P P P P P P P P P P g 2if 12if 22if 22if 122无状态S-Functions (续)S-Function Builder 结果处理宽度动态变化的信号能接收任何宽度信号示例: Pm在Data Properties,设置Pm宽度和输出端口为-1 使用u_width定义输出信号宽度.在Outputs,使用for循环定义g值处理宽度动态变化的信号(续)处理S-Function Builder 参数Pa 定义为一个参数变量:在Data Properties, 增加Pa作为系统参数 访问参数值,使用Pa [0]连续状态S-Functions示例: 连续系统方程为其中m , k 和b 为S-function 参数[][])(0)()(01)()(/10)()(//10)()(212121t F t x t x t y t F m t x t x m b m k t x t x +⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡+⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡−−=⎥⎦⎤⎢⎣⎡&&>>mass_spring_builder>>edit mass_spring_b.c连续状态S-Functions(续)在Initialization,设置连续状态个数和初始化条件在Data Properties定义m, b, 和k.在Outputs, 输入输出方程.在Continuous Derivatives,输入状态导数方程,使用dX访问连续状态导数向量离散状态S-Functions离散状态方程为:其中Kp, Ki, Kd, 和Ts为S-function 参数.)()()(1)()(1)()(0001)1()1(212121k e T K K k x k x T K k y k e T K k x k x k x k x s d p s d s i ⎟⎟⎠⎞⎜⎜⎝⎛++⎭⎬⎫⎩⎨⎧⎥⎦⎤⎢⎣⎡−=⎥⎦⎤⎢⎣⎡+⎭⎬⎫⎩⎨⎧⎥⎦⎤⎢⎣⎡=⎭⎬⎫⎩⎨⎧++离散状态S-Functions (续) 在Initialization,设置离散状态个数,离散状态初始化和采样周期0.02秒.在Data Properties,增加Kp, Ki, 和Kd三个参数在Outputs,输入输出方程在Discrete Updates,中输入状态更新方程集成外部源码支持外部函数原型,在Libraries中以头文件形式加入调用外部函数Includes source.cExternalfunctions示例: Wrapper S-Function使用S-Function Builder创建wrapper S-function,该函数调用排序源码sort_ext.c.在库需要中加入外部源码Wrapper S-Function (续) >> sort_builder本章小结S-Function Builder优势以及局限在模型中使用S-Function Builder使用S-Function Builder定义S-function各个参数以及算法使用S-Function Builder集成外部源代码。
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函数,实现仿真任务的结束。
S-function(系统函数)是Simulink的一种自定义函数,它允许用户在Simulink模型中扩展功能,以满足对实现复杂算法的需求。
要使用S-function,用户需要编写一个用C、C++或Matlab编写的文件,定义输入、输出、状态变量以及所需的功能。
S-function的主要用法如下:1. 创建S-function文件:创建用C、C++或Matlab编写的S-function文件。
这个文件将包含所有需要定义的系统函数。
文件名必须与S-function名称匹配。
2. 在S-function文件中声明输入输出变量以及参数:在S-function文件中,需要声明输入、输出变量、状态变量以及参数。
这样Simulink会知道如何处理S-function。
3. 实现函数的功能:在S-function文件中,需要根据算法需求实现所需功能。
这可以包括初始化、信号处理、状态更新等各种操作。
4. 将S-function添加到Simulink模型中:在Simulink中,从Library Browser中找到"User-Defined Functions"类别,并将其中的S-Function模块拖到模型中。
5. 配置S-function模块:双击添加到模型中的S-Function模块,在S-function name框添加您的S-function文件的名称。
还可以在Parameters框中输入参数,如果需要的话。
6. 连接S-function模块:在模型中连接S-function模块的输入和输出端,根据系统需求设置传递信号。
完成上述步骤后,可以运行模型,并查看S-function的运行结果。
总之,S-function的用法主要可以分为编写S-function文件、在Simulink模型中添加S-function 模块这两个部分。
通过实现自定义的功能、参数及输入输出变量,用户可以在Simulink环境中使用S-function完成复杂算法的实现。
函数是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,看当前处于哪个状态case 0,[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;其他的可以不变。
【转载】matlab中s函数编写【转载】matlab中s函数编写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,看当前处于哪个状态case 0,[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.NumO utputs=1;sizes.NumInputs=1;其他的可以不变。
S-函数概述1、什么是S函数S函数(系统函数)提供一个有力的途径用于扩展Simulink仿真环境的能力。
S函数是用MATLAB、C、C++、Fortran编写的,用来描述Simulink模块。
C、C++、Fortran编写的用mex公用程式编译为MEX文件(具体参考building MEX-File).与其他的MEX文件一样,S 函数是一个MATLAB翻译器可以自动加载执行的动态链接子程序。
S函数使用一种特殊的调用语法条用S函数应用程序,使你们可以与仿真引擎交互。
这种交互同发生在引擎与仿真环境中的模块的交互相似。
S函数遵循一种通用的格式,可以兼容连续、离散和混合系统。
遵守一系列简单的规则,你们可以在S函数中实现算法并且将S函数模块添加到仿真模块中。
当你编写自己的S函数后,将其名字添加到S函数块(在用户定义函数模块库中可以找到),你可以使用masking(在Creating Custom Blocks 中可以查看)来定做用户界面。
你可以用实时Workshop产品使用S函数,你也可以通过编写目标语言编译器文件(TLC)来定制生成S函数的代码,可以查看(Integrating External Code With Generated C and C++)。
2、在建模中使用S函数A、兼容C MEX S函数或者旧版(MATLAB level-1)的S函数,从用户定义函数库拖动S 函数到模型中,然后指定S函数的名字(名字中包含了函数的信息),level-2的版本操作也一样(当路径中有同名的C MEX文件和MATLAB文件时,优选执行C MEX文件)。
B、向S函数传递参数:S函数块的“Parameters”文件允许指定参数值传递到相应的S 函数。
为了使用这些文件,必须知道S函数需要的参数、参数的顺序,如果不知道,可以咨询S函数的作者、文档或者源代码。
输入参数用逗号分开,按照S函数要求的顺序输入,参数的值可以是常数、变量名(定义在MATALB、建模工作空间或者MATALB表达式中)。
s函数一下是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,看当前处于哪个状态
case 0,
[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*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. NumInpu
ts=1;
其他的可以不变。
继续在mdlInitializeSizes函数中往下看:
x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改 %为x0=[0,0](离散和连续的状态变量我们都设它初值为0)
str = []; %这个就不用说了,保留参数嘛,置[]就可以了,反正没什么用,可 %能7.0会给它一些意义
ts = [0 0]; %采样周期设为0表示是连续系统,如果是离散系统在下面的mdlGet %TimeOfNextVarHit函数中具体介绍
嘻嘻,总算讲完了初始化,后面的应该快了
在sfuntmpl的106行继续往下看:
case 1,
sys=mdlDerivatives(t,x,u);
flag=1表示此时要计算连续状态的微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到 mdlDerivatives函数(在193行)如果设置连续状态变量个数为0,此处只需sys=[]; 就可以了(如sfuntmpl中一样),按我们上述讨论的那个模型,此处改成 sys=fc(t,x(1),u)或sys=A*x(1)+B*u %我们这儿x(1)是连续状态变量,而x(2)是离散的,这儿只用到连续的,此时的输出sys就是微分
继续,在sfuntmpl的112行:
case 2,
sys=mdlUpdate(t,x,u);
flag=2表示此时要计算下一个离散状态,即上面提到的x(k+1)=fd(t,x,u),找到mdlUpd ate函数(在206行)它这儿sys=[];表示没有离散状态,我们这而可以改成 sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)
看来后面几个一两句话就可了,呵呵,在sfuntmpl的118行
case 3,
sys=mdlOutputs(t,x,u);
flag=3表示此时要计算输出,即y=fo(t,x,u),找到mdlOutputs函数(在218行),如上,如果sys=[]表示没有输出,我们改成sys=fo(t,x,u)或
sys=C*x+D*u %sys此时为输出y
好像快完了,嘻嘻,在sfuntmpl的124行
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
flag=4表示此时要计算下一次采样的时间,只在离散采样系统中有用(即上文的mdlInit ializeSizes中提到的ts设置ts(1)不为0)
连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[];这个函数主要用于变步长的设置,具体实现大家可以用edit vsfunc看vsfunc.m这个例子
最后一个,在sfuntmpl的130行
case 9,
sys=mdlTerminate(t,x,u);
flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]
就可,如果你在结束时还要设置什么,就在此函数中写
关于sfuntmpl这个s函数的模板讲完了。
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函数的程序。