S-Function中文帮助文档
S-Function函数

function[sys,x0,str,ts]=spacemodel (t,x,u,flag) switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 3,sys=mdlOutputs(t,x,u);case {2,4,9}sys=[];otherwiseerror([‘Unhandled flag= ’,num2str(flag)]); endfunction[sys,x0,str,ts]= mdlInitializeSizes sizes=simsizes;sizes.NumContStates=0; 输入连续状态数目sizes.NumDiscStates=0; 离散状态数目sizes.NumOutputs=3; 输出数目sizes.NumInputs=3; 输入数目sizes.DirFeedthrough=1;size.NumSampleTimes=0;sys=simsizes(sizes);x0=[];str=[];ts=[];function sys=mdlOutputs(t,x,u)thd=u(1);dthd=cos(t);ddthd=-sin(t);th=u(2);dth=u(3);c=0.5;e=th-thd;de=dth-dthd;s=c*e+de;J=10;xite=0.50;ut=J*(-c*de+ddthd-xite*sign(s));sys(1)=u(t);sys(2)=e;sys(3)=defunction[sys, x0, str, ts]=s_function (t, x, u, flag) switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 1,sys = mdlDerivatives (t, x, u);case 3,sys=mdlOutputs(t,x,u);case {2,4,9}sys=[];otherwiseerror([‘Unhandled flag= ’,num2str(flag)]);endfunction[sys,x0,str,ts]= mdlInitializeSizessizes=simsizes;sizes.NumContStates=2;sizes.NumDiscStates=0;sizes.NumOutputs=2;sizes.NumInputs=1;sizes.DirFeedthrough=0;size.NumSampleTimes=0;sys=simsizes(sizes);x0=[0.5 1.0];str=[];ts=[];sfunction sys=mdlDerivatives (t,x,u)sJ=10;sys(1)=x(2);sys(2)=1/J*u;function sys=mdlOutputs(t,x,u)sys(1)=x(1);sys(2)=x(2);作图程序:chap2_1plot.mclose all;figure(1);subplot(211);plot(t,y(:,1),’k’,t,y(:,2),’r:’,’linewidth’,2);legend(‘Ideal position signal’, ’Position tracking’); xlabel(‘time(s)’);ylabel(‘Angle response’);subplot(212);plot(t,cos(t),’k’,t,y(:,3),’r:’,’linewidth’,2);legend(‘Ideal speed signal’, ’Speed tracking’);xlabel(‘time(s)’);ylabel(‘Angle speed response’);figure(2)plot(t,u(:,1),’k’,’linewidth’,0.01);xlabel(‘time(s)’);ylabel(‘Control input’);c=0.5figure(3)plot(e,de,’r’,e,-c’.*e,’k’,’linewidth’,2);xlabel(‘e’);ylabel(‘de’);legend(‘s change ‘,’ s=0’);title(‘phase trajectory’);function [sys,x0,str,ts] = xiuMS(t,x,u,flag)%SFUNTMPL General M-file S-function template% 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.% 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% actual length for all other flags will be equal to the % length of the input, U.% SYS(5) = Reserved for root finding. Must be zero.% SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function % has direct feedthrough if U is used during the FLAG=3% call. Setting this to 0 is akin to making a promise that % U will not be used during FLAG=3. If you break the promise % then unpredictable results will occur.% SYS(7) = Number of sample times. This is the number of rows in TS. %%% X0 = Initial state conditions or [] if no states.%% STR = State ordering strings which is generally specified as []. %% TS = An m-by-2 matrix containing the sample time% (period, offset) information. Where m = number of sample % times. The ordering of the sample times must be:%% TS = [0 0, : Continuous sample time.% 0 1, : Continuous, but fixed in minor step % sample time.% PERIOD OFFSET, : Discrete sample time where% PERIOD > 0 & OFFSET < PERIOD.% -2 0]; : Variable step discrete sample time % where FLAG=4 is used to get time of% next hit.%% There can be more than one sample time providing% they are ordered such that they are monotonically% increasing. Only the needed sample times should be% specified in TS. When specifying more than one% sample time, you must check for sample hits explicitly by % seeing if% abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)% is within a specified tolerance, generally 1e-8. This% tolerance is dependent upon your model's sampling times % and simulation time.%% You can also specify that the sample time of the S-function % is inherited from the driving block. For functions which % change during minor steps, this is done by% specifying SYS(7) = 1 and TS = [-1 0]. For functions which % are held during minor steps, this is done by specifying % SYS(7) = 1 and TS = [-1 1].% Copyright 1990-2007 The MathWorks, Inc.% $Revision: 1.18.2.2 $%% The following outlines the general structure of an S-function.%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);%错误处理otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end% end sfuntmpl%%==================================================================== =========% mdlInitializeSizes% Return the sizes, initial conditions, and sample times for theS-function.%==================================================================== =========%function [sys,x0,str,ts]=mdlInitializeSizes %模型初始化函数sizes = simsizes; %取系统默认设置sizes.NumContStates = 0; %设置连续状态变量的个数sizes.NumDiscStates = 0; %设置离散状态变量的个数sizes.NumOutputs = 1; %设置系统输出变量的个数sizes.NumInputs = 1; %设置系统输入变量的个数sizes.DirFeedthrough = 1; %设置系统是否直通sizes.NumSampleTimes = 1; %采样周期的个数,必须大于或等于1sys = simsizes(sizes); %设置系统参数x0 = []; %系统状态初始化str = []; %系统阶字串总为空矩阵ts = [0 0]; %初始化采样时间矩阵% mdlDerivatives% Return the derivatives for the continuous states.%模型计算导数—连续状态部分的计算,返回连续状态的导数function sys=mdlDerivatives(t,x,u)sys = []; %根据状态方程(微分方程部分)修改此处% mdlUpdate% Handle discrete state updates, sample time hits, and major time step % requirements.%计算离散状态部分function sys=mdlUpdate(t,x,u)sys = [];%根据状态方程(微分方程部分)修改此处% mdlOutputs% Return the block outputs.%计算输出信号,返回模块的输出function sys=mdlOutputs(t,x,u)sys = 5*u-3; %根据输出方程修改此处% mdlGetTimeOfNextVarHit%计算下一步仿真时刻,该函数仅当在mdlInitializeSizes函数中的采样时间向量定义了一%个可变离散采样时间ts为[-2 0]时才被使用function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1; % Example, set the next hit to be one second later. sys = t + sampleTime;function sys=mdlTerminate(t,x,u)sys = [];% end mdlTerminate。
S-Function中文帮助文档

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-function
%
采样时间间隔 偏移量 :用来自定义产生采样时间序列。其中采样时间
%
间隔需大于零,偏移量应小于采样时间间隔(连
%
续但微步长固定采样时间除外)
%
-2 0;
: 变步长离散采样时间,flag=4的子函数用来决
%
定下一个采样时间。
计算输出
Flag=4 mdlGetTimeOfNextVarHit
Flag=3 mdlOutputs
Y
是否是连
N
续系统
Flag=1 mdlDerivati
计算微分值
更新离散状态量
Flag=2 mdlUpdate
仿真结束
图 5 S 函数的仿真流程
4、S 函数的结构
Flag=9
mdlTerminate
S 函数格式非常严格,在 SIMULINK 中有一个模板 M 文件,使用时可以在 此模板上简单修改进行使用。此模板 M 文件(存放于 toolbox/ simulink/ blocks 中)由主函数以及 6 个子函数(不同 flag 值调用的函数)组成。下面分别就主函 数和子函数进行解释。
% str s函数保留参数,一般设定为空[].
% ts 一个n*2的矩阵。两列分别为采样时间间隔和偏移量。
%
其固定赋值如下
%
TS = [0
0,
: 连续采样时间.用于具有连续状态和/或非过零
%
采样的S-function。对于这种类型的
%
S-function,其输出在每个微步上变化。
%
0
1,
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完成复杂算法的实现。
《MATLAB的S-Function编写指导》

Simulink®
基于模型与基于系统的设计
n 建模 n 仿真 n 实现
S-Function 的编写
Version 5
目录
S-FUNCTION 概述 .................................................................................................................................... 1
定义 S-FUNCTION 块特性..................................................................................................................... 22 处理 S-FUNCTION 参数......................................................................................................................... 22 M 文件的 S-FUNCTION 范例................................................................................................................. 23
matlab中s-function的参数设置,初始化设置,中文介绍,例子详细

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.NumOutputs=1;sizes. NumInputs=1;其他的可以不变。
s-function使用及应用举例(S使用及应用举例)
s-function 使用及应用举例(S使用及应用举例)One of the writing of S-FUNCTIONSS-function is the abbreviation of system-function. In a simple way, S-function is the interface that the model provided by MATLAB does not fully satisfy the user, and provides the user with the interface to write the program to meet the requirements of the model itself. To understand S-function, you must understand the following knowledge:(1) direct feedthrough(2) dynamically sized inputs(3) setting sample times and offsets[because I do not know how to translate the above three sentences into Chinese accurately, so there is no translation, everyone understands, perhaps better) because of the importance of the above three parts, in this detailed analysis.One.Direct feedthroughDirect feedthrough means that the output or variable sampling time of the system is controlled by the input. It is clear that some systems are subject to input control such as:Y=k*u (U is input, K is amplification factor, and Y is output)And some systems output is not affected by input, such as:Output: y=xDx=uX represents stateTwo.Dynamically sized inputsThe number of input continuous states (size.NumContStates) and the number of discrete states (size.NumDiscStates) are givenThe number of outputs (size.NumOutputs), the number of inputs (size.NumInputs), Direct Feedthrough (size.Dir Feedthrough).Three.Setting sample times and offsetsSetting smaple times and offsets mainly set sampling time MATLAB, in order to facilitate the user, has written theS-FUNCTIONS template function sfuntmpl.m. In order to write S-FUNCTIONS better, let's take a look at it. The function sfuntmpl.m reads as follows: (I explained it by adding the content, starting with $)Function [sys, x0, STR, ts] = sfuntmpl (T, x, u, flag)The $output variable is the four one, and you have to pay attention to its order. The $input variables can be t, x, u, flag, P1,..., PN, etc., but the preceding four variables can not be changed.%SFUNTMPL General M-file S-function template% 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 top is its function% The general form of an M-File S-function syntax is:% [SYS, X0, STR, TS] = SFUNC (T, X, U, FLAG, P1,..., Pn)%Call format% 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.Specific how to achieve, we see the following function 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=[]. [].%参看后面相应函数美元%%的状态向量,x和x0由连续状态跟踪%离散状态。
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-函数中所包含的系统。
S-Function是system-function的缩写。当Matlab所提供的...
S-Function是system-function的缩写。
当Matlab所提供的simulink模型不能完全满足用户需要时,就可以通过S-函数提供用户自己编写程序啦满足自己要求模型的接口。
S-函数可以用Matlab、C、C++、Ada和Fortran语言编写,但是后四种语言编写的S-函数需要编译成MEX 文件。
在同名的M文件和MEX文件的S-函数情况下,Matlab和simulink优先调用MEX。
S-函数主要用来实现下面几个方面的功能:(1)向simulink模块中增加一个通用目标的模型(2)使用S-函数的模块来充当硬件的驱动(3)在仿真中嵌入已经存在的C代码(4)将系统表示成一系列的数学方程(5)在simulink中使用动画使用S-函数的一个优点是,你可以建立一个通用目标的模块,在一个模型中可以多次调用,每一个模块可以有不同的参数。
本教程的目录如下2# S-函数工作原理2.1 模型的数学描述2.2 S-函数仿真过程2.3 S-函数回调方法3# M文件S-函数的编写和模板4# M文件S-函数实例4.1简单单摆仿真实验4.2混合系统M文件S-函数一、S-函数工作原理模型的数学描述simulink模块一般由若干输入、状态和输出组成,其中输出是时间、状态和输入的函数可以通过下面的几个数学表达式来描述上面的过程,具体如下:输出:y=f(x,u,t)状态:x'=g(x,u,t)S-函数仿真过程simulink模型的处理主要有两个过程:1第一个阶段是初始化这时侯的所有参数都将被确定,主要完成以下几个过程:(1)传递参数表达式给Matlab进行求解(2)得到的数值作为实际的参数使用(3)展开模型的层次,每个子系统被它们所包含的模块替代(4)检查好相邻模块间的连接(5)确定状态初值和采样时间2第二阶段是模型仿真运行仿真开始运行,仿真过程是求解器和simulink引擎交互控制的。
求解器的作用是传递模块的输出,对状态导数进行积分,并确定采样时间,周而复始,直到仿真结束。
S_FUNCTION
SIMULINK_S-Function_TLC_RTW基础(给初学者)2011-07-10 22:17:11| 分类:项目4_高性能DSP | 标签:|字号大中小订阅李会先学习SIMULINK的人都会摆几个S-Function概念的招式,认为这才是入道者、专业SIMULINK人士的标志,如果按照这个标准,那么我觉得自己的SIMULINK仍然不够专业,不过不要紧,在SIMULINK框架下实现多领域产品设计的体系,S-Function并不是致命的要素,在某个时期侧重点不同,现在回来再总结下这个环节温故而知新。
S-Function是SIMULINK提供的一种灵活的几乎无所不能的机制,拯救那些专业人士表达自己聪明才干的梦想,这些人可以鄙视或者不肖一顾那些专业的SIMULINK工具箱,他们希望自己的思想得到自由流畅的表达,呵呵,这些人中,多数大脑运转的非常快,但是大脑的指令总是不那么容易传达到四肢,这种极端的例子就是霍金先生(SORRY,调侃了)。
但是普通的工程师真的有那么多别具一格、原创、甚至需要保密的劳动成果吗?所以S-Function在我看来并不是一个SIMULINK 初学者值得花时间的内容。
在SIMULINK的代码自动化过程中,可能更现实的内容是用SIMULINK的工具集成一些现成的算法,或者集成目标底层驱动程序到SIMULINK实现系统各个系统的装配,SIMULINK有这样一类工具自动实现S-Funtion的功能,这样实现的S-Function,你也无须了解任何关于TLC(目标语言编译器)的知识,这对减轻SIMULINK 学习的负担是非常重要的。
C代码、C++代码是最为优秀的程序语言,也有实在太多的通用的劳动成果可以免费得到,所以我们应该强调的代码重用,而不是用S-function去创新、创新、再创新........哇,简直是天才,其实更多的时候,我们用剪切与复制的方法来实现想法也发现憋得慌。
现在来谈谈S-Function的几个基础认识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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表达式中)。
当调用level-1S函数时,仿真引擎通常传递标准参数快(t,x,u,flag)到S函数作为函数参数。
引擎可以传递附加的由用户指定的块参数到S函数。
用户在S函数的“S-function parameter”文件中指定参数(参见Passing Parameters to S-Functions)。
如果块对话框指定额外的参数,引擎传递参数到S函数作为额外的函数参数。
额外的参数遵循在S函数中的参数列表顺序标准。
C、何时使用S函数:1、建立一个人新的通用模块;2、添加硬件驱动模块;3、兼容现在的C代码到仿真中(参见Integrating Existing C Functions into Simulink Modules with the legacy Code Tool);4、描述一个具有复杂数学方程的系统;5、使用图形激励。
其中最常使用S函数的是建立用户仿真块(参见Creating Custom Block)。
当使用S函数来建立通用模块时,可以在一个模型中多次使用,根据实际情况指定具体模块的参数。
3、在项目中使用S函数A、Mathematics of Simulink Blocks:一个仿真模块包含了一系列的输入、输出和状态,输出是时间、输入、状态的函数。
输出状态方程更新状态B 、仿真阶段:执行一个仿真模型分阶段进行。
首先是初始化阶段,仿真引擎加载库模块到模型中,传递信号宽度、数据类型、采样时间、模块参数赋值、确定模块执行顺序、定位内存;随后引擎进入Simuliation Loop ,在这个过程中,每一个循环视为一个仿真步;在每一步中,仿真引擎按初始化确定的顺序执行模型中的每个模块的计算;对于模块,引擎调用函数计算模块采样时刻的状态、导数(微分)、输出。
C 、S 函数的回调原理:一个S 函数包含一系列的S 函数回调方法来执行每一个仿真阶段的任务。
在模型仿真中,在每一个仿真进行阶段,仿真引擎为每一个S 函数模块调用相应的方法。
由S 函数回调方法实现的任务有:1、初始化:优先于第一个仿真循环,引擎初始化S 函数,包括:初始化SimStruct(一种包含关于S 函数信息的仿真结构);设置输入输出的数值和维数;设置模块采样时间;定义存储区域2、计算下一个采样点:如果使用了变采样时间,这个阶段计算下一个采样点的时间,也就是计算下一个步长(采样间隔);3、计算主时间步的输出:在这个调用结束之后,所有模块输出都确定。
4、在主时间步长更新离散状态:这个调用是说模块执行每一步一次的动作,如更新离散状态;5、集成:它应用于具有连续信号或者非过零点采样。
如果S函数具有连续的状态,引擎调用S函数在Minor time steps的输出和微分,所以求解器可以计算S函数的状态。
如果S函数具有非采样过零点,引擎也调用S函数在Minor time step输出和过零点以便于它定位过零点。
4、实现S函数A、MATLAB的S函数:LEVEL2-MATLAB S-Function允许在仿真环境中创建具有多种特征和功能的模块,这其中有:●多输入输出口●接收矢量和矩阵信号●支持各种信号属性:数据类型、混合、信号模型●处理多种采样频率LEVEL2-MATLAB S-Function由一个设置程序来配置基本属性,一系列的在仿真中的相应时间调用的回调方法组成。
一个基本注释的模板在“msfuntmpl_basic.m”。
其中模板由一个高级设置函数和一系列骨架子函数(每一个都与相应的回调方法相对应)组成。
每一个回调方法实现一个具体的S函数在仿真中相应节点的任务。
引擎调通过定义在设置程序中的函数句柄调用函数。
关于支持LEVEL2-MATLAB S-Function的回调方法可参见“Level-2 MATLAB S-Function Callback Methods”;更加详细的LEVEL2-MATLAB S-Function模板信息在“msfuntmpl.m”中。
作者建议在建立LEVEL2-MATLAB S-Function时按照模板格式来规划结构和命名,这对于他人对S函数进行理解和维护很方便,如何创建LEVEL2-MATLAB S-Function参见“Writing S-Functions in MATLAB”。
MEX S-Functions就像LEVEL2-MATLAB S-Function一样,由一系列在仿真中引擎调用来实现各种模块相关任务的回调方法组成。
S-Function可以有C、C++、Fortran实现,引擎直接调用MEX S-Function程序而不是通过函数句柄,由于引擎直接调用函数MEX S-Function必须根据S-Fuction API指定的命名规则。
具有注释的模板在“sfuntmpl_doc.c”。
模板包含了实现各种要求和可选的回调方法的骨架,C MEX S-Function 可以实现的。
更多的模板的基本版本可在“sfuntmpl_basic.c”中查到。
MEX Verse MATLAB S-Function::LEVEL2-MATLAB S-Function和MEX S-functions各有优点,前者的优点在于开发的方便简单,可以节约compile-link-execute循环所花费的时间,它也可以更方便使用工具箱函数并利用Editor和Dubugger;后者的优势在于执行的速度上,也可以集成已有的代码到仿真模块中,对于更加复杂的系统,由于前者每次回调都需要翻译执行,会花费更多的时间。
权衡选择可参考“Selecting an S-Function Implementation”。
5、S-Function的概念Direct Feedthrough:意味着输出(或者可变采样系统的采样时间)由输入端口信号值直接控制。
(即输入量直接作用于输出量,如比例关系,如果输出不是输入U的有理函数,则不属于Direct Feedthrough)输入端口Direct Feedthrough典型的情况有:●输出函数(mdloutputs)是输入U的函数,也就是说输入U可以被mdloutputs所获取即存在Direct Feedthrough。
输出也可以包含图像输出,比如XY图像的示波器。
●变采样时间S函数的下一个采样点函数(mdlGetTime0fNextVarHit)可以访问输入量U。
正确设置Direct Feedthrough flag是非常重要的,它影响模型中模块的执行顺序并且用于检测algebraic loop(代数循环),具体信息参见“Algebraic Loop”。
如果模型中S函数的仿真结果没有收敛或者仿真失败,有可能是Direct Feedthrough flag设置错误。
尝试开启Direct Feedthrough flag并设置algebraic loop求解器的诊断方法来给出提示,具体参见“ Diagnostics Pane: Solver”,接着运行仿真将显示模型中的所有代数循环并且如果引擎将S函数加入代数循环时也将显示出来。
Dynamically Sized Arrays:S函数的输入的维数是可以任意指定的,所以,仿真引擎在仿真开始的时候检测驱动S函数的输入矢量的维数来确定实际的输入信号的维数,S函数也可以利用输入维数来确定连续状态的数目、离散状态的数目、和输出的数目。
(在具体模型或者不同的仿真中,输入的维数的尺寸对于每一个具体的使用情况可以有所不同,但是在一个特定的仿真过程中,每一个S函数输入的维数是固定不变化的)。
C MEX函数和Level-2MATLAB函数可以含有多个输入和输出端口,每一个端口可以具有不同的维数,端口的个数和个端口的具体维数可以动态的确定。
Setting Sample Times and Offsets:Level-2 MATLAB C MEX S-functions函数如下的采样时间选择,提供高度灵活的选择来执行S函数。
●连续采样时间—对S函数来说就是连续状态和非过零检测,可以在“How Simulink Works in Using Simulink for an explanation of zero crossings”查看具体信息。
这种情况下,S函数的输出以minor时间步长进行更新。
●连续状态但是在minor time阶段保持不变—这种情况的S函数需要在major time期间执行,但是在minor time 期间不改变输出。
●离散采样时间—如果S函数的特性是具有离散的时间间隔,可以定义采样时间来实现控制,此时,也可以定义一个补偿来为每个采样点进行延时操作,但补偿不能增加相应的采样周期TimeHit = (n * period) + offset其中的整数n是目前的仿真步数,起始值通常为零。