S-Function 使用及应用举例

来源:互联网 发布:卖店铺淘宝客软件 编辑:程序博客网 时间:2024/05/01 10:11

S-FUNCTIONS的书写之一

s-function也就是system-function的缩写。说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。要了解 s-function,必须了解以下知识:
(1)direct feedthrough
(2)dynamically sized inputs
(3)setting sample times and offsets
[由于我也不知道怎么把上面三句话精确的翻译成中文,因此在此不加翻译,大家自己理解,也许更好]由于上面三部分的重要性,在此详细进行分析。

一.direct feedthrough
direct feedthrough意思是说系统的输出或可变采样时间是否受到输入的控制。大家清楚有的系统是受到输入控制如:
 y=k*u (u是输入,k是放大因子,y是输出)
而有的系统输出是不受到输入影响,如:
输出:y=x
dx=u
x表示状态

二.dynamically sized inputs
主要是给出:输入连续状态数目(size.NumContStates),离散状态数目(size.NumDiscStates)
,输出数目(size.NumOutputs),输入数目(size.NumInputs),Direct Feedthrough(size.Dir Feedthrough)。
三.setting sample times and offsets  

setting smaple times and offsets主要设置采样时间 MATLAB为了用户方便,已经书写了S-FUNCTIONS模板函数sfuntmpl.m。为了更好的写S-FUNCTIONS,大家来看一下,该函数sfuntmpl.m内容如下:(我通过在该内容加注释来说明,以$开头)

function [sys,x0,str,ts] sfuntmpl(t,x,u,flag)
$输出变量就此四个,大家必须注意它的顺序。$输入变量可以为t,x,u,flag,p1,...,pn等,但是前面的四个变量不能变,特此说明。

%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 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 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
  -----  ------             --------------------------------------------
       [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
       DX                 Return continuous state derivatives in SYS.
       DS                 Update discrete states SYS X(n+1)
                        Return outputs in SYS.
       TNEXT              Return next time hit for variable step sample
                            time in SYS.
                          Reserved for future (root finding).
       []                 Termination, perform any cleanup SYS=[].
%
$参看后面相应函数
%
  The state vectors, 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 is used during the FLAG=3
              call. Setting this to is akin to making promise that
              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.
%
$需要说明的是sys的顺序不能乱
%
     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 number of sample
              times. The ordering of the sample times must be:
%
              TS [0      0,      Continuous sample time.
                         1,      Continuous, but fixed in minor step
                                     sample time.
                    PERIOD OFFSET, Discrete sample time where
                                     PERIOD 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 than one
              sample time, you must check for sample hits explicitly by
              seeing if
                 abs(round((T-OFFSET)/PERIOD) (T-OFFSET)/PERIOD)
              is within 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) and TS [-1 0]. For functions which
              are held during minor steps, this is done by specifying
              SYS(7) and TS [-1 -1].

  Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved.
  $Revision: 1.12 $

%
The following outlines the general structure of an S-function.
%
switch flag,  
  %%%%%%%%%%%%%%%%%%
  Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,[sys,x0,str,ts]=mdlInitializeSizes;
$大家是不是觉得此函数名太长,当然可以根据自己的爱好加以改变,不过后面的相应改。
  %%%%%%%%%%%%%%%
  Derivatives %
  %%%%%%%%%%%%%%%
  case 1,sys=mdlDerivatives(t,x,u);
  %%%%%%%%%%
  Update %
  %%%%%%%%%%
  case 2,sys=mdlUpdate(t,x,u);
  %%%%%%%%%%%
  Outputs %
  %%%%%%%%%%%
  case 3,sys=mdlOutputs(t,x,u);
  %%%%%%%%%%%%%%%%%%%%%%%
  GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);
  %%%%%%%%%%%%%
  Terminate %
  %%%%%%%%%%%%%
  case 9,sys=mdlTerminate(t,x,u);
  %%%%%%%%%%%%%%%%%%%%
  Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise, error(['Unhandled flag ',num2str(flag)]);
end
end sfuntmpl

%
%=============================================================================
mdlInitializeSizes
Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes
%
call simsizes for sizes structure, fill it in and convert it to a
sizes array.
%
Note that in this example, the values are hard coded.  This is not a
recommended practice as the characteristics of the block are typically
defined by the S-function parameters.
%
$关于函数simsizes大家必须遵循,因为把是内部函数,不得随便改变,其作用是返回未初始化的size结构。
sizes simsizes;
$number of continuous states
sizes.NumContStates  0;
$number of discrete states
sizes.NumDiscStates  0;
$number of outputs
sizes.NumOutputs     0;
number of inputs
sizes.NumInputs      0;
$Flag for direct feedthrough
sizes.DirFeedthrough 1;
$number of sample times
sizes.NumSampleTimes 1;   
at least one sample time is needed
$
sys simsizes(sizes);
%
initialize the initial conditions
%
x0  [];
%
str is always an empty matrix
%
str [];
%
initialize the array of sample times
%
ts  [0 0];
end mdlInitializeSizes
%
%=============================================================================
mdlDerivatives
Return the derivatives for the continuous states.
%=============================================================================
%
function sys=mdlDerivatives(t,x,u)
sys []; % end mdlDerivatives
%
%=============================================================================
mdlUpdate
Handle discrete state updates, sample time hits, and major time step
requirements.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)
sys [];   % end mdlUpdate
%
%=============================================================================
mdlOutputs
Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x,u)
sys [];  % end mdlOutputs
%
%=============================================================================
mdlGetTimeOfNextVarHit
Return the time of the next hit for this block.  Note that the result is
absolute time.  Note that this function is only used when you specify a
variable discrete-time sample time [-2 0] in the sample time array in
mdlInitializeSizes.
%=============================================================================
%
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime 1;     Example, set the next hit to be one second later.
sys sampleTime;  % end mdlGetTimeOfNextVarHit
%
%=============================================================================
mdlTerminate
Perform any end of simulation tasks.
%=============================================================================
%
function sys=mdlTerminate(t,x,u)
sys [];   % end mdlTerminate

0 0