нет колебаний после ввода в пид-контроллер - PullRequest
0 голосов
/ 23 февраля 2012

У меня проблема с размещением PID-контроллера в моем файле simulink.

В моем файле simulink я использовал pid-контроллер для управления моим процессом.В качестве блок-схемы процесса я использовал s-функцию.

В соответствии с методом Циглера-Николса, для первого шага мы устанавливаем k равным наименьшему значению (0.5), поэтому я помещаю 0.5 в свое пропорциональное значение.но нет никакой разницы между результатом с контроллером и без контроллера. Даже увеличивая или уменьшая пропорциональное значение.

Почему возникает эта проблема?Надеюсь, что кто-то может мне помочь. Спасибо.

моя блок-схема выглядит как на картинке ниже. Ссылка на эту картинку

http://s1009.photobucket.com/albums/af218/syarinazulkifeli/?action=view&current=Untitled-1.png

Вот мой файл s-функции:

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 ]

1 голос
/ 23 февраля 2012

Сначала я проверю, работает ли s-функция для процесса, как ожидалось.Отключите ПИД-регулятор и подключите ступеньку, рампу или синусоидальный блок.Это может дать вам подсказку, если блок для процесса в порядке и насколько велик статический коэффициент.

Второй совет: метод Циглера-Николса говорит, что следует увеличивать Kp до тех пор, пока система не станет предельно стабильной.Вы тестировали только одно значение для пропорционального усиления?В зависимости от завода 0.5 может быть действительно небольшим значением, а под уровнями нужно контролировать систему.

0 голосов
/ 23 февраля 2012

Вы меняете термин Kp, но нет изменений ... Вы дали системе команду шага? Фактическая и желаемая ошибка сигнала передаются обратно в ПИД-регулятор? Если они удовлетворены, а система по-прежнему нечувствительна к Kp, вам, возможно, придется пройтись по вашей модели блок за блоком, чтобы найти проблему. Кроме того, почему вы моделируете свое предприятие с функцией S? Реализация их может быть сложно. Я бы предпочел увидеть модель завода в виде диаграммы или, по крайней мере, во встроенном виде m.

Для пошагового ввода я бы порекомендовал эту ссылку или Google. Вам нужно установить достаточно высокое значение Kp, а затем ввести в него пошаговую команду для дестабилизации системы, а затем изменять Kp до тех пор, пока оно не стабилизируется и не измерить период колебаний.

Я собрал игрушечную модель для вас, я также склонен полагать, что ваша s-функция виновата здесь. Если вы хотите опубликовать / отправить функцию, я был бы рад ее посмотреть. Однако, если вы хотите изучить Циглера-Николса, начните с очень простой модели и следуйте инструкциям процесса Циглера-Николса. Вот вывод для некоторых моих данных с Kp = 200 и растением 1/(s+1):

Test Setup

10s Run

Zoomed in to see oscillation

Так что вы можете увидеть колебание выше. Kp = 200 слишком велико, вам придется немного его уменьшить для Циглера-Николса, но я просто хотел привести вам пример.

EDIT Я загрузил ваши readtor_sfcn и функцию реактора в два файла с именем реактор_sfcn.m и реактор.m сразу же, я могу сказать, почему вы никогда не видите изменить на входе. В реактор_sfcn mdlDerivatives, вы передаете ввод в систему u в качестве третьего параметра функции reactor. в reactor функция Я вижу, что третий параметр, Tjo никогда не читается, но перезаписывается с x(10). Итак, если Tjo должен быть входным параметром это также не должно быть государством. Вам решать эту проблему, это зависит от вашей реализации завода. У меня есть тестовая модель Я привык смотреть на твои файлы, я постараюсь поместить его туда, где ты сможешь достать доступ к нему в ближайшее время, но, скорее всего, он будет не таким полезным, как вы анализируете завод должен делать. Надеюсь, это поможет!

Спасибо!

...