matlab(Simulink)中S-function函数编写规则

合集下载

simulink matlabfunction生成规则

simulink matlabfunction生成规则

simulink matlabfunction生成规则(最新版)目录1.Simulink 和 MATLAB 简介2.Simulink 中的函数生成规则3.如何创建自定义函数4.函数生成规则的优点和应用场景正文一、Simulink 和 MATLAB 简介Simulink 是 MathWorks 公司开发的一款与 MATLAB 相结合的图形化仿真环境,主要用于动态系统建模、仿真和分析。

通过 Simulink,用户可以轻松地创建、修改和仿真复杂的动态系统。

而 MATLAB 则是一款广泛应用于科学计算、数据分析和可视化的编程语言。

这两款软件的结合,使得用户可以更加高效地完成各种工程和科研任务。

二、Simulink 中的函数生成规则在 Simulink 中,函数生成规则是一种用于创建自定义函数的方法。

通过函数生成规则,用户可以根据需要定义自己的函数,以满足仿真模型中对特定功能的需求。

这种规则可以使得仿真模型更加灵活、精确和易于维护。

三、如何创建自定义函数在 Simulink 中创建自定义函数的具体步骤如下:1.打开 Simulink 软件,新建或打开一个仿真模型。

2.在模型编辑器中,找到“Function Generator”模块(位于“Sources”或“Sinks”子库中)。

3.将“Function Generator”模块拖拽到仿真模型的编辑区域中。

4.双击“Function Generator”模块,打开“Function Generator”对话框。

5.在“Function Generator”对话框中,设置函数的参数,如函数名、函数表达式、变量范围等。

6.点击“OK”按钮,即可创建一个自定义函数。

四、函数生成规则的优点和应用场景函数生成规则具有以下优点:1.灵活性:用户可以根据自己的需求定义特定的函数,使得仿真模型更加灵活。

2.精确性:自定义函数可以精确地实现用户的需求,提高仿真结果的准确性。

simulink里sfunction参数

simulink里sfunction参数

simulink里sfunction参数在Simulink中,S-function(系统函数)是一种用于描述线性或非线性系统动态行为的函数。

S-function可以用来模拟各种类型的动态系统,例如线性时不变系统、非线性系统、多速率系统等。

S-function的参数包括:1. S-function name:这是S-function的名称,用于标识S-function模块。

用户可以在这里输入自定义的名称,以便在Simulink模型中识别该S-function模块。

2. S-function parameters:这是S-function的参数列表。

用户可以在这里输入S-function所需的参数,每个参数之间用逗号分隔。

这些参数可以在S-function的M文件或C文件中使用,用于定义系统的动态行为。

3. S-function modules:这是S-function模块的名称列表。

用户可以在这里输入要在Simulink模型中使用的S-function模块的名称。

这些模块可以在S-function的M文件或C文件中定义,用于实现系统的动态行为。

4. S-function flags:这是S-function的标志列表。

用户可以在这里选择适当的标志来控制S-function的行为。

例如,用户可以选择标志来指定S-function是否使用离散时间或连续时间求解器,是否使用线性化或非线性求解器等。

5. S-function data:这是S-function的数据结构列表。

用户可以在这里输入S-function所需的数据结构,例如状态矩阵、输入矩阵、输出矩阵等。

这些数据结构可以在S-function的M文件或C文件中定义,用于存储系统的状态和输入/输出数据。

以上是Simulink中S-function的一些常见参数,具体参数可能会根据不同的S-function实现而有所不同。

用户需要根据具体的S-function要求来设置这些参数,以确保模型能够正确地模拟系统的动态行为。

matlab函数以及simulink模块的使用---S-function

matlab函数以及simulink模块的使用---S-function

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-function动力学方程组

simulink s-function动力学方程组

simulink s-function动力学方程组
Simulink S-Function 是一种用于建立自定义动态系统模型的Simulink 块。

动力学方程组是描述系统行为和响应的数学方程。

