1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
// Copyright INRIA
exec(SCI+'/demos/control/scheme.dem');
s=poly(0,'s');z=poly(0,'z');
x_message('Example of PID Design ')
n=x_choose(['Continuous time';'Discrete time'],'Select time domain');
select n
case 0
warning('Demo stops!');return;
case 1
mode(1)
dom='c';
s=poly(0,'s');
str='[(s-1)/(s^2+5*s+1)]';
rep=x_dialog('Nominal plant?',str);
if rep==[] then return,end
Plant=evstr(rep);
Plant=syslin('c',Plant);
mode(-1)
case 2
mode(1)
dom='d'
z=poly(0,'z');
str='(z+1)/(z^2-5*z+2)'
rep=x_dialog('Nominal plant?',str);
if rep==[] then return,end
Plant=evstr(rep)
Plant=syslin('d',Plant);
mode(-1)
end
//Nominal Plant
P22=tf2ss(Plant); //...in state-space form
[ny,nu,nx]=size(P22);
defv=['-1.2','1','0.1'];
if dom=='d' then defv=['-10','1','0.1'];end
while %t
mode(1)
if dom=='c' then
title='Enter your PID controller K(s)=Kp*(1+T0/s+T1*s)';
end
if dom=='d' then
title='Enter your PID controller K(z)=Kp*(1+T0/z+T1*z)';
end
defv=x_mdialog(title,['Kp=';'T0=';'T1='],defv);
if defv==[] then warning('Demo stops!');return;end
Kp=evstr(defv(1));T0=evstr(defv(2));T1=evstr(defv(3));
if dom=='c' then
Kpid=tf2ss(Kp*(1+T0/s+T1*s));
end
if dom=='d' then
Kpid=tf2ss(Kp*(1+T0/z+T1*z));
end
W=[1, -P22;
Kpid,1];Winv=inv(W);
disp(spec(Winv(2)),'closed loop eigenvalues');//Check internal stability
if maxi(real(spec(Winv(2)))) > 0 then
x_message('You loose: closed-loop is UNSTABLE!!!');
else
x_message('Congratulations: closed-loop is STABLE !!!');
break;
end
mode(-1)
end
mode(1)
[Spid,Rpid,Tpid]=sensi(P22,Kpid); //Sensitivity functions
Tpid(5)=clean(Tpid(5));
disp(clean(ss2tf(Spid)),'Sensitivity function');
disp(clean(ss2tf(Tpid)),'Complementary sensitivity function');
resp=['Frequency response';'Time response'];
while %t do
n=x_choose(resp,'Select response(s)');
if degree(Tpid(5))>0 then
warning('Improper transfer function! D(s) set to D(0)')
Tpid(5)=coeff(Tpid(5),0);
end
Tpid(5)=coeff(Tpid(5));
select n
case 0
break
case 1
mode(1)
xbasc(1);xset("window",1);xselect();bode(Tpid);
mode(-1)
case 2
if Plant(4)=='c' then
mode(1)
defv=['0.1','50'];
title='Enter Sampling period and Tmax';
rep=x_mdialog(title,['Sampling period?';'Tmax?'],defv);
if rep==[] then break,end
dttmax=evstr(rep);
dt=evstr(dttmax(1));tmax=evstr(dttmax(2));
t=0:dt/5:tmax;
n1=x_choose(['Step response?';'Impulse response?'],'Simulation:');
if n1==0 then
warning('Demo stops!');return;
end
if n1==1 then
xbasc(1);xset("window",1);xselect();
plot2d([t',t'],[(csim('step',t,Tpid))',ones(t')])
end
if n1==2 then
xbasc(1);xset("window",1);xselect();
plot2d([t',t'],[(csim('impul',t,Tpid))',0*t'])
end
mode(-1)
elseif Plant(4)=='d' then
mode(1)
defv=['100'];
title='Tmax?'
rep=x_mdialog(title,['Tmax='],defv);
if rep==[] then break,end
Tmax=evstr(rep);
mode(-1)
while %t do
n=x_choose(['Step response?';'Impulse response?'],'Simulation:');
select n
case 0 then
break
case 1 then
mode(1)
u=ones(1,Tmax);u(1)=0;
xbasc(1);xset("window",1);xselect();
plot2d([(1:Tmax)',(1:Tmax)'],[(dsimul(Tpid,u))',(ones(1:Tmax)')])
mode(-1)
case 2 then
mode(1)
u=zeros(1,Tmax);u(1)=1;
xbasc(1);xset("window",1);xselect();
plot2d((1:Tmax)',(dsimul(Tpid,u))')
mode(-1)
end
end
end
end
end
|