【问题标题】:no oscillation after put in pid controller放入pid控制器后没有振荡
【发布时间】:2012-02-23 03:27:18
【问题描述】:

我在将 PID 控制器放入我的 simulink 文件时遇到问题。

在我的 simulink 文件中,我使用 pid 控制器来控制我的进程。我使用 s-function 作为我的流程框图。

根据 Ziegler-Nichols 方法,第一步我们将 k 设置为最小值 (0.5),因此我将 0.5 放入我的比例值中。但是有控制器和没有控制器的结果没有区别。即使我增加或减少比例值。

为什么会出现这个问题?希望有人可以帮助我。谢谢。

我的框图如下图所示。参考这张图

http://s1009.photobucket.com/albums/af218/syarinazulkifeli/?action=view&current=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文件的链接

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];

【问题讨论】:

  • 你的 simulink 图是什么样的?

标签: matlab pid simulink


【解决方案1】:

首先,我将检查进程的 s-function 是否按预期工作。断开 PID 控制器并连接步进、斜坡或 sin 块。这可以给你一个提示,如果进程的块是好的,静态系数有多大。

第二个提示:Ziegler-Nichols 方法说应该增加 Kp,直到系统变得边缘稳定。您是否只测试了比例增益的一个值?根据工厂的不同,0.5 的值可能非常小,并且低于您控制系统所需的水平。

【讨论】:

  • 我已断开我的 pid 控制器并更改为 step 然后 ramp 和 sin 块。结果仍然与所有这 3 种类型的块没有连接相同。那么是不是说明我的流程不行呢?我已经测试了等于 1000 的比例值,但结果仍然相同
  • 我试图将范围放在 pid 控制器块之前,它在设置点和输出结果之间显示错误。这意味着信号已发送到控制器。我无法识别我的 s-function 中的问题
  • 我想我发现了问题:在函数 reactor() 中,Tjo 既作为控制输入,又作为状态。你用 x (10) 覆盖它。这显然是模型错误。
  • yes.i 应该从反应器文件中删除 Tjo 方程。非常感谢你们。你们真的帮助我。谢谢
  • 还有一些其他的东西,明天可能会写给你,现在我不是我的手机了...
【解决方案2】:

您更改了 Kp 项,但没有任何更改...您是否给系统一个 step 命令?是否将实际和期望的信号误差反馈给 PID 控制器?如果这些都满足并且系统仍然对 Kp 不敏感,您可能需要逐块检查模型以查找问题。另外,您为什么要使用 S 函数对您的工厂进行建模?实施这些可能很棘手。我更愿意以图表形式或至少以嵌入式 m 形式查看植物模型。

对于步进输入,我推荐this link 或谷歌搜索。您需要将 Kp 设置得相当高,然后给它一个阶跃命令输入以使系统不稳定,然后改变 Kp 直到它稳定并测量振荡周期。

我整理了一个玩具模型供你测试,我也倾向于相信你的 s-function 在这里有问题。如果您想发布/发送功能,我很乐意查看它。但是,如果您想学习 Ziegler-Nichols,请从一个非常简单的模型开始,然后按照 Ziegler-Nichols 过程中的步骤进行操作。这是我的一些数据的输出,带有Kp = 2001/(s+1) 的植物:

所以你可以看到上面的振荡。 Kp = 200 太高了,对于 Ziegler-Nichols 来说,你必须把它降低很多,但我只是想给你一个例子。

EDIT 我把你的 readtor_sfcn 和 reactor 函数下载到了两个名为 reactor_sfcn.m 和 reactor.m 马上,我就知道为什么你什么都没看到 输入的变化。在reactor_sfcnmdlDerivatives中,你传入输入 到系统u 作为reactor 函数的第三个参数。在里面 reactor 函数我可以看到第三个参数 Tjo 永远不会被读取, 但被x(10) 覆盖。所以,如果Tjo 应该是输入参数 它也不应该是一个状态。这将取决于你来解决这个问题, 它特定于您对工厂的实施。我有一个测试模型 我以前看过你的文件,我会试着把它放在你能得到的地方 很快就可以访问它,但它可能不如您分析什么有用 该工厂应该在做。希望这会有所帮助!

谢谢!

【讨论】:

  • Kavka 和 Macduff,请参考上面的链接..这是我的框图......对不起,我不知道如何将这张图片附加到我上面的问题
  • macduff,step 命令?我对此一无所知...是的,实际的和期望的正在反馈给 pid 控制器。看来我的系统对控制器不敏感。我希望你能看看我的照片,我把链接放在我上面的问题中。提前谢谢你
  • macduff,我已经发布了我的 s-function 文件。如果你想看,我很荣幸。非常感谢你
  • Macduff,非常感谢。你们真的帮了我。谢谢。是的,我应该从 ODE 文件(反应器)中删除 Tjo 方程。这意味着 Tjo 应该读作 u,而不是从 dTjodt 方程。现在,我的输出结果对 Kp 的变化很敏感
猜你喜欢
  • 1970-01-01
  • 2015-11-30
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多