Этот пример показывает, как совместно настроить внутренние и внешние циклы каскадной архитектуры с командой systune
.
Каскадное регулирование часто используется, чтобы достигнуть сглаженного отслеживания с быстрым подавлением помех. Самая простая каскадная архитектура включает два цикла управления (внутренний и внешний) как показано в блок-схеме ниже. Внутренний цикл обычно быстрее, чем внешний цикл, чтобы отклонить воздействия, прежде чем они распространят к внешнему циклу. (Simulink® не поддержан в MATLAB® Online.)
open_system('rct_cascade')
В этом примере объект внутреннего цикла G2
и объект внешнего цикла G1
G2 = zpk([],-2,3); G1 = zpk([],[-1 -1 -1],10);
Мы используем контроллер PI во внутреннем цикле и ПИД-регулятор во внешнем цикле. Внешний цикл должен иметь пропускную способность по крайней мере 0,2 рад/с, и пропускная способность внутреннего цикла должна быть в десять раз больше для соответствующего подавления помех.
Когда система управления будет смоделирована в Simulink, используйте интерфейс slTuner
в Simulink Control Design™, чтобы настроить настраивающуюся задачу. Перечислите настраиваемые блоки, отметьте сигналы r
и d2
как входные параметры интереса, и отметьте сигналы y1
и y2
как местоположения, где измерить передачи разомкнутого цикла и задать формы цикла.
ST0 = slTuner('rct_cascade',{'C1','C2'}); addPoint(ST0,{'r','d2','y1','y2'})
Можно запросить текущие значения C1
и C2
в модели Simulink с помощью showTunable
. Система управления нестабильна для этих начальных значений, как подтверждено путем симуляции модели Simulink.
showTunable(ST0)
Block 1: rct_cascade/C1 = 1 Kp + Ki * --- s with Kp = 0.1, Ki = 0.1 Name: C1 Continuous-time PI controller in parallel form. ----------------------------------- Block 2: rct_cascade/C2 = 1 Kp + Ki * --- s with Kp = 0.1, Ki = 0.1 Name: C2 Continuous-time PI controller in parallel form.
Затем используйте требования "LoopShape", чтобы задать желаемую пропускную способность для внутренних и внешних циклов. Используйте в качестве целевой формы цикла для внешнего цикла, чтобы осуществить интегральное действие с частотой перекрестного соединения усиления на уровне 0,2 рад/с:
% Outer loop bandwidth = 0.2 s = tf('s'); Req1 = TuningGoal.LoopShape('y1',0.2/s); % loop transfer measured at y1 Req1.Name = 'Outer Loop';
Используйте для внутреннего цикла, чтобы сделать его в десять раз быстрее (более высокая пропускная способность), чем внешний цикл. Чтобы ограничить передачу внутреннего цикла, убедитесь, что открыли внешний цикл путем определения y1
как открытия цикла:
% Inner loop bandwidth = 2 Req2 = TuningGoal.LoopShape('y2',2/s); % loop transfer measured at y2 Req2.Openings = 'y1'; % with outer loop opened at y1 Req2.Name = 'Inner Loop';
Можно теперь настроить коэффициенты ПИД в C1
и C2
с systune
:
ST = systune(ST0,[Req1,Req2]);
Final: Soft = 0.859, Hard = -Inf, Iterations = 71
Используйте showTunable
, чтобы видеть настроенные коэффициенты ПИД.
showTunable(ST)
Block 1: rct_cascade/C1 = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 0.0501, Ki = 0.0186, Kd = 0.0436, Tf = 0.00293 Name: C1 Continuous-time PIDF controller in parallel form. ----------------------------------- Block 2: rct_cascade/C2 = 1 Kp + Ki * --- s with Kp = 0.719, Ki = 1.57 Name: C2 Continuous-time PI controller in parallel form.
Окончательное значение - меньше чем 1, что означает, что systune
успешно удовлетворил оба требования формы цикла. Подтвердите это путем осмотра настроенной системы управления ST
с viewGoal
viewGoal([Req1,Req2],ST)
Обратите внимание на то, что внутренние и внешние циклы имеют желаемые частоты перекрестного соединения усиления. Чтобы далее подтвердить проект, постройте настроенные ответы на команду r шага и воздействие шага d2:
% Response to a step command H = getIOTransfer(ST,'r','y1'); clf, step(H,30), title('Step command')
% Response to a step disturbance H = getIOTransfer(ST,'d2','y1'); step(H,30), title('Step disturbance')
Если вы удовлетворены линейными результатами анализа, используйте writeBlockValue
, чтобы записать настроенные коэффициенты ПИД обратно к блокам Simulink. Можно затем провести более полную валидацию в Simulink.
writeBlockValue(ST)
Если у вас нет модели Simulink системы управления, можно выполнить те же шаги с помощью моделей LTI объекта и блоков Системы управления, чтобы смоделировать настраиваемые элементы.
Рисунок 1: каскадная архитектура
Сначала создайте параметрические модели настраиваемого PI и ПИД-регуляторов.
C1 = tunablePID('C1','pid'); C2 = tunablePID('C2','pi');
Затем используйте "аналитические блоки" точки, чтобы отметить цикл, открывающий отделения y1
и y2
.
LS1 = AnalysisPoint('y1'); LS2 = AnalysisPoint('y2');
Наконец, создайте модель T0
с обратной связью полной системы управления путем закрытия каждой обратной связи. Результатом является обобщенная модель в пространстве состояний в зависимости от настраиваемых элементов C1
и C2
.
InnerCL = feedback(LS2*G2*C2,1); T0 = feedback(G1*InnerCL*C1,LS1); T0.InputName = 'r'; T0.OutputName = 'y1';
Можно теперь настроить коэффициенты ПИД в C1
и C2
с systune
.
T = systune(T0,[Req1,Req2]);
Final: Soft = 0.86, Hard = -Inf, Iterations = 81
Как прежде, используйте getIOTransfer
, чтобы вычислить и построить настроенные ответы на команду r шага и воздействие шага, входящее в местоположении y2
:
% Response to a step command H = getIOTransfer(T,'r','y1'); clf, step(H,30), title('Step command')
% Response to a step disturbance H = getIOTransfer(T,'y2','y1'); step(H,30), title('Step disturbance')
Можно также построить коэффициенты усиления разомкнутого контура для внутренних и внешних циклов, чтобы подтвердить требования пропускной способности. Отметьте этот-1 знак вычислить передачу разомкнутого цикла отрицательной обратной связи:
L1 = getLoopTransfer(T,'y1',-1); % crossover should be at .2 L2 = getLoopTransfer(T,'y2',-1,'y1'); % crossover should be at 2 bodemag(L2,L1,{1e-2,1e2}), grid legend('Inner Loop','Outer Loop')