Этот пример показывает, как использовать 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
последовательно с двумя контроллерами PI для отлива 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.996, 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 = -3.3, Ki = -0.451 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 = 1, Iterations = 90 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 = 17, Ki = 2.25 Name: PI_L Continuous-time PI controller in parallel form. ----------------------------------- Block 2: rct_distillation/PI_V = 1 Kp + Ki * --- s with Kp = 13.8, Ki = 1.83 Name: PI_V Continuous-time PI controller in parallel form. ----------------------------------- Block 3: rct_distillation/DM = D = u1 u2 y1 1 -0.8006 y2 1.21 -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:
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.997, 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.