-
S-Function
使用及应用举例
【说明】近来在论坛中很多朋友问及
Simulink
下的
S-
函数的编写及使用方法
p>
,
在西安交大
BBS
上
, hii_yzf
网友发表了有
关
S-
函数使用的文章
,
举例比较详尽
,
相信
对关心
S-
函数的网友会有很大帮助。
发信人
: hii_yzf
(
叶子
,
信区
: MathTools
标题
:
S-FUNCTIONS
的书写之一
发信站
:
交通大学思源
BBS
站
(Mon Apr 16
16:35:09 2001 ,
站内信件
S-FUNCTIONS
的书写之一
s-function
也就是
syst
em-function
的缩写。说得简单
,s-functi
on
就是用
MATLAB
所提供的模型
不能完全满足用户
,
而提供给用户自己编写程序来满足自己
p>
要求模型的接口。要了解
s-function,
必须了解以下知识
:
(1direct feedthrough
(2dynamically sized inputs
(3setting sample times and offsets
[
由于我也不知道怎么把上面三句话精确的翻译成中文
< br>,
因此在此不加翻译
,
大家
p>
自己理解
,
也许更好
]
由于上面三部分的重要性
,
在此详
细进行分析。
一
.direct
feedthrough
direct feedthrough
意思是说系统的输出或可变采样时间是否受到输入的控制。
大家清楚有的系统是受到
输入控制如
:
y=k*u (u
是输
入
,k
是放大因子
,y
是输出
而有的系统输出是不受到输入影响
,
如
:
输出
:y=x
dx=u
x
表示状态
二
.dynamically sized inputs <
/p>
主要是给出
:
输入连续状态数目
(tStates,
离散状态数目
(cStat
es
,
输出数目
(puts,
输入数目
(uts,Direct Feedthrough(
p>
Feedthrough
。三
.setti
ng sample times and offsets
setting
smaple times and
offsets
主要设置采样时间
MATLAB
为了用户方便
,
已经
书写了
S-FUNCTIONS
模板函数
s
funtmpl.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 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
% 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. %
$$
需要说明的是
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 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 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 (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
%
%================
==========================================
< br>====
===============
%
mdlInitializeSizes
% Return the sizes,
initial conditions, and sample times for the
S-function.
%==========================
================================
====
===============
%
function
[sys,x0,str,ts]=mdlInitializeSizes
%
% call simsizes for a 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.
%
$$
p>
关于函数
simsizes
大家必须遵循<
/p>
,
因为把是内部函数
,
< br>不得随便改变
,
其作用是
返回未
初始化的
size
结构。
sizes = simsizes;
$$number of
continuous states
tStates = 0;
$$number of discrete states
cStates = 0;
$$number of
outputs
puts = 0;
$$ number
of inputs
uts = 0;
$$Flag for
direct feedthrough
dthrough = 1;
$$number of sample times
pleTimes = 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 = t +
sampleTime; % end mdlGetTimeOfNextVarHit
%
%=========================
=================================
====
===============
% mdlTerminate
% Perform any end of simulation tasks.
%======================================
====================
====
===============
%
function
sys=mdlTerminate(t,x,u
sys = []; % end
mdlTerminate
在下面我将写几个具体的实例。
之二、连续系统例子
:
function [sys,x0,str,ts] =
csfunc(t,x,u,flag
%CSFUNC An example
M-file S-function for defining a continuous
system.
% Example M-file S-function
implementing continuous equations:
% x' = Ax + Bu
%
y = Cx + Du
%
% See
sfuntmpl.m for a general S-function template.
%
% See also SFUNTMPL.
% Copyright (c 1990-1998 by The
MathWorks, Inc. All Rights Reserved.
%
$$Revision: 1.5 $$
A=[-0.09 -0.01; 1 0];
B=[ 1 -7; 0 -2];
C=[ 0 2; 1
-5];
D=[-3 0; 1 0];
switch
flag,
%%%%%%%%%%%%%%%%%%
%
Initialization %
%%%%%%%%%%%%%%%%%%
case
0,[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D;
%%%%%%%%%%%%%%%
%
Derivatives %
%%%%%%%%%%%%%%%
case
1,sys=mdlDerivatives(t,x,u,A,B,C,D;
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case
3,sys=mdlOutputs(t,x,u,A,B,C,D;
%%%%%%%%%%%%%%%%%%%
%
Unhandled flags %
%%%%%%%%%%%%%%%%%%%
case { 2, 4, 9 },sys = [];
%%%%%%%%%%%%%%%%%%%%
%
Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise, error(['Unhandled flag =
',num2str(flag];
end
% end
csfunc
%
%==================
========================================
==== ===============