Этот пример показывает, как совместно настроить внутренние и внешние контуры каскадной архитектуры с systune команда.
Каскадное управление часто используется для достижения плавного отслеживания с быстрым подавлением помех. Самая простая архитектура каскада включает два циклов управления (внутренний и внешний), как показано на блоке ниже. Внутренний цикл обычно быстрее, чем внешний контур, чтобы отклонить нарушения порядка, прежде чем они распространяются на внешний контур. (Simulink ® не поддерживается в MATLAB ® Online.)
open_system('rct_cascade')

В этом примере объект внутреннего цикла G2 является

и объект внешнего контура G1 является

G2 = zpk([],-2,3); G1 = zpk([],[-1 -1 -1],10);
Мы используем ПИ-контроллер во внутреннем цикле и ПИД-регулятор во внешнем контуре. Внешний контур должен иметь пропускную способность не менее 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.86, Hard = -Inf, Iterations = 66
Использование showTunable для просмотра настроенных коэффициентов ПИД.
showTunable(ST)
Block 1: rct_cascade/C1 =
1 s
Kp + Ki * --- + Kd * --------
s Tf*s+1
with Kp = 0.0521, Ki = 0.0186, Kd = 0.0472, Tf = 0.00728
Name: C1
Continuous-time PIDF controller in parallel form.
-----------------------------------
Block 2: rct_cascade/C2 =
1
Kp + Ki * ---
s
with Kp = 0.719, Ki = 1.23
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 объекта и блоков Control Design, чтобы смоделировать настраиваемые элементы.

Фигура 1: Каскадная архитектура
Сначала создайте параметрические модели настраиваемых ПИ и ПИД-регуляторов.
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.859, Hard = -Inf, Iterations = 121
Как и прежде, используйте 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')

slTuner (Simulink Control Design) | systune (slTuner) (Simulink Control Design)