下面是一个示例的 Simulink S-Function 动力学方程组:
```matlab
function dx = sfun_dynamics(t, x, u)
% 系统参数
m = 1; % 质量
k = 2; % 弹簧刚度
c = 1; % 阻尼系数
% 方程组
dx(1,1) = x(2);
dx(2,1) = (u - k*x(1) - c*x(2))/m;
end
```
在该示例中,动力学方程组描述了一个质量 m 的弹簧-阻尼系统。

方程组中的状态变量 x 包括质点的位移和速度。

输入变量 u 是外部施加在系统上的力。

下面是方程组的形式:
```
dx1/dt = x2
dx2/dt = (u - k*x1 - c*x2)/m
```
在 Simulink S-Function 中,可以使用该方程组计算系统的状态变量的变化率,即 dx。

系统的时间 t 也是作为输入传递给 S-Function 的。

该 S-Function 可以在 Simulink 中使用,以构建一个包含该系统的模型,并通过输入 u 激励模型,从而观察到系统的响应和行为。

s-function的用法

s-function的用法

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完成复杂算法的实现。

Simulink——S-Function 的编写

Simulink——S-Function 的编写

Simulink——S-Function 的C语言编写Simulink 提供了实现一个C MEX S-function 的架构文件,这里称之为模板。

它是专门为用户编写的用于指导用户编写自己的S-function。

该模板包含了实现回调函数的框架结构,并加以注释说明用法。

该模板文件名为sfuntmpl_basic.c,存放在MATLAB 根目录下的simulink/src 目录中,它适合于编写普通用途的S-function 程序。

另外一个模板包含了所有有效的程序(并有更详细的注释),存放在相同目录下,文件名为sfuntmpl_doc.c。

S-Function 源文件必需的内容S-Function 头部必需的申明每个源程序模块必须包含以下顺序的定义与包含:#define S_FUNCTION_NAME your_sfunction_name_here#define S_FUNCTION_LEVEL 2#include "simstruc.h"其中,your_sfunction_name_here是S-function 的函数名(在Simulink S-Function 块的对话框所输入的名称)。

这些申明使你能够访问SimStruct 数据结构,该数据结构包含了仿真所用数据的指针。

包含文件中还定义了宏用来在SimStruct 中存储数据,或从SimStruct 中获得数据。

另外,该代码指定了你使用的是S-function level 2 的格式。

S-Function 结尾必需的申明仅在C MEX S-function 主模块的最后包含这些结尾代码。

#ifdef MATLAB_MEX_FILE /* Is this being compiled as MEX-file? */#include "simulink.c" /* MEX-file interface mechanism */#else#include "cg_sfun.h" /* Code generation registration func */#endif这些申明用来为特定的应用选择合适的代码:♦ 如果被编译为一个MEX 文件,则包含simulink.c 文件♦ 如果该文件被用来与Real-Time Workshop 连接以产生一个单机或实时可执行文件,则包含cg_sfun.h 文件一个称为SimStruct的数据结构描述了S-函数中所包含的系统。

手把手教你做simulink中的s_function工程实例

手把手教你做simulink中的s_function工程实例

手把手教你做sfunction 1、新建一个文件夹2、在matlab软件file-set path里面添加新的路径,将上述路径加入3、新建一个simulink文件4、加入所需的控件5、元件加入完成后的simulink文件6、保存到先前建立的文件夹7、双击在文件夹下面新建一个maltab的m文件,里面加入代码保存,本例子是实现收入一个幅值为2的正弦波,但是输出绝对值高于±1就保持±1的简单系统,程序附在后面。

注意下图7-1,2的名称和文件夹名称一样,与程序内部名称也要对应。

M文件可以由模块改。

