1、高范强IEE 版权所有 1S-Function 使用及应用举例 【说明】近来在论坛中很多朋友问及 Simulink 下的 S- 函数的编写及使用方法,在西安交大 BBS 上,hii_yzf 网友发表了有关 S-函数使用的文章,举例比较详尽,相信对关心 S- 函数的网友会有很大帮助。 发信人: hii_yzf ( 叶子), 信区: MathTools 标 题: S-FUNCTIONS 的书写之一 发信站: 交通大学思源 BBS 站 (Mon Apr 16 16:35:09 2001) , 站内信件 S-FUNCTIONS 的书写之一 s-function 也就是 system-function
2、的缩写。说得简单,s-function 就是用 MATLAB 所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。要了解 s-function,必须了解以下知识: (1 )direct feedthrough (2 )dynamically sized inputs (3 )setting sample times and offsets 由于我也不知道怎么把上面三句话精确的翻译成中文,因此在此不加翻译,大家自己理解,也许更好 由于上面三部分的重要性,在此详细进行分析。 一.direct feedthrough direct feedthrough 意思是说系统的输
3、出或可变采样时间是否受到输入的控制。大家清楚有的系统是受到输入控制如: 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 time
4、s 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 G
5、eneral M-file S-function template 高范强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-func
6、tion 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, ret
7、urn 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
8、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 % use
9、d 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
10、be specified % as -1 indicating that they are dynamically sized. The 高范强IEE 版权所有 3% 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 feedt
11、hrough 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 = In
12、itial 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 sam
13、ple time. % 0 1, : Continuous, but fixed in minor step % sample time. % PERIOD OFFSET, : Discrete sample time where % PERIOD 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
14、 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 % tol
15、erance is dependent upon your models 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 whic
16、h 高范强IEE 版权所有 4% 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 % % cas
17、e 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); % % Ter
18、minate % % case 9,sys=mdlTerminate(t,x,u); % % Unexpected flags % % otherwise, error(Unhandled flag = ,num2str(flag); end % end sfuntmpl % %=高范强IEE 版权所有 5= % mdlInitializeSizes % Return the sizes, initial conditions, and sample times for the S-function. %= % function sys,x0,str,ts=mdlInitializeSizes
19、 % % 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. % $关于函数 simsizes 大家必须遵循,因为把
20、是内部函数,不得随便改变,其作用是返回未初始化的 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; $numbe
21、r 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 % 高范强IEE 版权所有 6ts = 0 0; % end mdlInitializeSizes % %= % mdlDe
22、rivatives % 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 % %= %
23、 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-ti
24、me sample time -2 0 in the sample time array in % mdlInitializeSizes. %= % 高范强IEE 版权所有 7function 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 simulatio
25、n 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
26、 + 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=mdlInitia
27、lizeSizes(A,B,C,D); % % Derivatives % % case 1,sys=mdlDerivatives(t,x,u,A,B,C,D); % 高范强IEE 版权所有 8% 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 % %= % mdlIni
28、tializeSizes % Return the sizes, initial conditions, and sample times for the S-function. %= % function sys,x0,str,ts=mdlInitializeSizes(A,B,C,D) sizes = simsizes; sizes.NumContStates = 2; sizes.NumDiscStates = 0; sizes.NumOutputs = 2; sizes.NumInputs = 2; sizes.DirFeedthrough = 1; sizes.NumSampleTi
29、mes = 1; sys = simsizes(sizes); x0 = zeros(2,1); str = ; ts = 0 0; % end mdlInitializeSizes % %= % mdlDerivatives % Return the derivatives for the continuous states. %= % function sys=mdlDerivatives(t,x,u,A,B,C,D) sys = A*x + B*u; % end mdlDerivatives % %= % mdlOutputs % Return the block outputs. %=
30、 高范强IEE 版权所有 9% function sys=mdlOutputs(t,x,u,A,B,C,D) sys = C*x + D*u; % end mdlOutputs 之三、有关离散系统 关于离散系统定义的书写在此举一例: function sys,x0,str,ts = dsfunc(t,x,u,flag) %DSFUNC An example M-file S-function for defining a discrete system. % Example M-file S-function implementing discrete equations: % x(n+1)
31、= Ax(n) + Bu(n) % y(n) = Cx(n) + Du(n) % % 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.13 $ % Generate a discrete linear system: A=-1.3839 -0.5097 1.0000 0; B=-2.5559 0 0 4.2382; C= 0 2.
32、0761 0 7.7891; D= -0.8141 -2.9334 1.2426 0; switch flag, % Initialization case 0,sys,x0,str,ts = mdlInitializeSizes(A,B,C,D); % Update % % case 2, sys = mdlUpdate(t,x,u,A,B,C,D); % % Output % % case 3, sys = mdlOutputs(t,x,u,A,C,D); % % Terminate % % case 9, sys = ; % do nothing % % Unexpected flags
33、 % % otherwise, error(unhandled flag = ,num2str(flag); end %end dsfunc % %= % mdlInitializeSizes % Return the sizes, initial conditions, and sample times for the S-function. %= % function sys,x0,str,ts = mdlInitializeSizes(A,B,C,D) sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = siz
34、e(A,1); sizes.NumOutputs = size(D,1); 高范强IEE 版权所有 10sizes.NumInputs = size(D,2); sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = ones(sizes.NumDiscStates,1); str = ; ts = 1 0; % end mdlInitializeSizes % %= % mdlUpdate % Handle discrete state updates, sample time hits,
35、 and major time step % requirements. %= % function sys = mdlUpdate(t,x,u,A,B,C,D) sys = A*x+B*u; %end mdlUpdate % %= % mdlOutputs % Return Return the output vector for the S-function %= % function sys = mdlOutputs(t,x,u,A,C,D) sys = C*x+D*u; %end mdlUpdate S-FUNCTIONS 的书写之四(离散和连续的混合型) function sys,x
36、0,str,ts = mixedm(t,x,u,flag) %MIXEDM An example integrator followed by unit delay M-file S-function % Example M-file S-function implementing a hybrid system consisting % of a continuous integrator (1/s) in series with a unit delay (1/z). % Sampling period and offset for unit delay. dperiod = 1; dof
37、fset = 0; switch flag % % Initialization % % case 0, sys,x0,str,ts=mdlInitializeSizes(dperiod,doffset); % % Derivatives % % 高范强IEE 版权所有 11case 1, sys=mdlDerivatives(t,x,u); % % Update % % case 2, sys=mdlUpdate(t,x,u,dperiod,doffset); % % Output % % case 3, sys=mdlOutputs(t,x,u,doffset,dperiod); % %
38、Terminate % % case 9, sys = ; % do nothing otherwise, error(unhandled flag = ,num2str(flag); end % end mixedm % %= % mdlInitializeSizes % Return the sizes, initial conditions, and sample times for the S-function. %= % function sys,x0,str,ts=mdlInitializeSizes(dperiod,doffset) sizes = simsizes; sizes
39、.NumContStates = 1; sizes.NumDiscStates = 1; sizes.NumOutputs = 1; sizes.NumInputs = 1; sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 2; sys = simsizes(sizes); x0 = ones(2,1); str = ; ts = 0 0; % sample time dperiod doffset; % end mdlInitializeSizes % %= % mdlDerivatives % Compute derivatives for continuous states. %= % function sys=mdlDerivatives(t,x,u) sys = u; % end mdlDerivatives % %= % mdlUpdate % Handle discrete state updates, sample time hits, and major time step % requirements. 高范强IEE 版权所有 12%= % function sys=mdlUpdate(t,x,u,dperiod,doffset) % next discrete state is output of the i