Разъединение контроллера для столбца дистилляции

В этом примере показано, как использовать looptune разъединять две основной обратной связи в столбце дистилляции.

Модель столбца дистилляции

Этот пример использует простую модель столбца дистилляции, показанного ниже.

Рисунок 1: столбец дистилляции

В так называемой настройке LV управляемые переменные являются концентрациями yD и yB из химикатов D (верхние части) и B (нижние части) и переменные, которыми управляют, являются отливом L и нагрузка кипятильника по пару V. Этот процесс показывает сильную связь и большие изменения установившегося усиления для некоторых комбинаций L и V. Для получения дополнительной информации смотрите Skogestad и Postlethwaite, Многомерное Управление с обратной связью.

Объект моделируется как передаточная функция первого порядка с входными параметрами L,V и выходные параметры yD,yB:

$$ G(s) = \frac{1}{75s+1} \left ( \begin{array}{cc} 87.8 & -86.4 \\ 108.2 & -109.6 \end{array}\right )$$

Модуль времени является минутами (все графики находятся в минутах, не секундах).

s = tf('s');
G = [87.8 -86.4 ; 108.2 -109.6]/(75*s+1);
G.InputName = {'L','V'};
G.OutputName = {'yD','yB'};

Архитектура управления

Цели управления следующие:

  • Независимое управление концентраций верхов и низа путем гарантирования, что изменение в заданном значении верхних частей Dsp оказывает мало влияния на нижнюю концентрацию B и наоборот

  • Время отклика приблизительно в 4 минуты меньше чем с 15%-м перерегулированием

  • Быстрое отклонение входных воздействий, влияющих на эффективный отлив L и нагрузка кипятильника по пару V

Чтобы достигнуть этих целей, мы используем архитектуру управления, показанную ниже. Эта архитектура состоит из статического разъединяющегося матричного DM последовательно с двумя ПИ-контроллерами для отлива L и нагрузка кипятильника по пару V.

open_system('rct_distillation')

Контроллер, настраивающий Simulink с LOOPTUNE

looptune команда обеспечивает быстрый способ настроить обратную связь MIMO. Когда система управления моделируется в Simulink, вы только задаете настроенные блоки, сигналы управления и измерения, и желаемую полосу пропускания и looptune автоматически настраивает проблему и настраивает параметры контроллера. looptune формирует ответ разомкнутого контура, чтобы обеспечить интегральное действие, спад и соответствующие запасы устойчивости MIMO.

Используйте slTuner интерфейс, чтобы задать настроенные блоки, контроллер I/Os и представляющие интерес сигналы для валидации с обратной связью.

ST0 = slTuner('rct_distillation',{'PI_L','PI_V','DM'});

% Signals of interest
addPoint(ST0,{'r','dL','dV','L','V','y'})

Установите полосу пропускания управления путем определения частоты среза усиления для ответа разомкнутого контура. В течение времени отклика в 4 минуты частота среза должна быть приблизительно 2/4 = 0,5 рад/min.

wc = 0.5;

Используйте TuningGoal объекты задать остающиеся цели управления. Ответ на команду шага должен иметь меньше чем 15%-е перерегулирование. Ответ на воздействие шага во входе объекта должен быть хорошо ослаблен, обосноваться меньше чем через 20 минут, и не превышать 4 в амплитуде.

OS = TuningGoal.Overshoot('r','y',15);

DR = TuningGoal.StepRejection({'dL','dV'},'y',4,20);

Затем используйте looptune настроить контроллер блокирует PI_L, PI_V, и DM подвергните требованию подавления помех.

Controls = {'L','V'};
Measurements = 'y';
[ST,gam,Info] = looptune(ST0,Controls,Measurements,wc,OS,DR);
Final: Peak gain = 0.99, Iterations = 68
Achieved target gain value TargetGain=1.

Окончательное значение близко 1, который указывает, что все требования были удовлетворены. Используйте loopview проверять получившийся проект. Ответы должны остаться вне заштрихованных областей.

figure('Position',[0,0,1000,1200])
loopview(ST,Info)

Используйте getIOTransfer получить доступ и построить ответы с обратной связью из ссылки и воздействия к концентрациям верхов и низа. Настроенные ответы показывают хороший компромисс между отслеживанием и подавлением помех.

figure
Ttrack = getIOTransfer(ST,'r','y');
step(Ttrack,40), grid, title('Setpoint tracking')

Treject = getIOTransfer(ST,{'dV','dL'},'y');
step(Treject,40), grid, title('Disturbance rejection')