图7-2图7-1图7-2以下是程序function [sys,x0,str,ts]=mysfun(t,x,u,flag,max,min)%LIMINTM Limited integrator mentation.% Example M-file S-function implementing a continuous limited integrator % where the output is bounded by lower bound (LB) and upper bound (UB) % with initial conditions (XI).%% See sfuntmpl.m for a general S-function template.%% See also SFUNTMPL.% Copyright 1990-2002 The MathWorks, Inc. % $Revision: 1.17 $switch flag%%%%%%%%%%%%%%%%%%% Initialization % %%%%%%%%%%%%%%%%%%case 0sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);str = [];x0 = [];ts = [0 0]; % sample time: [period, offset]case 3if u>maxsys=max;elseif u<minsys=min;elsesys=u;endcase {1,2,4,9}sys = []; % do nothing%%%%%%%%%%% Output %%%%%%%%%%%otherwiseerror(['unhandled flag = ',num2str(flag)]);% end limintm8、设置9、信号源设置,幅值是21010、最后仿真图10、修改mdl源文件,可以同时看到信号源与结果系统图(采用mux模块合成信号)注意示波器的采样时间设置。

matlab中S_function编程

matlab中S_function编程

S函数编辑流程及相关1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。

在MATLAB主界面中直接输入:sfundemos,即可调出S函数的许多编程例子。

2. S函数模板的相关基础:1)M文件S函数的引导语句为:txfpusysFunction[pxstrtsflag,,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函数,实现仿真任务的结束。

matlab中的sfunction的用法(C语言)

matlab中的sfunction的用法(C语言)
/* Return if number of expected != number of actual parameters */ return; } PARA_NUM 就是你自己需要设置的参数个数 5. ssSetNumContStates(S, 0); ssSetNumDiscStates(S, 0); 设置连续状态和离散状态个数。缺省都为 0 6. if (!ssSetNumInputPorts(S, INPUT_NUM)) return; ssSetInputPortWidth(S, 0,3); //设置端口的维数,现在为 3*1
}
#define MDL_INITIALIZE_CONDITIONS
/* Change to #undef to r
emove function */
#if defined(MDL_INITIALIZE_CONDITIONS)
static void mdlInitializeConditions(SimStruct *S)//暂时不管
*y2 = ssGetOutputPortSignal(S,1);
y1[0]=u[0]*para1[0]+u[1]*para2[0];
y2[0]=u[1]*para3[0]+u[0]*para1[0];
}
#define MDL_UPDATE /* Change to #undef to remove function
[原创]matlab 每日一贴(仿真函数篇二)S-Function
在 User-Defined Function 里面还有 matlab function 模块,这个模块支持 matlab 函数和 自定义的函数,缺点就是 input,output 都是一个端口, 模块上不能显示输入输出的 label。 还有 fcn 模块,它支持简易的函数表达式。

S-Funtion编写说明

S-Funtion编写说明

S-Function(MATLAB)之C++编程一、S-Function仿真之前提条件1.需要安装MATLAB、Visual studio c++软件,软件版本随自己喜欢2.需要使用mex –setup或者mbuild –setup命令配置编译环境,具体方法百度很多3.会简单的C/C++编程,会基本的simulink仿真二、S-Function仿真之仿真原理1.Simulink的仿真本质是在执行一些列的回调函数,仿真开始时首先执行各个模块的初始化化调函数。

2.Simulink是单线程仿真的,在某一时刻simulink只可能在执行某一个模块的功能回调函数,也就是说simulink的仿真是一个个模块依次获得执行权去执行,完成一个周期后又循环进行。

3.S-Funtion是simulink中的用户自定义模块,其功能完全由用户编程实现。

三、S-Function仿真之回调函数1.初始化回调函数:static void mdlInitializeSizes(SimStruct *S),主要是完成端口数据类型、端口帧长度、输入输出端口个数的初始化。

2.采样时间设置回调函数:static void mdlInitializeSampleTimes(SimStruct *S),主要是完成模块采样时间的设置。

3.仿真开始前回调函数:static void mdlStart(SimStruct *S),主要完成在开始仿真之前的一些准备工作,与mdlInitializeSizes不同的是mdlStart只是在仿真的时候才会执行,而mdlInitializeSizes在编译和仿真时都会执行。

