首先我参考了网上一篇文章,好似是某些所谓的老师发表的大作,不知是不是为了评什么才发表的,即使这样,你也要认真对待呀,md现在的报刊也是真tm贱,只要给钱就发,不管有没有质量。
自己还没整明白就乱发,并且也不注意细节。
后来自己干脆回到matlab的help里面去学习,人家做的真是没的说,所以以后还是建议大家有问题找help,是在不行了再在网络上搜索。
s函数结构的具体分析:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag) 先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模 块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,哈哈,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面是自己的代码:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function [sys,x0,str,ts] = sfunt(t,x,u,flag,b) %定义函数名称:sfunt
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,b);
% GetTimeOfNextVarHit %
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
% Terminate %
case 9,
sys=mdlTerminate(t,x,u);
% Unexpected flags %
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
% end sfuntmpl
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
function [sys,x0,str,ts]=mdlInitializeSizes
%调用函数simsizes以创建结构体sizes
sizes = simsizes;
%用初始化信息填充结构体sizes
sizes.NumContStates = 1; %包含一个连续状态
sizes.NumDiscStates = 0; %无离散状态
sizes.NumOutputs = 1; %有一个输出量
sizes.NumInputs = 1; %有一个输入信号
sizes.DirFeedthrough = 0; %不包含直接馈通(输出量中不含输入量)
sizes.NumSampleTimes = 1; % (单个采样周期)at least one sample time is needed
%根据上面的设置设定系统初始化参数
sys = simsizes(sizes);
%给其他返回参数赋值
% initialize the initial conditions
x0 = [0]; %设置初始状态为零状态
% str is always an empty matrix
str = []; %将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 = u;
% 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:当flag值为3时,计算输出量
% Return the block outputs.
%=============================================================================
function sys=mdlOutputs(t,x,u,b)
if(x <= b)
sys = x;
else
sys = 2;
end
% 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
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 结果截图: