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

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

Единица времени - минуты (все графики в минутах, а не секундах).
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')

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.
Это связано с отрицательными признаками во вторых входных каналах установки.
Кроме того, перестраиваемые элементы чрезмерно параметризованы, потому что умножение 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.
Если модель системы управления 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 контроллера на
рис. 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.
looptune | looptune (slTuner) (Simulink Control Design)