4.模块功能实现函数:static void mdlOutputs(SimStruct *S, int_T tid),主要完成模块的功能代码,仿真一旦初始化完成并且开始后,那么每次仿真执行权轮到该模块时都是执行该回调函数。

5.仿真结束回调函数:static void mdlTerminate(SimStruct *S),主要是完成资源的释放。

matlab的sfunction执行流程

matlab的sfunction执行流程

matlab的sfunction执行流程MATLAB的S-Function(System Function)是一种用于扩展Simulink模型功能的强大工具。

S-Function允许用户以C、C++或MATLAB语言编写自定义的动态系统。

以下是S-Function的基本执行流程:1.初始化(Initialization):•当Simulink模型开始仿真时,S-Function的初始化函数(如mdlInitializeSizes)首先被调用。

在这个阶段,S-Function定义了它的输入和输出数量、离散状态的数量、采样时间等。

•如果S-Function使用工作向量(work vector),它也会在这个阶段被分配。

2.计算采样时间(Compute Sample Times):•在初始化之后,Simulink会调用S-Function的mdlGetSampleTimes 函数来确定其采样时间。

这对于确定何时调用S-Function的其他函数至关重要。

3.开始仿真(Start of Simulation):•在仿真开始时,可以调用一个可选的S-Function函数(如mdlStart),用于执行任何需要在仿真开始时执行的初始化或预计算。

4.仿真循环(Simulation Loop):•在仿真的每个采样点,S-Function的主要功能函数(如mdlOutputs,mdlUpdate,mdlDerivatives)被调用。

▪mdlOutputs:计算S-Function的输出。

▪mdlUpdate:更新S-Function的离散状态。

▪mdlDerivatives:计算S-Function的连续状态导数(对于连续时间系统)。

•根据S-Function的类型(连续、离散或混合)和配置,这些函数可能会被以不同的方式调用。

5.结束仿真(End of Simulation):•在仿真结束时,可以调用一个可选的S-Function函数(如mdlTerminate),用于执行任何需要在仿真结束时执行的清理操作。

横润科技《MATLAB的S-Function编写指导》

横润科技《MATLAB的S-Function编写指导》
i
使用 C 语言编写 S-FUNCTION ............................................................................................................. 33
定义 S-FUNCTION 块特性..................................................................................................................... 22 处理 S-FUNCTION 参数......................................................................................................................... 22 M 文件的 S-FUNCTION 范例................................................................................................................. 23
Simulink®
基于模型与基于系统的设计
n 建模 n 仿真 n 实现
S-Function 的编写
Version 5
目录
S-FUNCTION 概述 .................................................................................................................................... 1

matlab s-function参数

matlab s-function参数

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,并在初始化函数和输出函数中使用了这些参数。

29_Matlab中S-函数的编写

29_Matlab中S-函数的编写

Matlab中S-函数的编写S-函数使Simulink的功能大大扩充,除Mmatlab外,用户还可以用其他语言(C/C++/FORTRAN/Ada)编写实现算法,很强大的同时也对使用者提出了较高的要求。

下面是编写S-函数的整个流程:0 基础知识(1)Simulink仿真过程Simulnk仿真分为两步:初始化、仿真循环。

仿真是由求解器控制的,求解器主要作用是:计算模块输出、更新模块离散状态、计算连续状态。

求解器传递给系统的信息包括:时间、输入和当前状态。

系统的作用:计算模块的输出、更新状态、计算状态导数,然后将这些信息传递给求解器。

求解器和系统之间的信息传递是通过不同标志来控制的。

(2)S-函数控制流(3)S-函数的几个概念1)直接馈通在编写S-函数时,初始化函数中需要对sizes.DirFeedthrough 进行设置,如果输出函数mdlOutputs或者对于变采样时间的mdlGetTimeOf NextVarHit是输入u的函数,则模块具有直接馈通的特性sizes.DirFee dthrough=1;否则为0。

2)采样时间仿真步长就是整个模型的基础采样时间,各个子系统或模块的采样时间,必须以这个步长为整数倍。

