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 = []; % 程序结束