Настройте системы управления в 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.962, Iterations = 4
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.000915, Ki = 0.00254, Kd = 0.000146, Tf = 0.01
 
Name: PID_Controller
Continuous-time PIDF controller in parallel form.

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

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

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

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

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

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

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

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