连续信号和离散信号对计算机而言其实都是采样而来的,只是采样时间不同,连续信号采样时间可认为趋于0且基于微分方程,离散信号采样时间比较长基于差分方程。

离散信号当前状态由前一个时刻的状态决定,连续信号可以通过微分方程计算得到。

如果要将连续信号离散化还要考虑下信号能否恢复的问题,即香农定理。

采样时间点的确定:下一个采样时间=(n*采样间隔)+ 偏移量,n表示当前的仿真步,从0开始。

对于连续采样时间,ts可以设置为[0 0],其中偏移量为0;对于离散采样时间,ts假设为[0.25 0.1],表示在S-函数仿真开始后0. 1s开始每隔0.25s运行一次,当然每个采样时刻都会调用mdlOutPuts 和mdlUpdate函数;对于变采样时间,即离散采样时间的两次采样时间间隔是可变的,每次仿真步开始时都需要用mdlGetTimeNextVarHit计算下一个采样时间的时刻值。

S-Function 使用及应用举例

S-Function 使用及应用举例
高范强@IEE 版权所有
1
S-Function 使用及应用举编写及使用方法,在西安交大 BBS 上, hii_yzf 网友发表了有关 S-函数使用的文章,举例比较详尽,相信对关心 S-函数的网友会有很大帮助。
发信人: hii_yzf (叶子), 信区: MathTools 标 题: S-FUNCTIONS 的书写之一 发信站: 交通大学思源 BBS 站 (Mon Apr 16 16:35:09 2001) , 站内信件
setting smaple times and offsets 主要设置采样时间 MATLAB 为了用户方便,已经书写了 S-FUNCTIONS 模板函数 sfuntmpl.m。为了更好的写 S-FUNCTIONS,大家来看一下,该函数 sfuntmpl.m 内容如下:(我 通过在该内容加注释来说明,以$开头)
二.dynamically sized inputs 主要是给出:输入连续状态数目(size.NumContStates),离散状态数目(size.NumDiscStates) ,输出数目(size.NumOutputs),输入数目(size.NumInputs),Direct Feedthrough(size.Dir Feedthrough)。 三.setting sample times and offsets
高范强@IEE 版权所有
2
% With M-file S-functions, you can define you own ordinary differential % equations (ODEs), discrete system equations, and/or just about % any type of algorithm to be used within a Simulink block diagram. % $上面是其功能 % The general form of an M-File S-function syntax is: % [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn) % $调用格式 % What is returned by SFUNC at a given point in time, T, depends on the % value of the FLAG, the current state vector, X, and the current % input vector, U. % % FLAG RESULT DESCRIPTION % ----- ------ -------------------------------------------% 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS, % initial state in X0, state ordering strings % in STR, and sample times in TS. $具体怎样实现,大家参看后面的函数 mdlInitializeSizes % 1 DX Return continuous state derivatives in SYS. % 2 DS Update discrete states SYS = X(n+1) % 3 Y Return outputs in SYS. % 4 TNEXT Return next time hit for variable step sample % time in SYS. % 5 Reserved for future (root finding). % 9 [] Termination, perform any cleanup SYS=[]. % $参看后面相应函数 % % The state vectors, X and X0 consists of continuous states followed % by discrete states. % % Optional parameters, P1,...,Pn can be provided to the S-function and % used during any FLAG operation. % % When SFUNC is called with FLAG = 0, the following information % should be returned: % % SYS(1) = Number of continuous states. % SYS(2) = Number of discrete states. % SYS(3) = Number of outputs. % SYS(4) = Number of inputs. % Any of the first four elements in SYS can be specified % as -1 indicating that they are dynamically sized. The

MATLAB SIMULINK 编程

MATLAB SIMULINK 编程

