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