我有一个问题,关于把一个PID控制器在我的simulink文件。
在我的simulink文件中,我使用pid控制器来控制我的过程。我使用s函数作为我的流程框图。
根据Ziegler-Nichols方法,对于第一步,我们将k设置为最小值(0.5),因此我将0.5放入我的比例值。但有无控制器的结果并没有什么不同,即使我增加或减少比例值。
为什么会出现这个问题?希望有人能帮助我。2谢谢。
我的框图看起来像下面的图片.参考这张图片
http://s1009.photobucket.com/albums/af218/syarinazulkifeli/?action=view¤t=Untitled-1.png
下面是我的s-function文件:
function [sys,x0,str,ts]= reactor_sfcn(t,x,u,flag)
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes;
case 1,
sys = mdlDerivatives(t,x,u);
case 3,
sys = mdlOutputs(t,x,u);
case 9
sys =[];
end
function [sys,x0,str,ts] = mdlInitializeSizes()
s = simsizes;
s.NumContStates = 11;
s.NumDiscStates = 0;
s.NumOutputs = 11;
s.NumInputs = 1;
s.DirFeedthrough = 0;
s.NumSampleTimes = 1;
sys = simsizes(s) ;
x0 = [0.0258,0,0,0,0,0,0,0,8.83,303.15,303.15];
str=[] ;
ts = [0 0];
function sys = mdlDerivatives (t,x,u)
Tjo = u;
sys = reactor(t,x,Tjo);
function sys = mdlOutputs(t,x,u)
% sys(1)=x(1);
% sys(2)=x(2);
% sys(3)=x(3);
% sys(4)=x(4);
% sys(5)=x(5);
% sys(6)=x(6);
% sys(7)=x(7);
% sys(8)=x(8);
% sys(9)=x(9);
% sys(10)=x(10);
% sys(11)=x(11);
sys = x;
s函数文件的链接
function DXDT = reactor(t,x,Tjo)
% -------------------------------------------- %
% Parameters definition
% -------------------------------------------- %
I = x(1); X = x(2); P0 = x(3);
P1 = x(4); P2 = x(5); Q0 = x(6);
Q1 = x(7); Q2 = x(8); M = x(9);
Tjo = x(10); T = x(11);
% ---------------------------------------
% Constants
% =======================================
%constant
M0 = 8.83;
I0 = 0.0258;
Qh = 60.44;
MMWm = 100.3;
U0 = 55.1;
% Densities
dp = 1200;
dm = 968-1.225*(T-273.15);
Rhoc = 998;
% volume expansion factor
Fev = (dm - dp)./dp ;
% volume fraction
Fvm = (1 - X)./(1 + Fev*X);
Fvp = X*(1-Fev)./(1+Fev*X);
% Total reactant mixture density
Rho = dm*Fvm + dp*Fvp;
% Reactor and jacket volume
Vc = 2;
V = 2;
% Reactor dimension
At =3.1416*0.15*0.113;
% coolant flow rate
Mc = 0.41/18;
%
Cpc = 77.22;
Cp = 199.13;
% Average coolant temperature
Tji = 303.15;
Tj =(Tji+Tjo)/2;
% Overall heat transfer coeff
alpha = 0.4;
U = U0-alpha*X;
delHp = 57800;
% ---------------------------------------
% Rates of reaction
% =======================================
% Fujita-Doolittle equation
Tgp = 114 +273.25 ;
A = 0.168-8.21e-6*(T-Tgp)^2;
B = 0.03;
g = exp(2.303*Fvm/(A + B*Fvm));
% Dissociation rate
F = 0.58;
Kd = (6.32e16*exp(-15.43e3/T));
% Propagation rate
Tep = 5.4814e-16*exp(13982/T);
Kp0 = 2.952e7*exp(-4353/(1.987*T));
Kp = (Kp0*g)./(g + (Tep*P0.*Kp0));
% Termination rate
Tet = (1.1353e-22*exp(17420/T))./I0;
Kt0 = 5.88e9*exp(-701/(1.987*T));
Kt = (Kt0*g)./(g + (Tet*P0.*Kt0));
Ktc = 0;
Ktd = Kt ;
% -------------------------------------------- %
% ODE's
% -------------------------------------------- %
dIdt = -Kd*I - ((Fev*I.*P0.*(1 - X)*Kp)./(1 + Fev*X));
dXdt = Kp*(1 - X).*P0;
dP0dt = (-Fev*P0.*P0.*(1 - X)./(1 + Fev*X)).*Kp + 2*F*Kd*I - Kt*P0.*P0;
dP1dt = (-Fev*P0.*P1.*(1 - X)./(1 + Fev*X)).*Kp + 2*F*Kd*I - Kt*P0.*P1 + (Kp*M0*(1 - X)./(1 + Fev*X)).*P0;
dP2dt = (-Fev*P0.*P2.*(1 - X)./(1 + Fev*X)).*Kp + 2*F*Kd*I - Kt*P0.*P2 + (Kp*M0*(1 - X)./(1 + Fev*X)).*(2*P1 + P0);
dQ0dt = (-Fev*P0.*Q0.*(1 - X)./(1 + Fev*X)).*Kp + Ktd*P0.*P0 + 0.5*Ktc*P0.*P0;
dQ1dt = (-Fev*P0.*Q1.*(1 - X)./(1 + Fev*X)).*Kp + Ktd*P0.*P1 + Ktc*P0.*P1;
dQ2dt = (-Fev*P0.*Q2.*(1 - X)./(1 + Fev*X)).*Kp + Ktd*P0.*P2 + Ktc*(P1.*P0 + P1.^2);
dMdt = (-Kp*P0*M0*(1 - X)./(1 + Fev*X)).*((Fev*(1 - X)./(1 + Fev*X)) + 1);
Rm = (-delHp)*dMdt;
dTjodt = (Mc*Cpc*(Tji-Tjo)+ U*At*(T-Tj))/(Vc*Rhoc*Cpc/18);
dTdt = (Qh+(Rm*V*MMWm)-(U*At*(T-Tj)))/(V*Rho*Cp);
DXDT =[dIdt;dXdt;dP0dt;dP1dt;dP2dt;dQ0dt;dQ1dt;dQ2dt;dMdt;dTjodt;dTdt];
2条答案
按热度按时间6fe3ivhb1#
首先,我不会检查进程的s函数是否按预期工作。断开PID控制器并连接步进、斜坡或正弦块。这可以给予你一个提示,如果该进程的块是好的,静态系数有多大。
第二个提示:Ziegler-Nichols方法指出应该增加Kp直到系统变得边缘稳定。您是否只测试了比例增益的一个值?根据工厂的情况,0.5可能是非常小的值,并且低于您控制系统所需的水平。
bqujaahr2#
你改变了Kp项,但没有改变……你给予了系统一个步进命令吗?是否将实际和期望信号误差反馈到PID控制器?如果满足这些条件,并且系统仍然对Kp不敏感,则可能需要逐个块检查模型以找到问题。还有,你为什么用S函数来建模你的植物?实现这些可能是棘手的。我更希望看到图表形式的工厂模型,或者至少是嵌入式的模型。
对于步骤输入,我会推荐这个链接或谷歌它。你需要将Kp设置得相当高,然后给予它一个阶跃命令输入,使系统不稳定,然后改变Kp,直到它稳定,并测量振荡周期。
我把一个玩具模型放在一起供你测试,我也倾向于相信你的s函数在这里出错了。如果你想发布/发送sfunction,我很乐意看看它。但是,如果你想学习齐格勒-尼科尔斯,从一个非常简单的模型开始,并按照齐格勒-尼科尔斯过程中的步骤。下面是我的一些数据的输出,其中包含一个
Kp = 200
和一个1/(s+1)
的工厂:所以你可以看到上面的振荡。
Kp = 200
太高了,你必须把它减少很多,但我只是想给予你一个例子。EDIT我把你的reader_sfcn和reactor函数下载到了两个文件reactor_sfcn.m和reactor.m中,我马上就能知道为什么你从来没有看到输入中的任何变化了。在reactor_sfcn
mdlDerivatives
中,将输入作为reactor
函数的第三个参数传递给系统u
。在reactor
函数中,我可以看到第三个参数Tjo
从未被读取,而是被x(10)
覆盖。因此,如果Tjo
应该是输入参数,它不应该也是一个状态。这将是由你来解决这个问题,它是具体到您的工厂实施。我有一个测试模型,我已经用来看你的文件,我会尽量把它放在你可以很快访问它的地方,但它可能不会像你分析工厂应该做什么一样有用。希望这有帮助!谢谢!