4. 编写 C 语言的 S 函数
4.1 C MEX-file S-function 简介 定义了 S-function 模块的 C MEX-file 必须在仿真过程中向 Simulink 提供模型信息。 在 仿真中 Simulink、ODE 求解器、MEX-file 协作完成指定任务。这些任务包括:定义初始条件 和模块特性,计算微分、离散状态和输出。 Simulink 与 C MEX-file S-function 模块的交互仍是通过 S-function 的回调方法。每 个回调方法执行一个预定义的,实现仿真所需功能的任务。S-function 可以执行任何其实现 的任务。一系列 C MEX-file S-function 实现的回调方法,都远大于 M-file S-function 中 的。与 M-file S-function 不同的是,C MEX-file 可以访问并修改 Simulink 内部用来存储 S -function 信息的数据结构。更多的回调方法和对 Simulink 内部数据结构的访问能力,使得 C MEX-file S-function 可以实现更丰富的模块特性,如处理矩阵信号和多种数据类型。 C MEX-file S-function 只需实现 Simulink 定义的回调方法的一个小子集即可。如果不 实现某个回调方法,相应的功能将被省略掉。这有利于快速开发简单的模块。 通常 C MEX-file S-function 的形.1 Simulink 模块的数学描述 Simulink 模块包括一系列输入、状态和输出。输出是采样时间、输入、模块状态的函数。 图 1. 下面的方程描述了输入、输出和状态的数学关系。 图 2. 2.2 仿真过程 Simulink 模型的执行按下述几个步骤。首先是初始化阶段。在这一阶段 Simulink 将库 模块集合到模型,传播宽度、数据类型和采样时间,评估模块参数,确定模块执行顺序,分 配内存。然后是仿真阶段。此时 Simulink 进入一个仿真循环,循环的每次执行对应一个仿真 步。在每个仿真步,Simulink 按初始化阶段确定的顺序执行各个模块。对每个模块,Simuli nk 计算模块在当前采样时间的状态、微分和输出。这将持续到仿真结束。图 3 描述了 Simul ink 的仿真过程。 图 3. 2.3 S-function 的回调(Callback)方法
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

matlab(Simulink)中S-function函数编写规则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 sf untmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。

它的第一行是这样的:f unction[sys,x0,str,ts]=sf untmpl(t,x,u,f lag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),f lag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据f lag的不同而不同(下面将结合f l ag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。

下面结合sf untmpl.m中的代码来讲具体的结构:switch f lag, %判断f lag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;f l ag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sf untmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0;%模块连续状态变量的个数sizes.NumDiscStates = 0;%模块离散状态变量的个数sizes.NumOutputs = 0;%模块输出变量的个数sizes.NumInputs = 0;%模块输入变量的个数sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能%直接控制输出)sizes.NumSample Times = 1;%模块的采样时间个数,至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=f c(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;其他的可以不变。

继续在mdlInitializeSizes函数中往下看:x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改 %为x0=[0,0](离散和连续的状态变量我们都设它初值为0)str = []; %这个就不用说了,保留参数嘛,置[]就可以了,反正没什么用,可 %能7.0会给它一些意义ts = [0 0]; %采样周期设为0表示是连续系统,如果是离散系统在下面的mdlGet %TimeOfNextV arHit函数中具体介绍嘻嘻,总算讲完了初始化,后面的应该快了在sf untmpl的106行继续往下看:case 1,sys=mdlDerivatives(t,x,u);f l ag=1表示此时要计算连续状态的微分,即上面提到的dx/dt=f c(t,x,u)中的dx/dt,找到 mdlDerivatives函数(在193行)如果设置连续状态变量个数为0,此处只需sys=[]; 就可以了(如sf untmpl中一样),按我们上述讨论的那个模型,此处改成 sys=f c(t,x(1),u)或sys=A*x(1)+B*u %我们这儿x(1)是连续状态变量,而x(2)是离散的,这儿只用到连续的,此时的输出sys就是微分继续,在sf untmpl的112行:case 2,sys=mdlU pdate(t,x,u);flag=2表示此时要计算下一个离散状态,即上面提到的x(k+1)=fd(t,x,u),找到m dlUpd ate函数(在206行)它这儿sys=[];表示没有离散状态,我们这而可以改成 sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)看来后面几个一两句话就可了,呵呵,在sf untmpl的118行case 3,sys=mdlOutputs(t,x,u);flag=3表示此时要计算输出,即y=fo(t,x,u),找到mdlOutput s函数(在218行),如上,如果sys=[]表示没有输出,我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys 此时为输出y好像快完了,嘻嘻,在sf untmpl的124行case 4,sys=mdlGetTimeOf NextVarHit(t,x,u);f l ag=4表示此时要计算下一次采样的时间,只在离散采样系统中有用(即上文的mdlInit ializeSizes中提到的ts设置ts(1)不为0)连续系统中只需在mdlGetTimeOf NextV arHit函数中写上sys=[];这个函数主要用于变步长的设置,具体实现大家可以用edit vsf unc看vsf unc.m这个例子最后一个,在sf untmpl的130行case 9,sys=mdlTerminate(t,x,u);f l ag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可,如果你在结束时还要设置什么,就在此函数中写关于sf untmpl这个s函数的模板讲完了。

