Increased Stability Margin by Cascade Control
Authors: Housam Binous and Ahmed Bellagi
Increased Stability Margin by Cascade Control
Authors: Housam Binous and Ahmed Bellagi
Authors: Housam Binous and Ahmed Bellagi
First, we assume that Gc1 is a P-only controller and compute its the ultimate gain, Kcu1, for two cases : (1) a cascade configuration, which has a P-only controller in the primary loop and a proportional controller in the secondary loop (Kc2 = 4). (2) a conventional controller set-up by setting Gc2 = 1 and Gm2 = 0.We find that the cascade configuration has higher Kcu1 (43.31 versus 11.25 for the conventional configuration). Hence, the cascade configuration increases the stability margin by nearly a factor of four. It should bee noted that increasing Kc2 will result in even larger values for Kcu1.with Reference :[1] D. E. Seborg, T. F. Edgar, D. A. Mellichamp, and F. J. Doyle III, Process Dynamics and Control, 4th ed., New York: Wiley, 2017.
Kcu1forcase(a)
In[]:=
Gv=5/(s+1);Gp1=4/(4s+1)/(2s+1);Gp2=1;Gd2=1;Gm1=0.05;Gm2=0.2;Gd1=1/(3s+1);
In[]:=
Gc2=Kc2;Kc2=4;
In[]:=
Gc1=Kcu1;
In[]:=
1+Gc2GvGp2Gm2+Gc1Gc2GvGp2Gp1Gm1//Factor
Out[]=
1.(0.625+0.5Kcu1+3.875s+5.75+1.)
2
s
3
s
(0.25+1.s)(0.5+1.s)(1.+1.s)
In[]:=
sol=NSolve[0.625+0.5Kcu1+3.875s+5.75s^2+1.s^30,s];
In[]:=
s1=s/.sol[[1]];
In[]:=
FindRoot[Re[s1]0,{Kcu1,10}]
Out[]=
{Kcu143.3125}
Kcu1forcase(b)
In[]:=
1+Gc1GvGp2Gp1Gm1//Factor
Out[]=
0.125(1.+1.Kcu1+7.s+14.+8.)
2
s
3
s
(0.25+1.s)(0.5+1.s)(1.+1.s)
In[]:=
sol=NSolve[1.+1.Kcu1+7.s+14.s^2+8.s^30,s];
In[]:=
s1=s/.sol[[1]];
In[]:=
FindRoot[Re[s1]0,{Kcu1,10}]
Out[]=
{Kcu111.25}
A comparison of D2 unit step responses with (dashed red) and without (blue) cascade control.
Clearly, we demonstrate that the cascade control system is clearly superior to a conventional PI controller for a secondary loop disturbance
Clearly, we demonstrate that the cascade control system is clearly superior to a conventional PI controller for a secondary loop disturbance
In[]:=
Kc1=1;tauI1=4;
In[]:=
Gc1=Kc1(1+1/tauI1/s)
Out[]=
1+
1
4s
In[]:=
Ycascade=1/sGp1Gd2/(1+Gc2GvGp2Gm2+Gc1Gc2GvGp2Gp1Gm1)//Factor
Out[]=
0.5(1.+1.s)
(0.25+1.s)(5.02202+1.s)(0.0995616+0.477983s+1.)
2
s
In[]:=
ycascade=InverseLaplaceTransform[Ycascade,s,t]
Out[]=
0.5(0.0367732+3.69231-(1.86454+0.525515)((0.852817-0.52221)+(1.+0.)))
-5.02202t
-0.25t
(-0.238991-0.206021)t
(0.+0.412042)t
In[]:=
YPIConventional=1/sGd2Gp1/(1+Gc1GvGp2Gp1Gm1)//Factor
Out[]=
0.5(1.+1.s)
(0.25+1.s)(1.16236+1.s)(0.10754+0.337641s+1.)
2
s
In[]:=
yPIConventional=InverseLaplaceTransform[YPIConventional,s,t]
Out[]=
0.5(0.166913+9.6-(4.88346+1.68094)((0.788139-0.615497)+(1.+0.)))
-1.16236t
-0.25t
(-0.168821-0.28114)t
(0.+0.56228)t
In[]:=
Plot[{ycascade,yPIConventional},{t,0,40},FrameTrue,GridLinesAutomatic,AspectRatio1,FrameLabel{Style["time",14,Italic],Style["y1",14,Italic]},PlotRangeAll,PlotStyle{{Thick,Dashed,Darker@Red},{Thick,Darker@Blue}}]
Out[]=
A comparison of D1 unit step responses with (dashed red) and without (blue) cascade control.
Here, the cascade control system does not result in a huge improvement in primary loop disturbance rejection when compared to the conventional PI controller.
Here, the cascade control system does not result in a huge improvement in primary loop disturbance rejection when compared to the conventional PI controller.
In[]:=
Ycascade=1/sGd1(1+Gc2GvGp2Gm2)/(1+Gc2GvGp2Gm2+Gc1Gc2GvGp2Gp1Gm1)//Factor
Out[]=
0.333333(0.5+1.s)(5.+1.s)
(0.333333+1.s)(5.02202+1.s)(0.0995616+0.477983s+1.)
2
s
In[]:=
ycascade=InverseLaplaceTransform[Ycascade,s,t]
Out[]=
0.333333(-0.000926468+3.23077-(1.61492+3.1559)((-0.584973-0.811053)+(1.+0.)))
-5.02202t
-0.333333t
(-0.238991-0.206021)t
(0.+0.412042)t
In[]:=
YPIConventional=1/sGd1/(1+Gc1GvGp2Gp1Gm1)//Factor
Out[]=
0.333333(0.5+1.s)(1.+1.s)
(0.333333+1.s)(1.16236+1.s)(0.10754+0.337641s+1.)
2
s
In[]:=
yPIConventional=InverseLaplaceTransform[YPIConventional,s,t]
Out[]=
0.333333(-0.121669+1.26316-(0.570744+1.93306)((-0.839631-0.543158)+(1.+0.)))
-1.16236t
-0.333333t
(-0.168821-0.28114)t
(0.+0.56228)t
In[]:=
Plot[{ycascade,yPIConventional},{t,0,40},FrameTrue,GridLinesAutomatic,AspectRatio1,FrameLabel{Style["time",14,Italic],Style["y1",14,Italic]},PlotRangeAll,PlotStyle{{Thick,Dashed,Darker@Red},{Thick,Darker@Blue}}]
Out[]=