exponenta event banner

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

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

Управление частотой вращения двигателя

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

open_system('rct_engine_speed')

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

Настройка контроллера с помощью SYSTUNE

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

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 = 67

Конечное значение близко к 1, что указывает на выполнение требования отслеживания. systune возвращает «настроенную» версию ST1 системы управления, описанной ST0. Снова использовать getBlockValue для доступа к настроенным значениям усиления PID:

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

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

Для моделирования реакции по замкнутому контуру на пошаговую команду по скорости получите начальные и настроенные передаточные функции с выхода команды speed «Ref» на «Speed» и постройте график их пошаговых ответов:

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

Настройка контроллера с помощью LOOPTUNE

Также можно использовать looptune для настройки систем управления, смоделированных в Simulink. looptune рабочий процесс очень похож на systune workflow-процесс. Одно отличие в том, что looptune необходимо знать границу между установкой и контроллером, которая определяется с точки зрения сигналов контроля и измерений. Для одиночного цикла производительность по существу фиксируется временем отклика или эквивалентно частотой пересечения с разомкнутым контуром. По характеристикам первого порядка частота перехода должна превышать 1 рад/с, чтобы отклик по замкнутому контуру осел менее чем за 5 секунд. Таким образом, можно настроить цикл PID, используя 1 рад/с в качестве целевой частоты пересечения 0-dB.

% 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 для вычисления и построения графика отклика по замкнутому контуру от команды speed до фактической скорости. Результат очень похож на результат, полученный с 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)

Теперь можно смоделировать ответ двигателя с помощью настроенного контроллера PID.

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

Ограничения на увеличение PID

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

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

  Tunable 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.

Установите значение «Minimum» для перестраиваемых параметров Kp и Kd в 0.

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

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

setBlockParam(ST0,'PID Controller',C)

Пересчитайте выигрыши PID и убедитесь, что пропорциональные и производные выигрыши действительно неотрицательны.

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

showTunable(ST1)
Final: Peak gain = 0.964, 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.00091, Ki = 0.00253, Kd = 0.000146, Tf = 0.01
 
Name: PID_Controller
Continuous-time PIDF controller in parallel form.

Сравнение PI и PID контроллеров

Более тщательный анализ настроенного прироста PID позволяет предположить, что вклад деривативного термина незначителен. Вместо этого рекомендуется использовать более простой PI-контроллер. Для этого переопределите параметры по умолчанию для блока «PID Controller»:

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

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

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')

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

См. также

| (Simulink Control Design) | (Проект управления Simulink)

Связанные темы