В этом примере показано, как использовать slTuner
и systune
для настройки циклов тока и скорости в линейном электрическом приводе с пределами насыщения.
Откройте модель Simulink линейного электрического привода:
open_system('rct_linact')
Электрические и механические компоненты моделируются с помощью Simscape Electrical и Simscape Multibody. Система управления состоит из двух каскадных циклов обратной связи, управляющих ведущим током и угловой скоростью двигателя постоянного тока.
Фигура 1: Ток и Скорость Контроллеров.
Обратите внимание, что контроллер с внутренним контуром (током) является пропорциональной составляющей, в то время как контроллер с внешним контуром (скоростью) имеет пропорциональные и интегральные действия. Выход обоих контроллеров ограничен плюс/минус 5.
Нам нужно настроить пропорциональные и интегральные составляющие, чтобы ответить на спрос скорости 2000 об/мин примерно за 0,1 секунды с минимальным перерегулированием. Начальные настройки усиления в модели являются P = 50 и PI (s) = 0,2 + 0 .1/s, и соответствующий ответ показан на Фигуру 2. Этот ответ слишком медлен и слишком чувствителен к нарушениям порядка нагрузки.
Фигура 2: Untuned Response.
Можно использовать 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
содержит описание системы управления и ее настраиваемых элементов. Далее укажите, что двигатель постоянного тока должен следовать требованию скорости 2000 об/мин за 0,1 секунды:
TR = TuningGoal.Tracking('Speed Demand (rpm)','rpm',0.1);
Теперь можно настроить пропорциональные и интегральные составляющие с помощью looptune
:
ST1 = systune(ST0,TR);
Final: Soft = 1.03, Hard = -Inf, Iterations = 124
Это возвращает обновленное описание ST1
содержащие настроенные значения усиления. Чтобы подтвердить этот проект, постройте график отклика замкнутой системы от требования скорости до скорости:
T1 = getIOTransfer(ST1,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1,0.5)
Реакция выглядит хорошо в линейной области, поэтому передвиньте настроенные значения усиления в Simulink и дополнительно проверьте проект в нелинейной модели.
writeBlockValue(ST1)
Нелинейные результаты симуляции появляются в Фигуру 3. Нелинейное поведение намного хуже линейного приближения. Фиг.4 показывает насыщение и колебания во внутреннем (текущем) цикле.
Фигура 3. Нелинейная симуляция настроенного контроллера.
Фигура 4: Выход токового контроллера.
Пока мы только задали желаемое время отклика для внешнего (скоростного) цикла. Это оставляет systune
свободно распределять усилие управления между внутренним и внешним контурами. Насыщение во внутреннем цикле предполагает, что пропорциональная составляющая слишком высок и что необходима некоторая ребалансировка. Одним из возможных средств является явное ограничение усиления от команды speed выходом «Current PID». Для опорной скорости 2000 об/мин и пределов насыщения плюс/минус 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 = 18.4 Name: Current_PID P-only controller. ----------------------------------- Block 2: rct_linact/Speed Controller/Speed PID = 1 Kp + Ki * --- s with Kp = 0.402, Ki = 0.677 Name: Speed_PID Continuous-time PI controller in parallel form.
showTunable(ST2) % retuning
Block 1: rct_linact/Current Controller/Current PID = Kp = 2.38 Name: Current_PID P-only controller. ----------------------------------- Block 2: rct_linact/Speed Controller/Speed PID = 1 Kp + Ki * --- s with Kp = 0.44, Ki = 4.51 Name: Speed_PID Continuous-time PI controller in parallel form.
Чтобы подтвердить этот новый проект, передвиньте новые настроенные значения усиления к модели Simulink и симулируйте реакцию на потребность в скорости 2000 об/мин и нарушение порядка нагрузки 500 Н. Результаты симуляции показаны на фигуре 5, а выход токового контроллера показан на фигуре 6.
writeBlockValue(ST2)
Фигура 5. Нелинейная характеристика настройки с ограничением усиления.
Фигура 6: Выход токового контроллера.
Нелинейные отклики теперь удовлетворительны, и текущий цикл больше не насыщается. Дополнительное ограничение усиления успешно восстановило баланс усилия управления между внутренним и внешним контурами.
TuningGoal.Gain
| TuningGoal.Tracking
| slTuner
(Simulink Control Design) | systune (slTuner)
(Simulink Control Design) | writeBlockValue
(Simulink Control Design)