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

Рисунок 1: столбец дистилляции
В так называемой настройке LV управляемые переменные являются концентрациями yD и yB из химикатов D (верхние части) и B (нижние части) и переменные, которыми управляют, являются отливом L и нагрузка кипятильника по пару V. Этот процесс показывает сильную связь и большие изменения установившегося усиления для некоторых комбинаций L и V. Для получения дополнительной информации смотрите Skogestad и Postlethwaite, Многомерное Управление с обратной связью.
Объект моделируется как передаточная функция первого порядка с входными параметрами 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 последовательно с двумя ПИ-контроллерами для отлива L и нагрузка кипятильника по пару V.
open_system('rct_distillation')

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.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.
Это происходит из-за знаков минус во вторых входных каналах объекта
. Кроме того, настраиваемые элементы сверхпараметрируются потому что умножение 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 и блоки Системы управления, чтобы создать представление 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 из контроллера
в рисунке 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)