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

В этом примере показано, как использовать systune или looptune автоматически настроить системы управления, смоделированные в Simulink.

Управление скоростью вращения двигателя

Для этого примера мы используем следующую модель системы управления скорости вращения двигателя:

open_system('rct_engine_speed')

Система управления состоит из одного цикла ПИДа, и усиления ПИД-регулятора должны быть настроены, чтобы соответственно ответить на ступенчатые изменения в желаемой скорости. А именно, мы хотим, чтобы ответ обосновался меньше чем через 5 секунд с минимальным перерегулированием. В то время как pidtune более быстрая альтернатива для настройки одного ПИД-регулятора, этот простой пример хорошо подходит для введения в systune и looptune рабочие процессы в Simulink.

Контроллер, настраивающийся с SYSTUNE

slTuner интерфейс предоставляет удобный шлюз systune для систем управления, смоделированных в Simulink. Этот интерфейс позволяет вам задать, какие блоки в модели Simulink являются настраиваемыми и какие сигналы являются представляющими интерес для открытого - или валидация с обратной связью. Создайте slTuner экземпляр для rct_engine_speed модель и список блок "PID Controller" (подсвеченный в оранжевом) как настраиваемый. Обратите внимание на то, что все Линейные Аналитические точки в модели (сигналы "Касательно" и "Скорость" здесь) автоматически доступны как интересные места для настройки.

ST0 = slTuner('rct_engine_speed','PID Controller');

Блок PID инициализируется с его значением в модели Simulink, которая можно получить доступ к использованию getBlockValue. Обратите внимание на то, что пропорциональные и производные усиления инициализируются, чтобы обнулить.

getBlockValue(ST0,'PID Controller')
ans =
 
        1 
  Ki * ---
        s 

  with Ki = 0.01
 
Name: PID_Controller
Continuous-time I-only controller.

Затем создайте требование отслеживания шага, чтобы получить целевое время урегулирования 5 секунд. Используйте имена сигнала в модели Simulink, чтобы относиться к ссылочным и выходным сигналам и задать целевой ответ как ответ первого порядка с постоянной времени 1 секунды.

TrackReq = TuningGoal.StepTracking('Ref','Speed',1);

Можно теперь настроить систему управления ST0 подвергните требованию TrackReq.

ST1 = systune(ST0,TrackReq);
Final: Soft = 0.282, Hard = -Inf, Iterations = 64

Окончательное значение близко к 1 указанию, что требование отслеживания удовлетворяется. systune возвращает "настроенную" версию ST1 из системы управления, описанной ST0. Снова используйте getBlockValue получить доступ к настроенным значениям коэффициентов ПИД:

getBlockValue(ST1,'PID Controller')
ans =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.00217, Ki = 0.00341, Kd = 0.000513, Tf = 1.09e-06
 
Name: PID_Controller
Continuous-time PIDF controller in parallel form.

Чтобы симулировать ответ с обратной связью на команду шага в скорости, получите начальные и настроенные передаточные функции от команды скорости "Касательно" к "Speed" выход и постройте их переходные процессы:

T0 = getIOTransfer(ST0,'Ref','Speed');
T1 = getIOTransfer(ST1,'Ref','Speed');
step(T0,T1)
legend('Initial','Tuned')

Контроллер, настраивающийся с LOOPTUNE

Можно также использовать looptune настроить системы управления, смоделированные в Simulink. looptune рабочий процесс очень похож на systune рабочий процесс. Одним различием является тот looptune потребности знать контур между объектом и контроллером, который задан в терминах сигналов измерений и средств управления. Для одного цикла производительность по существу получена временем отклика, или эквивалентно частотой среза разомкнутого цикла. На основе характеристик первого порядка частота среза должна превысить 1 рад/с для ответа с обратной связью, чтобы обосноваться меньше чем за 5 секунд. Можно поэтому настроить цикл ПИДа с помощью 1 рад/с в качестве целевой частоты среза на 0 дБ.

% Mark the signal "u" as a point of interest
addPoint(ST0,'u')

% Tune the controller parameters
Control = 'u';
Measurement = 'Speed';
wc = 1;
ST1 = looptune(ST0,Control,Measurement,wc);
Final: Peak gain = 0.979, Iterations = 4
Achieved target gain value TargetGain=1.

Снова окончательное значение близко к 1, указывая, что целевая пропускная способность управления была достигнута. Как с systune, используйте getIOTransfer вычислить и построить ответ с обратной связью от команды скорости до фактической скорости. Результат очень похож на полученный с systune.

T0 = getIOTransfer(ST0,'Ref','Speed');
T1 = getIOTransfer(ST1,'Ref','Speed');
step(T0,T1)
legend('Initial','Tuned')

Можно также выполнить анализ разомкнутого цикла, например, вычислить запасы по амплитуде и фазе во входе u объекта.

% Note: -1 because |margin| expects the negative-feedback loop transfer
L = getLoopTransfer(ST1,'u',-1);

margin(L), grid

Валидация в Simulink

Если вы удовлетворены systune или looptune результаты, можно загрузить настроенные параметры контроллера на Simulink для дальнейшей валидации с нелинейной моделью.

writeBlockValue(ST1)

Можно теперь симулировать ответ механизма с настроенным ПИД-регулятором.

Нелинейные результаты симуляции тесно совпадают с линейными ответами, полученными в MATLAB.

Ограничения на коэффициенты ПИД

Часто полезно ограничить область значений настроенных параметров избавляться от нежелательных решений. Например, можно потребовать, чтобы пропорциональные и производные усиления ПИД-регулятора были неотрицательными. Для этого получите доступ к настроенной параметризации блока.

C = getBlockParam(ST0,'PID Controller')
C = 

  Parametric continuous-time PID controller "PID_Controller" with formula:

             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  and tunable parameters Kp, Ki, Kd, Tf.

Type "pid(C)" to see the current value and "get(C)" to see all properties.

Установите "Минимальное" значение настраиваемых параметров Kp и Kd к 0.

C.Kp.Minimum = 0;
C.Kd.Minimum = 0;

Наконец, сопоставьте модифицированную параметризацию с настроенным блоком.

setBlockParam(ST0,'PID Controller',C)

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

ST1 = looptune(ST0,Control,Measurement,wc);

showTunable(ST1)
Final: Peak gain = 0.892, Iterations = 5
Achieved target gain value TargetGain=1.

Block 1: rct_engine_speed/PID Controller =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.00111, Ki = 0.0031, Kd = 0.00015, Tf = 0.01
 
Name: PID_Controller
Continuous-time PIDF controller in parallel form.

Сравнение PI и ПИД-регуляторов

Более близкий контроль настроенных коэффициентов ПИД предполагает, что вклад производного термина незначителен. Это предлагает использовать более простой ПИ-контроллер вместо этого. Для этого замените параметризацию по умолчанию для блока "PID Controller":

setBlockParam(ST0,'PID Controller',tunablePID('C','pi'))

Это указывает, что блок "PID Controller" должен теперь быть параметризован как простой ПИ-контроллер. Затем повторно настройте систему управления для этого более простого контроллера:

ST2 = looptune(ST0,Control,Measurement,wc);
Final: Peak gain = 0.95, Iterations = 4
Achieved target gain value TargetGain=1.

Снова окончательное значение меньше одного успеха указания. Сравните ответ с обратной связью с предыдущими единицами:

T2 = getIOTransfer(ST2,'Ref','Speed');
step(T0,T1,T2,'r--')
legend('Initial','PID','PI')

Очевидно ПИ-контроллер достаточен для этого приложения.

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

| |

Похожие темы