s函数还可以带用户参数,下面给个例子,和simulink下的gain模块功能一样。

f unction [sys,x0,str,ts] = sf ungain(t,x,u,f lag,gain)switch f lag,case 0,sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSample Times = 1;sys = simsizes(sizes);x0=[];str=[];ts=[0,0];case 3,sys=gain*u;case {1,2,4,9},sys = [];endSIMULINK s-f unction的设计Simulink为用户提供了许多内置的基本库模块,通过这些模块进行连接而构成系统的模型。

对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块,但它依然是基于Simulink原来提供的内置模块。

而Simulink s-f unction是一种强大的对模块库进行扩展的新工具。

(一)、s-f unction的概念s-f unction是一个动态系统的计算机语言描述,在MA TLAB里,用户可以选择用m文件编写,也可以用c或mex文件编写,在这里只给大家介绍如何用m文件编写s-f unction。

S-f unction提供了扩展Simulink模块库的有力工具,它采用一种特定的调用语法,使函数和Simulink解法器进行交互。

S-f unction最广泛的用途是定制用户自己的Simulink模块。

它的形式十分通用,能够支持连续系统、离散系统和混合系统。

(二)、建立m文件s-f unction1、使用模板文件:sf untmp1. m格式:[sys,x0]=f unction(t,x,u,f lag)该模板文件位于MA TLAB根目录下toolbox/simulink/blocks目录下。

模板文件里s-f unction的结构十分简单,它只为不同的f lag的值指定要相应调用的m文件子函数。

比如当f lag=3时,即模块处于计算输出这个仿真阶段时,相应调用的子函数为sys=mdloutputs(t,x,u)。

模板文件使用switch语句来完成这种指定,当然这种结构并不唯一,用户也可以使用if语句来完成同样的功能。

而且在实际运用时,可以根据实际需要来去掉某些值,因为并不是每个模块都需要经过所有的子函数调用。

模板文件只是Simulink为方便用户而提供的一种参考格式,并不是编写s-f unction的语法要求,用户完全可以改变子函数的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方便,而且条理清晰。

使用模板编写s-f unction,用户只需把s-函数名换成期望的函数名称,如果需要额外的输入参量,还需在输入参数列表的后面增加这些参数,因为前面的4个参数是simulink调用s-f unction时自动传入的。

对于输出参数,最好不做修改。

接下去的工作就是根据所编s-f unction要完成的任务,用相应的代码去替代模板里各个子函数的代码即可。

Simulink在每个仿真阶段都会对s-f unction进行调用,在调用时,Simulink会根据所处的仿真阶段为f lag传入不同的值,而且还会为sys这个返回参数指定不同的角色,也就是说尽管是相同的sys变量,但在不同的仿真阶段其意义却不相同,这种变化由simulink自动完成。

m文件s-f unction可用的子函数说明如下:mdlInitializeSizes(f lag=0):定义s-f unction模块的基本特性,包括采样时间、连续或者离散状态的初始条件和sizes数组。

相关文档
最新文档