exponenta event banner

Контроллер разъединения для дистилляционной колонны

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

Модель дистилляционной колонны

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

Рис. 1: Дистилляционная колонна

В так называемой конфигурации НН контролируемыми переменными являются концентрации. yD и yB химических веществ D (вершины) и B (днища), а управляемые переменные - рефлюкс L и откачки V. Этот процесс демонстрирует сильную связь и большие вариации стационарного усиления для некоторых комбинаций L и V. Для получения более подробной информации см. Skogestad and 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 последовательно с двумя регуляторами PI для орошения L и откачки V.

open_system('rct_distillation')

Настройка контроллера в Simulink с помощью LOOPTUNE

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 для указания остальных целей управления. Ответ на команду шага должен иметь превышение менее чем на 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')

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

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

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 на два и деление коэффициентов усиления 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 = 0.998, Iterations = 76
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.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: Блок-схема системы управления

Сначала параметризуйте перестраиваемые элементы с помощью блоков «Control Design». Используйте 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:

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 = 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)

Связанные темы