|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
对用simulink做仿真的有用: <BR><BR>S-Function 使用及应用举例 <BR><BR>【发信人: hii_yzf (叶子), 信区: MathTools <BR>标 题: S-FUNCTIONS的书写之一 <BR>发信站: 交通大学思源BBS站 (Mon Apr 16 16:35:09 2001) , 站内信件 <BR><BR>S-FUNCTIONS的书写之一 <BR><BR>s-function也就是system-function的缩写。说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。要了解 s-function,必须了解以下知识: <BR>(1)direct feedthrough <BR>(2)dynamically sized inputs <BR>(3)setting sample times and offsets <BR>[由于我也不知道怎么把上面三句话精确的翻译成中文,因此在此不加翻译,大家自己理解,也许更好]由于上面三部分的重要性,在此详细进行分析。 <BR><BR>一.direct feedthrough <BR>direct feedthrough意思是说系统的输出或可变采样时间是否受到输入的控制。大家清楚有的系统是受到输入控制如: <BR>y=k*u (u是输入,k是放大因子,y是输出) <BR>而有的系统输出是不受到输入影响,如: <BR>输出:y=x <BR>dx=u <BR>x表示状态 <BR><BR>二.dynamically sized inputs <BR>主要是给出:输入连续状态数目(size.NumContStates),离散状态数目(size.NumDiscStates) <BR>,输出数目(size.NumOutputs),输入数目(size.NumInputs),Direct Feedthrough(size.Dir Feedthrough)。 <BR>三.setting sample times and offsets <BR><BR>setting smaple times and offsets主要设置采样时间 MATLAB为了用户方便,已经书写了S-FUNCTIONS模板函数sfuntmpl.m。为了更好的写S-FUNCTIONS,大家来看一下,该函数sfuntmpl.m内容如下:(我通过在该内容加注释来说明,以$开头) <BR><BR>function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag) <BR>$输出变量就此四个,大家必须注意它的顺序。$输入变量可以为t,x,u,flag,p1,...,pn等,但是前面的四个变量不能变,特此说明。 <BR><BR>%SFUNTMPL General M-file S-function template <BR>% With M-file S-functions, you can define you own ordinary differential <BR>% equations (ODEs), discrete system equations, and/or just about <BR>% any type of algorithm to be used within a Simulink block diagram. <BR>% <BR>$上面是其功能 <BR>% The general form of an M-File S-function syntax is: <BR>% [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn) <BR>% <BR>$调用格式 <BR>% What is returned by SFUNC at a given point in time, T, depends on the <BR>% value of the FLAG, the current state vector, X, and the current <BR>% input vector, U. <BR>% <BR>% FLAG RESULT DESCRIPTION <BR>% ----- ------ -------------------------------------------- <BR>% 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS, <BR>% initial state in X0, state ordering strings <BR>% in STR, and sample times in TS. <BR>$具体怎样实现,大家参看后面的函数mdlInitializeSizes <BR>% 1 DX Return continuous state derivatives in SYS. <BR>% 2 DS Update discrete states SYS = X(n+1) <BR>% 3 Y Return outputs in SYS. <BR>% 4 TNEXT Return next time hit for variable step sample <BR>% time in SYS. <BR>% 5 Reserved for future (root finding). <BR>% 9 [] Termination, perform any cleanup SYS=[]. <BR>% <BR>$参看后面相应函数 <BR>% <BR>% The state vectors, X and X0 consists of continuous states followed <BR>% by discrete states. <BR>% <BR>% Optional parameters, P1,...,Pn can be provided to the S-function and <BR>% used during any FLAG operation. <BR>% <BR>% When SFUNC is called with FLAG = 0, the following information <BR>% should be returned: <BR>% <BR>% SYS(1) = Number of continuous states. <BR>% SYS(2) = Number of discrete states. <BR>% SYS(3) = Number of outputs. <BR>% SYS(4) = Number of inputs. <BR>% Any of the first four elements in SYS can be specified <BR>% as -1 indicating that they are dynamically sized. The <BR>% actual length for all other flags will be equal to the <BR>% length of the input, U. <BR>% SYS(5) = Reserved for root finding. Must be zero. <BR>% SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function <BR>% has direct feedthrough if U is used during the FLAG=3 <BR>% call. Setting this to 0 is akin to making a promise that <BR>% U will not be used during FLAG=3. If you break the promise <BR>% then unpredictable results will occur. <BR>% SYS(7) = Number of sample times. This is the number of rows in TS. <BR>% <BR>$需要说明的是sys的顺序不能乱 <BR>% <BR>% X0 = Initial state conditions or [] if no states. <BR>% <BR>% STR = State ordering strings which is generally specified as []. <BR>% <BR>% TS = An m-by-2 matrix containing the sample time <BR>% (period, offset) information. Where m = number of sample <BR>% times. The ordering of the sample times must be: <BR>% <BR>% TS = [0 0, : Continuous sample time. <BR>% 0 1, : Continuous, but fixed in minor step <BR>% sample time. <BR>% PERIOD OFFSET, : Discrete sample time where <BR>% PERIOD > 0 & OFFSET 〈 PERIOD. <BR>% -2 0]; : Variable step discrete sample time <BR>% where FLAG=4 is used to get time of <BR>% next hit. <BR>% <BR>% There can be more than one sample time providing <BR>% they are ordered such that they are monotonically <BR>% increasing. Only the needed sample times should be <BR>% specified in TS. When specifying than one <BR>% sample time, you must check for sample hits explicitly by <BR>% seeing if <BR>% abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD) <BR>% is within a specified tolerance, generally 1e-8. This <BR>% tolerance is dependent upon your model's sampling times <BR>% and simulation time. <BR>% <BR>% You can also specify that the sample time of the S-function <BR>% is inherited from the driving block. For functions which <BR>% change during minor steps, this is done by <BR>% specifying SYS(7) = 1 and TS = [-1 0]. For functions which <BR>% are held during minor steps, this is done by specifying <BR>% SYS(7) = 1 and TS = [-1 -1]. <BR><BR>% Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved. <BR>% $Revision: 1.12 $ <BR><BR>% <BR>% The following outlines the general structure of an S-function. <BR>% <BR>switch flag, <BR> %%%%%%%%%%%%%%%%%% <BR> % Initialization % <BR> %%%%%%%%%%%%%%%%%% <BR> case 0,[sys,x0,str,ts]=mdlInitializeSizes; <BR>$大家是不是觉得此函数名太长,当然可以根据自己的爱好加以改变,不过后面的相应改。 <BR> %%%%%%%%%%%%%%% <BR> % Derivatives % <BR> %%%%%%%%%%%%%%% <BR> case 1,sys=mdlDerivatives(t,x,u); <BR> %%%%%%%%%% <BR> % Update % <BR> %%%%%%%%%% <BR> case 2,sys=mdlUpdate(t,x,u); <BR> %%%%%%%%%%% <BR> % Outputs % <BR> %%%%%%%%%%% <BR> case 3,sys=mdlOutputs(t,x,u); <BR> %%%%%%%%%%%%%%%%%%%%%%% <BR> % GetTimeOfNextVarHit % <BR> %%%%%%%%%%%%%%%%%%%%%%% <BR> case 4,sys=mdlGetTimeOfNextVarHit(t,x,u); <BR> %%%%%%%%%%%%% <BR> % Terminate % <BR> %%%%%%%%%%%%% <BR> case 9,sys=mdlTerminate(t,x,u); <BR> %%%%%%%%%%%%%%%%%%%% <BR> % Unexpected flags % <BR> %%%%%%%%%%%%%%%%%%%% <BR> otherwise, error(['Unhandled flag = ',num2str(flag)]); <BR>end <BR>% end sfuntmpl <BR><BR>% <BR>%============================================================================= <BR>% mdlInitializeSizes <BR>% Return the sizes, initial conditions, and sample times for the S-function. <BR>%============================================================================= <BR>% <BR>function [sys,x0,str,ts]=mdlInitializeSizes <BR>% <BR>% call simsizes for a sizes structure, fill it in and convert it to a <BR>% sizes array. <BR>% <BR>% Note that in this example, the values are hard coded. This is not a <BR>% recommended practice as the characteristics of the block are typically <BR>% defined by the S-function parameters. <BR>% <BR>$关于函数simsizes大家必须遵循,因为把是内部函数,不得随便改变,其作用是返回未初始化的size结构。 <BR>sizes = simsizes; <BR>$number of continuous states <BR>sizes.NumContStates = 0; <BR>$number of discrete states <BR>sizes.NumDiscStates = 0; <BR>$number of outputs <BR>sizes.NumOutputs = 0; <BR>$ number of inputs <BR>sizes.NumInputs = 0; <BR>$Flag for direct feedthrough <BR>sizes.DirFeedthrough = 1; <BR>$number of sample times <BR>sizes.NumSampleTimes = 1; <BR>% at least one sample time is needed <BR>$ <BR>sys = simsizes(sizes); <BR>% <BR>% initialize the initial conditions <BR>% <BR>x0 = []; <BR>% <BR>% str is always an empty matrix <BR>% <BR>str = []; <BR>% <BR>% initialize the array of sample times <BR>% <BR>ts = [0 0]; <BR>% end mdlInitializeSizes <BR>% <BR>%============================================================================= <BR>% mdlDerivatives <BR>% Return the derivatives for the continuous states. <BR>%============================================================================= <BR>% <BR>function sys=mdlDerivatives(t,x,u) <BR>sys = []; % end mdlDerivatives <BR>% <BR>%============================================================================= <BR>% mdlUpdate <BR>% Handle discrete state updates, sample time hits, and major time step <BR>% requirements. <BR>%============================================================================= <BR>% <BR>function sys=mdlUpdate(t,x,u) <BR>sys = []; % end mdlUpdate <BR>% <BR>%============================================================================= <BR>% mdlOutputs <BR>% Return the block outputs. <BR>%============================================================================= <BR>% <BR>function sys=mdlOutputs(t,x,u) <BR>sys = []; % end mdlOutputs <BR>% <BR>%============================================================================= <BR>% mdlGetTimeOfNextVarHit <BR>% Return the time of the next hit for this block. Note that the result is <BR>% absolute time. Note that this function is only used when you specify a <BR>% variable discrete-time sample time [-2 0] in the sample time array in <BR>% mdlInitializeSizes. <BR>%============================================================================= <BR>% <BR>function sys=mdlGetTimeOfNextVarHit(t,x,u) <BR>sampleTime = 1; % Example, set the next hit to be one second later. <BR>sys = t + sampleTime; % end mdlGetTimeOfNextVarHit <BR>% <BR>%============================================================================= <BR>% mdlTerminate <BR>% Perform any end of simulation tasks. <BR>%============================================================================= <BR>% <BR>function sys=mdlTerminate(t,x,u) <BR>sys = []; % end mdlTerminate <BR><BR>在下面我将写几个具体的实例。 <BR><BR>之二、连续系统例子: <BR><BR>function [sys,x0,str,ts] = csfunc(t,x,u,flag) <BR>%CSFUNC An example M-file S-function for defining a continuous system. <BR>% Example M-file S-function implementing continuous equations: <BR>% x' = Ax + Bu <BR>% y = Cx + Du <BR>% <BR>% See sfuntmpl.m for a general S-function template. <BR>% <BR>% See also SFUNTMPL. <BR> <BR>% Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved. <BR>% $Revision: 1.5 $ <BR>A=[-0.09 -0.01; 1 0]; <BR>B=[ 1 -7; 0 -2]; <BR>C=[ 0 2; 1 -5]; <BR>D=[-3 0; 1 0]; <BR>switch flag, <BR> %%%%%%%%%%%%%%%%%% <BR> % Initialization % <BR> %%%%%%%%%%%%%%%%%% <BR> case 0,[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D); <BR> %%%%%%%%%%%%%%% <BR> % Derivatives % <BR> %%%%%%%%%%%%%%% <BR> case 1,sys=mdlDerivatives(t,x,u,A,B,C,D); <BR> %%%%%%%%%%% <BR> % Outputs % <BR> %%%%%%%%%%% <BR> case 3,sys=mdlOutputs(t,x,u,A,B,C,D); <BR> %%%%%%%%%%%%%%%%%%% <BR> % Unhandled flags % <BR> %%%%%%%%%%%%%%%%%%% <BR> case { 2, 4, 9 },sys = []; <BR> %%%%%%%%%%%%%%%%%%%% <BR> % Unexpected flags % <BR> %%%%%%%%%%%%%%%%%%%% <BR> otherwise, error(['Unhandled flag = ',num2str(flag)]); <BR>end <BR>% end csfunc <BR>% <BR>%============================================================================= <BR>% mdlInitializeSizes <BR>% Return the sizes, initial conditions, and sample times for the S-function. <BR>%============================================================================= <BR>% <BR>function [sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D) <BR>sizes = simsizes; <BR>sizes.NumContStates = 2; sizes.NumDiscStates = 0; sizes.NumOutputs = 2; <BR>sizes.NumInputs = 2; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; <BR>sys = simsizes(sizes); x0 = zeros(2,1); str = []; ts = [0 0]; <BR>% end mdlInitializeSizes <BR>% <BR>%============================================================================= <BR>% mdlDerivatives <BR>% Return the derivatives for the continuous states. <BR>%============================================================================= <BR>% <BR>function sys=mdlDerivatives(t,x,u,A,B,C,D) <BR>sys = A*x + B*u; % end mdlDerivatives <BR>% <BR>%============================================================================= <BR>% mdlOutputs <BR>% Return the block outputs. <BR>%============================================================================= <BR>% <BR>function sys=mdlOutputs(t,x,u,A,B,C,D) <BR>sys = C*x + D*u; % end mdlOutputs <BR> |
|