cdwxg 发表于 2007-5-12 23:23

原帖由 franny4611 于 2007-5-12 23:18 发表 http://forum.vibunion.com/forum/images/common/back.gif
唉,今天都快被搞疯了。也找不到比较好的例子
呵呵,探讨中已经有了很多思考,虽然没有结果,但思考的过程是很重要的
明天再继续,例子方面你看下help里面的s函数的例子,然后搜索下论坛有没有好的s函数的例子,以及关于S函数的帖子
慢慢来哈:handshake

franny4611 发表于 2007-5-12 23:37

嗯,学习是得慢慢来的,不过看来是没办法得出结果了,因为明天要交论文了,以后还得继续努力啊,谢谢大家的帮助,以后还得继续努力:handshake

cdwxg 发表于 2007-5-12 23:47

原帖由 franny4611 于 2007-5-12 23:37 发表 http://forum.vibunion.com/forum/images/common/back.gif
嗯,学习是得慢慢来的,不过看来是没办法得出结果了,因为明天要交论文了,以后还得继续努力啊,谢谢大家的帮助,以后还得继续努力:handshake
这样啊,可不好意思,帮不了你了,不过我估计不是个大问题,但现在我也看不上去了,程序的东西就是这样很容易短路。。。
学位论文是吧,没关系的,可以把问题反映出来一样的:)

franny4611 发表于 2007-5-13 14:48

论文要改,cdwxg大哥解决了问题告诉我一下

franny4611 发表于 2007-5-13 22:23

function = mdlInitializeSizes()

sizes = simsizes;
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs   = -1;
sizes.NumInputs      = -1;
sizes.DirFeedthrough = 1;   
sizes.NumSampleTimes = 1;

sys = simsizes(sizes);
str = [];
x0= [];
ts= [-1 0];
反复的试,终于成功了,改成上面那样就没问题了,output里面不变

cdwxg 发表于 2007-5-14 11:21

原帖由 franny4611 于 2007-5-13 22:23 发表 http://www.chinavib.com/forum/images/common/back.gif
function = mdlInitializeSizes()

sizes = simsizes;
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs   = -1;
sizes.NumInputs      = -1;
sizes.DirFe ...
sizes.NumOutputs   = -1;
sizes.NumInputs      = -1;
分别是输出变量和输入变量的个数,怎么会是-的?
另外ts=【-1 0】这个-1表示什么?这个是采样时间,是否表示了sample的-1即无穷?
那如果是-2呢?

cdwxg 发表于 2007-5-14 11:46

ts = [-2 0];      % variable sample time
ts= ;       % sample time:
ts = ;      %the sampletime is continuous, so set ts to 0 and its offset to 0.
ts = [-1 0];       % Inherited sample time
但始终认为你的那个输入和输出变量那里的-1是不对的。
:@Q

YZ350 发表于 2007-5-14 17:02

将输入的调入到状态变量,将状态变量个数设为2.然后在输出函数中调用状态变量,不要直接调用输入。并且x0要设初值。

YZ350 发表于 2007-5-14 17:05

-1表示是继承输入和输出个数,即,输入输出不用自己设定个数,而是由你S-function链接的模块决定的,但是只能是一维的。

cdwxg 发表于 2007-5-14 17:26

原帖由 YZ350 于 2007-5-14 17:05 发表 http://www.chinavib.com/forum/images/common/back.gif
-1表示是继承输入和输出个数,即,输入输出不用自己设定个数,而是由你S-function链接的模块决定的,但是只能是一维的。
但是他的图形明明就可以看出输出和输入的个数,何必写-1呢?而且很少见到这种写法,不过sample time倒很多-1的时候.

franny4611 发表于 2007-5-14 17:55

-1是我看例子写的,后来改成自己输入输出的个数了

cdwxg 发表于 2007-5-14 20:16

转一个M文件的S-函数模版,这个是一个会员曾经发的,我看了下,很多东西介绍的比较清楚,希望对大家有用。
function = sfuntmpl(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:
% = 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 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 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-2002 The MathWorks, Inc.
% $Revision: 1.18 $

%
% The following outlines the general structure of an S-function.
%
switch flag,

%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0,
=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 =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.
%
sizes = simsizes;

sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 0;
sizes.NumInputs = 0;
sizes.DirFeedthrough = 1;
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 = ;

% 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

cdwxg 发表于 2007-5-14 20:23

在MATLAB软件根目录上的toolboxsimulinklocks子目录下的sfuntmple.m
这是S函数M文件形式的标准模板程序,是一个特殊的M文件,你可以根据此M文件里面的提示填入或者更改参数以为己用

另外可以看下[分享]Simulink S函数在现代矢量控制系统仿真中的应用
这个文章
http://forum.vibunion.com/forum/thread-4356-1-34.html

[ 本帖最后由 cdwxg 于 2007-5-14 20:46 编辑 ]

cdwxg 发表于 2007-5-14 20:57

继续:s-funciton使用及应用举例 转贴

看下该帖子
http://forum.vibunion.com/forum/thread-11632-1-27.html

cjclj 发表于 2007-5-20 17:08

在0时刻就开始OUTPUT函数出错,说明你的输入有问题.
页: 1 2 [3]
查看完整版本: s函数的问题