gusucode.com > matlab通信工程仿真源码(张德丰等编著)程序书籍 > matlab_code/matlab通信工程仿真源码(张德丰等编著)/第6章/li6_5.m

    function [sys,x0,str,ts]=li6_5fun(t,x,u,flag,kp,ki,kd)
switch flag,
%初始化函数
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
%求导数
  case 1,
    sys=mdlDerivatives(t,x,u);
%状态更新
  case 2,
    sys=mdlUpdate(t,x,u,kp,ki,kd);
%计算输出
  case 3,
    sys=mdlOutputs(t,x,u,kp,ki,kd);
%计算下一个采样时刻
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);
%终止仿真程序
  case 9,
    sys=mdlTerminate(t,x,u);
%错误处理
  otherwise
    DAStudio.error(['Simulink:blocks:unhandledFlag', num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes %模型初始化函数
sizes = simsizes;                           %取系统默认设置
sizes.NumContStates  = 0;                   %设置离散状态变量的个数
sizes.NumDiscStates  =4;                    %离散系统输出个数
sizes.NumOutputs     = 1;                   %设置系统输出变量的个数
sizes.NumInputs      = 1;                   %设置系统输入变量的个数
sizes.DirFeedthrough = 0;                   %设置系统是否直通
sizes.NumSampleTimes = 1;                   % 采样周期的个数,必须大于等于1
sys = simsizes(sizes);                      %设置系统参数
x0  = [0;0;0;0];                              %系统状态初始化
str = [];                                   %系统阶字串总为空矩阵
ts  = [-2 0]; 
%ts(1)=-2表示采样时间由flag=4和mdlGetTimeOfNextVarHit(t,x,u)决定下一个采样时刻
function sys=mdlDerivatives(t,x,u)
sys=[];
function sys=mdlUpdate(t,x,u,kp,ki,kd)
x(3)=x(2);
x(2)=x(1);
x(1)=u;
x(4)=u+x(4);
sys=x;
function sys=mdlOutputs(t,x,u,kp,ki,kd)
sys=kp*x(1)+ki*0.01*x(4)+kd*(x(2)-x(3))/0.01;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime =0.01;    %设置采样周期
sys = t + sampleTime;
% mdlTerminate终止仿真设定,完成仿真终止时的任务
function sys=mdlTerminate(t,x,u)
sys = [];
% 程序结束