В этом примере показано, как использовать systune
или looptune
для автоматической настройки систем управления, смоделированных в Simulink.
В данном примере мы используем следующую модель системы регулировки скорости вращения двигателя:
open_system('rct_engine_speed')
Система управления состоит из одного ПИД цикл и коэффициент усиления ПИД-регулятора должен быть настроен, чтобы адекватно реагировать на изменения шага в желаемой скорости. В частности, мы хотим, чтобы ответ осел менее чем за 5 секунд с небольшим перерегулированием или без него. Пока pidtune
является более быстрой альтернативой для настройки одного ПИД-регулятора, этот простой пример хорошо подходит для введения в systune
и looptune
рабочие процессы в Simulink.
The slTuner
интерфейс обеспечивает удобный шлюз для systune
для систем управления, смоделированных в Simulink. Этот интерфейс позволяет вам задать, какие блоки в модели Simulink настраиваются, и какие сигналы представляют интерес для валидации в открытом или замкнутом цикле. Создайте slTuner
образец для rct_engine_speed
модель и список блока «ПИД-регулятор» (выделен оранжевым цветом) как настраиваемый. Обратите внимание, что все точки линейного анализа в модели (сигналы «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
для доступа к настроенным значениям коэффициентов ПИД:
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.
Чтобы симулировать ответ замкнутой системы на команду шага в скорости, получите начальные и настроенные передаточные функции от команды скорости «Ref» до выхода «Speed» и постройте их переходные характеристики:
T0 = getIOTransfer(ST0,'Ref','Speed'); T1 = getIOTransfer(ST1,'Ref','Speed'); step(T0,T1) legend('Initial','Tuned')
Можно также использовать looptune
настроить системы управления, смоделированные в Simulink. The looptune
рабочий процесс очень похож на systune
рабочий процесс. Одно из различий заключается в том, что looptune
необходимо знать контур между объектом и контроллером, которая задается в терминах управления и сигналов измерений. Для одного цикла эффективность по существу фиксируется временем отклика или эквивалентно частотой среза без разомкнутого контура. Исходя из характеристик первого порядка, частота среза должен превысить 1 рад/с, чтобы реакция с обратной связью оседала менее чем за 5 секунд. Поэтому можно настроить цикл ПИД, используя 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
для вычисления и построения графика отклика замкнутой системы от команды скорости до фактической скорости. Результат очень похож на результат, полученный с 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
Как только вы удовлетворены systune
или looptune
результаты можно загрузить настроенные параметры контроллера в Simulink для дальнейшей валидации с нелинейной моделью.
writeBlockValue(ST1)
Теперь можно симулировать ответ двигателя с помощью настроенных ПИД-регуляторов.
Нелинейные результаты симуляции тесно совпадают с линейными откликами, полученными в MATLAB.
Часто полезно ограничивать область значений настроенных параметров, чтобы отсеять нежелательные решения. Для примера вы можете потребовать, чтобы пропорциональное и производное усиления ПИД-регулятора были неотрицательными. Для этого получите доступ к параметризации настроенного блока.
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)
Повторите коэффициенты ПИД и проверьте, что пропорциональное и производное усиления действительно неотрицательны.
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.
Более тщательный анализ настроенных коэффициентов ПИД предполагает, что вклад производного термина незначителен. Это предполагает использование вместо этого более простого ПИ-контроллера. Для этого переопределите параметризацию по умолчанию для блока «ПИД-регулятор»:
setBlockParam(ST0,'PID Controller',tunablePID('C','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')
Очевидно, что для этого приложения достаточно ПИ-контроллера.
TuningGoal.Tracking
| slTuner
(Simulink Control Design) | systune (slTuner)
(Simulink Control Design)