В этом примере показано, как использовать slTuner
и systune
настроить текущие циклы и скоростные циклы в линейном электроприводе с пределами насыщения.
Откройте модель Simulink линейного электропривода:
open_system('rct_linact')
Электрические и механические компоненты моделируются с помощью Simscape Electrical и Simscape Multibody. Система управления состоит из двух каскадной обратной связи, контролирующей ведущую текущую и угловую скорость двигателя постоянного тока.
Рисунок 1: текущий и контроллеры скорости.
Обратите внимание на то, что (текущий) контроллер внутреннего цикла является пропорциональным усилением, в то время как внешний цикл (скорость) контроллер имеет пропорциональные и интегральные действия. Выход обоих контроллеров ограничивается плюс/минус 5.
Мы должны настроить пропорциональные и интегральные усиления, чтобы ответить на спрос на скорость на 2 000 об/мин приблизительно через 0,1 секунды с минимальным перерегулированием. Начальные настройки усиления в модели являются P=50 и PI =0.2+0.1/s, и соответствующий ответ показывают в рисунке 2. Этот ответ является слишком медленным и слишком чувствительным, чтобы загрузить воздействия.
Рисунок 2: ненастроенный ответ.
Можно использовать systune
совместно настроить обе обратной связи. Чтобы настроить проект, создайте экземпляр slTuner
интерфейс со списком настроенных блоков. Все блоки и сигналы заданы их именами в модели. Модель линеаризуется в t=0.5, чтобы избежать разрывов в некоторых производных в t=0.
TunedBlocks = {'Current PID','Speed PID'}; tLinearize = 0.5; % linearize at t=0.5 % Create tuning interface ST0 = slTuner('rct_linact',TunedBlocks,tLinearize); addPoint(ST0,{'Current PID','Speed PID'})
Структура данных ST0
содержит описание системы управления и ее настраиваемых элементов. Затем укажите, что двигатель постоянного тока должен следовать за спросом на скорость на 2 000 об/мин через 0,1 секунды:
TR = TuningGoal.Tracking('Speed Demand (rpm)','rpm',0.1);
Можно теперь настроить пропорциональные и интегральные усиления с looptune
:
ST1 = systune(ST0,TR);
Final: Soft = 1.04, Hard = -Inf, Iterations = 40
Это возвращает обновленное описание ST1
содержа настроенные значения усиления. Чтобы подтвердить этот проект, постройте ответ с обратной связью от скорости, потребуйте ускоряться:
T1 = getIOTransfer(ST1,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1,0.5)
Ответ выглядит хорошим в линейной области, так продвиньте настроенные значения усиления к Simulink и далее подтвердите проект в нелинейной модели.
writeBlockValue(ST1)
Нелинейные результаты симуляции появляются в рисунке 3. Нелинейное поведение намного хуже, чем линейная аппроксимация. Рисунок 4 показывает насыщение и колебания во внутреннем (текущем) цикле.
Рисунок 3: нелинейная симуляция настроенного контроллера.
Рисунок 4: текущий контроллер Выход.
До сих пор мы только задали желаемое время отклика для внешнего (скорость) цикл. Это оставляет systune
свободный выделить усилие по управлению между внутренними и внешними циклами. Насыщение во внутреннем цикле предполагает, что пропорциональное усиление слишком высоко и что некоторое изменение баланса необходимо. Одно возможное средство должно явным образом ограничить усиление от команды скорости до "Current PID" выход. Для ссылки скорости 2 000 об/мин и пределов насыщения плюс/минус 5, среднее усиление не должно превышать 5/2000 = 0.0025. Чтобы быть консервативными, попытайтесь мешать усилению ссылка скорости на "Текущий ПИД" ниже 0.001. Для этого добавьте ограничение усиления и повторно настройте усиления контроллера с обоими требованиями на месте.
% Mark the "Current PID" output as a point of interest addPoint(ST0,'Current PID') % Limit gain from speed demand to "Current PID" output to avoid saturation MG = TuningGoal.Gain('Speed Demand (rpm)','Current PID',0.001); % Retune with this additional goal ST2 = systune(ST0,[TR,MG]);
Final: Soft = 1.39, Hard = -Inf, Iterations = 52
Итоговое усиление 1.39 указывает, что требования почти, но не точно соответствовавшие (все требования удовлетворяются, когда итоговое усиление меньше 1). Используйте viewGoal
смотреть как настроенный тариф контроллеров против каждой цели.
figure('Position',[100,100,560,550])
viewGoal([TR,MG],ST2)
Затем сравните два проекта в линейной области.
T2 = getIOTransfer(ST2,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1,'b',T2,'g--',0.4) legend('Initial tuning','Tuning with Gain Constraint')
Второй проект менее агрессивен, но все еще удовлетворяет требование времени отклика. Сравнение настроенных коэффициентов ПИД показывает, что пропорциональное усиление в текущем цикле уменьшалось с 18 до приблизительно 2.
showTunable(ST1) % initial tuning
Block 1: rct_linact/Current Controller/Current PID = Kp = 30 Name: Current_PID P-only controller. ----------------------------------- Block 2: rct_linact/Speed Controller/Speed PID = 1 Kp + Ki * --- s with Kp = 0.391, Ki = 0.412 Name: Speed_PID Continuous-time PI controller in parallel form.
showTunable(ST2) % retuning
Block 1: rct_linact/Current Controller/Current PID = Kp = 2.2 Name: Current_PID P-only controller. ----------------------------------- Block 2: rct_linact/Speed Controller/Speed PID = 1 Kp + Ki * --- s with Kp = 0.482, Ki = 4.95 Name: Speed_PID Continuous-time PI controller in parallel form.
Чтобы подтвердить этот новый проект, продвиньте новые настроенные значения усиления к модели Simulink и симулируйте ответ на спрос на скорость на 2 000 об/мин и воздействие загрузки на 500 Н. Результаты симуляции появляются в рисунке 5 и текущем контроллере, который выход показывают в рисунке 6.
writeBlockValue(ST2)
Рисунок 5: нелинейный ответ настройки с ограничением усиления.
Рисунок 6: текущий контроллер Выход.
Нелинейные ответы являются теперь удовлетворительными, и текущий цикл больше не насыщает. Дополнительное ограничение усиления успешно восстановило равновесие усилия по управлению между внутренними и внешними циклами.
TuningGoal.Gain
| TuningGoal.Tracking
| slTuner
| systune (slTuner)
| writeBlockValue