Этот пример показывает, как использовать 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);
Структура данных ST0
содержит описание системы управления и ее настраиваемых элементов. Затем укажите, что двигатель постоянного тока должен следовать за спросом на скорость на 2 000 об/мин через 0,1 секунды:
TR = TuningGoal.Tracking('Speed Demand (rpm)','rpm',0.1);
Можно теперь настроить пропорциональные и интегральные усиления с looptune
:
ST1 = systune(ST0,TR);
Final: Soft = 1.12, Hard = -Inf, Iterations = 34
Это возвращает обновленное описание ST1
, содержащий настроенные значения усиления. Чтобы подтвердить этот проект, постройте ответ с обратной связью от скорости, потребуйте ускоряться:
T1 = getIOTransfer(ST1,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1)
Ответ выглядит хорошим в линейной области, так продвиньте настроенные значения усиления к Simulink и далее подтвердите проект в нелинейной модели.
writeBlockValue(ST1)
Нелинейные результаты симуляции появляются в рисунке 3. Нелинейное поведение намного хуже, чем линейная аппроксимация, несоответствие, которое может быть прослежено до насыщения во внутреннем цикле (см. рисунок 4).
Рисунок 3: нелинейная симуляция настроенного контроллера.
Рисунок 4: Текущий Контроллер Вывод (ограниченный плюс/минус 5).
До сих пор мы только задали желаемое время отклика для внешнего (скорость) цикл. Это оставляет systune
свободным выделить усилие по управлению между внутренними и внешними циклами. Насыщение во внутреннем цикле предполагает, что пропорциональное усиление слишком высоко и что некоторое изменение баланса необходимо. Одно возможное средство должно явным образом ограничить усиление от команды скорости до выходных параметров контроллеров PI и P. Для ссылки скорости 2 000 об/мин и пределов насыщения плюс/минус 5, среднее усиление не должно превышать 5/2000 = 0.0025. Чтобы быть консервативными, мы можем попытаться помешать усилению ссылка скорости на контроллер выходные параметры ниже 0.001. Для этого добавьте два требования усиления и повторно настройте усиления контроллера со всеми тремя требованиями на месте.
% Mark the control signals as points of interest so that they can be % referenced in the gain requirements addPoint(ST0,{'Current PID','Speed PID'}) % Limit gain from speed demand to control signals to avoid saturation MG1 = TuningGoal.Gain('Speed Demand (rpm)','Speed PID',0.001); MG2 = TuningGoal.Gain('Speed Demand (rpm)','Current PID',0.001); % Retune with these additional requirements ST2 = systune(ST0,[TR,MG1,MG2]);
Final: Soft = 1.39, Hard = -Inf, Iterations = 42
Итоговое усиление 1.39 указывает, что требования почти, но не точно соответствовавшие (все требования удовлетворяются, когда итоговое усиление - меньше чем 1). Используйте viewGoal
, чтобы осмотреть как настроенный тариф контроллеров против каждого требования.
figure('Position',[100,100,560,550])
viewGoal([TR,MG1,MG2],ST2)
Затем сравните два проекта в линейной области.
T2 = getIOTransfer(ST2,'Speed Demand (rpm)',{'rpm','i'}); figure step(T1,'b',T2,'g--') legend('Initial tuning','Tuning with Gain Constraints')
Второй проект менее агрессивен, но все еще удовлетворяет требование времени отклика. Наконец, продвиньте новые настроенные значения усиления к модели Simulink и моделируйте ответ на спрос на скорость на 2 000 об/мин и воздействие загрузки на 500 Н. Результаты симуляции появляются в рисунке 5 и текущем контроллере, который вывод показывают в рисунке 6.
writeBlockValue(ST2)
Рисунок 5: нелинейный ответ настройки с ограничениями усиления.
Рисунок 6: текущий контроллер Вывод.
Нелинейные ответы являются теперь удовлетворительными, и текущий цикл больше не насыщает. Дополнительные ограничения усиления обеспечили systune
, чтобы перераспределить усилие по управлению между внутренними и внешними циклами, чтобы избежать насыщения.
TuningGoal.Gain
| TuningGoal.Tracking
| slTuner
| systune (slTuner)
| writeBlockValue