Сравнение открытого - и характеристики подавления помех с обратной связью в частотном диапазоне показывает ясное улучшение в полосе пропускания управления.

clf, sigma(G,Treject), grid
title('Principal gains from input disturbances to outputs')
legend('Open-loop','Closed-loop')

Добавление ограничений на настроенные переменные

Контроль контроллера получил выше показов, что второй ПИ-контроллер имеет отрицательные усиления.

getBlockValue(ST,'PI_V')
ans =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = -4.35, Ki = -0.618
 
Name: PI_V
Continuous-time PI controller in parallel form.

Это происходит из-за знаков минус во вторых входных каналах объекта$G$. Кроме того, настраиваемые элементы сверхпараметрируются потому что умножение DM два и деление усилений PI два не изменяет полный контроллер. Чтобы решить эти проблемы, зафиксируйте (1,1) запись DM к 1 и (2,2) запись в-1.

DM = getBlockParam(ST0,'DM');
DM.Gain.Value = diag([1 -1]);
DM.Gain.Free = [false true;true false];
setBlockParam(ST0,'DM',DM)

Повторно настройте контроллер для уменьшаемого набора настраиваемых параметров.

[ST,gam,Info] = looptune(ST0,Controls,Measurements,wc,OS,DR);
Final: Peak gain = 1, Iterations = 84
Achieved target gain value TargetGain=1.

Переходные процессы выглядят подобными, но значения DM и усиления PI более подходят для реализации.

figure('Position',[0,0,700,350])

subplot(121)
Ttrack = getIOTransfer(ST,'r','y');
step(Ttrack,40), grid, title('Setpoint tracking')

subplot(122)
Treject = getIOTransfer(ST,{'dV','dL'},'y');
step(Treject,40), grid, title('Disturbance rejection')

showTunable(ST)
Block 1: rct_distillation/PI_L =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 16.3, Ki = 2.16
 
Name: PI_L
Continuous-time PI controller in parallel form.

-----------------------------------

Block 2: rct_distillation/PI_V =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 13, Ki = 1.73
 
Name: PI_V
Continuous-time PI controller in parallel form.

-----------------------------------

Block 3: rct_distillation/DM =
 
  D = 
           u1      u2
   y1       1  -0.785
   y2   1.232      -1
 
Name: DM
Static gain.

Эквивалентный рабочий процесс в MATLAB

Если у вас нет модели Simulink системы управления, можно использовать объекты LTI и блоки Системы управления, чтобы создать представление MATLAB следующей блок-схемы.

Рисунок 2: блок-схема системы управления

Сначала параметрируйте настраиваемые элементы с помощью блоков Системы управления. Используйте tunableGain объект параметрировать DM и зафиксируйте DM(1,1)=1 и DM(2,2)=-1. Это создает 2x2 статическое усиление с недиагональными записями как настраиваемые параметры.

DM = tunableGain('Decoupler',diag([1 -1]));
DM.Gain.Free = [false true;true false];

Точно так же используйте tunablePID объект параметрировать эти два ПИ-контроллера:

PI_L = tunablePID('PI_L','pi');
PI_V = tunablePID('PI_V','pi');

Затем создайте модель C0 из контроллера$C$ в рисунке 2.

C0 = blkdiag(PI_L,PI_V) * DM * [eye(2) -eye(2)];

% Note: I/O names should be consistent with those of G
C0.InputName = {'Dsp','Bsp','yD','yB'};
C0.OutputName = {'L','V'};

Теперь настройте параметры контроллера с looptune как сделано ранее.

% Crossover frequency
wc = 0.5;

% Overshoot and disturbance rejection requirements
OS = TuningGoal.Overshoot({'Dsp','Bsp'},{'yD','yB'},15);
DR = TuningGoal.StepRejection({'L','V'},{'yD','yB'},4,20);

% Tune controller gains
[~,C] = looptune(G,C0,wc,OS,DR);
Final: Peak gain = 1, Iterations = 68
Achieved target gain value TargetGain=1.

Чтобы подтвердить проект, замкните круг с настроенным компенсатором C и симулируйте переходные процессы для отслеживания заданного значения и подавления помех.

Tcl = connect(G,C,{'Dsp','Bsp','L','V'},{'yD','yB'});

figure('Position',[0,0,700,350])

subplot(121)
Ttrack = Tcl(:,[1 2]);
step(Ttrack,40), grid, title('Setpoint tracking')

subplot(122)
Treject = Tcl(:,[3 4]);
Treject.InputName = {'dL','dV'};
step(Treject,40), grid, title('Disturbance rejection')

Результаты похожи на полученных в Simulink.

Смотрите также

|

Похожие темы