Контроллер развязки дистилляционного столбца

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

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

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

Фигура 1: Дистилляционный столбец

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

Объект моделируется как передаточная функция первого порядка с входами 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

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

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

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 рад/мин.

wc = 0.5;

Использование TuningGoal объекты для определения остальных целей управления. Ответ на команду step должен иметь менее 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.999, Iterations = 54
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.29, Ki = -0.578
 
Name: PI_V
Continuous-time PI controller in parallel form.

Это связано с отрицательными знаками во вторых входных каналах объекта. $G$В сложение настраиваемые элементы слишком параметризованы, потому что умножаются DM на два и деление коэффициентов усиления ПИ на два не меняет полный контроллер. Чтобы решить эти проблемы, исправьте (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 = 0.998, Iterations = 76
Achieved target gain value TargetGain=1.

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

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.15
 
Name: PI_L
Continuous-time PI controller in parallel form.

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

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

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

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

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

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

Если у вас нет модели Simulink системы управления, можно использовать объекты LTI и блоки Control Design, чтобы создать представление 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$ фигура.

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 = 0.999, Iterations = 57
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.

См. также

| (Simulink Control Design)

Похожие темы