Настройка многоконтурных систем управления

В этом примере показано, как совместно настроить внутренние и внешние циклы каскадной архитектуры с systune команда.

Каскадные циклы ПИДа

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

open_system('rct_cascade')

Модели объекта управления и требования пропускной способности

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

и объект внешнего цикла G1

G2 = zpk([],-2,3);
G1 = zpk([],[-1 -1 -1],10);

Мы используем ПИ-контроллер во внутреннем цикле и ПИД-регулятор во внешнем цикле. Внешний цикл должен иметь пропускную способность по крайней мере 0,2 рад/с, и пропускная способность внутреннего цикла должна быть в десять раз больше для соответствующего подавления помех.

Настройка ПИД-регуляторов с SYSTUNE

Когда система управления будет смоделирована в 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 = 61

Используйте showTunable видеть настроенные коэффициенты ПИД.

showTunable(ST)
Block 1: rct_cascade/C1 =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.052, Ki = 0.0186, Kd = 0.0476, Tf = 0.0131
 
Name: C1
Continuous-time PIDF controller in parallel form.

-----------------------------------

Block 2: rct_cascade/C2 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 0.722, 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)

Эквивалентный рабочий процесс в MATLAB

Если у вас нет модели 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.862, Hard = -Inf, Iterations = 137

Как прежде, используйте 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')

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте