仍以二阶线性传递函数为被控对象,进行模拟PID 控制。被控对象形式为,其中b为在[103,163]范围内随机变化,a为在[15,35]范围内随机变化,则被控对象的描述方式可转换为:
S函数是Simulink一项重要的功能,采用S函数可实现在Simulink下复杂控制器和复杂被控对象的编程。在仿真一的基础上,利用S函数实现上述对象的表达、控制器的设计及仿真结果的输出。
在S函数中,采用初始化、微分函数和输出函数,即 mdlInitializeSizes函数、mdlDerivatives函数和mdlOutputs函数。在初始化中采用sizes结构,选择2个输出、3个输入,3个输入实现了P、I、D三项的输入。S函数嵌入在Simulink程序中。系统初始状态为:x(0)=0,。仿真结果如图所示。
仿真图:
主程序:chap_3s.m
%S-function for continuous state equation
function [sys,x0,str,ts]=s_function(t,x,u,flag)
switch flag,
%Initialization
case 0,
[sys,x0,str,ts]-mdlInitializeSizes;
%Outputs
case 3,
sys=mdlOutputs(t,x,u);
%Unhandled flags
case {2,4,9}
sys=[1;
%Unexpected flags
otherwise
error(['Unhandled flag-',num2str(flag)D);
end
%mdllnitializeSizes
function [sys,x0,str,ts]=mdlInitializeSizes
sizes= simsizes;
sizes.NumContStates =0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.Numlnputs-3
sizes.DirFeedthrough=1;
sizes.NumSample Times= 0;
sys=simsizes(sizes);
x0=[ ];
str=[ ];ts=[ ];
function sys=mdIOutputs(t,x,u)
error=u(1);
derror=u(2);
errori=u(3);
kp=60;
ki=1;
kd=3;
ut=kp*error+kd*derror+ki*errori;
sys(1)=ut;
被控对象程序:chap_3plant.m
%S-function for continuous state equation
function [sys,x0,str,ts]=s_function(t,x,u,flag)
switch flag,
%Initialization
case 0,
[sys,x0,str,ts]=mdllnitializeSizes;
case 1,
sys=mdlDerivatives(t,x ,u);
%Outputs
case 3,
sys=mdIOutputs(t,x,u);
%Unhandled flags
case {2,4,9}
sys =D;
%Unexpected flags
otherwise
error(TUnhandled flag =',num2str(flag)]);
end
%mdlInitializeSizes
function [sys,x0,str,ts]=mdllnitializeSizes
sizes = simsizes;
sizes.NumContStates=2;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.Numlnputs=1;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes= 0;
sys=simsizes(sizes);
x0=[0.0]:
str=[ ];
ts=[ ];
function sys-mdlDerivatives(t,x,u)
sys(1)=x(2);
%sys(2)=-(25+5*sin(t))*x(2)+(133+10*sin(t))*u;
sys(2)=-(25+10*rands(1))*x(2)+(133+30*rands(1))*u;
function sys=mdlOutputs(t,x,u)
sys(1)=x(1);
作图程序:chap1_3plot.m
close all;
plot(ty(, 1).'r,ty(:,2),k:1,linewidth',2);
xlabel('time(s)');ylabel('yd.y');
legend('Tdeal position signal',Position tracking');