exponenta event banner

Надежная настройка системы масса-пружина-демпфер

В этом примере показано, как надежно настроить PID-контроллер для неопределенной системы демпфера-пружины массы, смоделированной в Simulink.

Имитационная модель системы масса-пружина-демпфер

Демпфер масса-пружина, изображенный на фиг.1, моделируется дифференциальным уравнением второго порядка.

$$m \ddot{x} + c \dot{x} + k x = F$$

где$F$ - сила, приложенная к массе, и$x$ - горизонтальное положение массы.

Рисунок 1: Система масс-пружин-демпферов.

Эта система моделируется в Simulink следующим образом:

open_system('rct_mass_spring_damper')

Мы можем использовать контроллер PID для создания усилий$F$, необходимых для изменения позиции. $x$Настройка этого PID-контроллера проста, когда физические параметры$m,c,k$ точно известны. Однако на практике это происходит редко из-за ряда факторов, включая неточные измерения, производственные допуски, изменения условий эксплуатации и износ. В этом примере показано, как учитывать такую неопределенность во время настройки для поддержания высокой производительности в пределах диапазона ожидаемых значений для.$m,c,k$

Моделирование неопределенности

Модель Simulink использует «наиболее вероятные» или «номинальные» значения:$m,c,k$

$$m =3 , \;\; c = 1 , \;\; k = 2 .$$

Используйте «неопределенный реал» (ureal) объект для моделирования диапазона значений, которые может принимать каждый параметр. Здесь неопределенность определяется как процентное отклонение от номинального значения.

um = ureal('m',3,'Percentage',40);
uc = ureal('c',1,'Percentage',20);
uk = ureal('k',2,'Percentage',30);

Номинальная настройка

Сначала настройте контроллер PID на номинальные значения параметров. Здесь мы используем два простых требования к конструкции:

  • Позиция$x$ должна отслеживать изменение шага с 1 секундным временем отклика

  • Коэффициент фильтра$N$ в ПИД-контроллере не должен превышать 100.

Эти требования выражаются как цели настройки:

Req1 = TuningGoal.Tracking('r','x',1);
Req2 = TuningGoal.ControllerPoles('Controller',0,0,100);

Создание slTuner интерфейс для настройки блока «Controller» в модели Simulink и использования systune для настройки выигрышей PID и наилучшего соответствия двум требованиям.

ST0 = slTuner('rct_mass_spring_damper','Controller');

ST = systune(ST0,[Req1 Req2]);
Final: Soft = 1.02, Hard = -Inf, Iterations = 44

Использовать getIOTransfer для просмотра ответа шага с замкнутым контуром.

Tnom = getIOTransfer(ST,'r','x');
step(Tnom)

Номинальный отклик соответствует требуемому времени отклика и выглядит хорошо. Но насколько оно устойчиво к вариациям?$m,c,k$

Анализ надежности

Для ответа на этот вопрос используйте функцию «подстановка блоков» slTuner создание неопределенной модели системы масса-пружина-демпфер с замкнутым контуром. Подстановка блоков позволяет задать линеаризацию конкретного блока в модели Simulink. Здесь мы используем это, чтобы заменить четкие значения$m,c,k$ на неопределенные значения um,uc,uk определено выше.

blocksubs(1).Name = 'rct_mass_spring_damper/Mass';
blocksubs(1).Value = 1/um;
blocksubs(2).Name = 'rct_mass_spring_damper/Damping';
blocksubs(2).Value = uc;
blocksubs(3).Name = 'rct_mass_spring_damper/Spring Stiffness';
blocksubs(3).Value = uk;
UST0 = slTuner('rct_mass_spring_damper','Controller',blocksubs);

Для оценки надежности номинальной настройки примените настроенные коэффициенты усиления PID к (не настроенной) неопределенной модели. UST0 и имитировать «неопределенный» отклик с замкнутым контуром.

% Apply result of nominal tuning (ST) to uncertain closed-loop model UST0
setBlockValue(UST0,getBlockValue(ST));
Tnom = getIOTransfer(UST0,'r','x');
rng(0), step(Tnom,25), grid

step график показывает отклик по замкнутому контуру с номинально настроенным PID для 20 случайно выбранных значений$m,c,k$ в заданном диапазоне неопределенности. Наблюдайте значительное ухудшение рабочих характеристик для некоторых комбинаций параметров, с плохо затухающими колебаниями и длительным временем оседания.

Надежная настройка

Для повышения надежности ПИД-контроллера переустановите его с использованием неопределенной модели с замкнутым контуром UST0 вместо номинальной модели с замкнутым контуром ST0. Из-за наличия ureal компоненты в модели, systune автоматически пытается максимизировать производительность во всем диапазоне неопределенности. Это означает минимизацию наихудшего значения «мягких» целей настройки Req1 и Req2.

UST0 = slTuner('rct_mass_spring_damper','Controller',blocksubs);

UST = systune(UST0,[Req1 Req2]);
Soft: [1.02,4.9], Hard: [-Inf,-Inf], Iterations = 44
Soft: [1.03,1.41], Hard: [-Inf,-Inf], Iterations = 32
Soft: [1.04,1.04], Hard: [-Inf,-Inf], Iterations = 21
Final: Soft = 1.04, Hard = -Inf, Iterations = 97

Надежная производительность лишь немного хуже номинальной, но такое же неопределенное моделирование с замкнутым контуром показывает значительное улучшение по сравнению с номинальной конструкцией.

Trob = getIOTransfer(UST,'r','x');
rng(0), step(Tnom,Trob,25), grid
legend('Nominal tuning','Robust tuning')

Это подтверждается построением графика наихудшего коэффициента усиления от$r$ до$x$ как функции частоты. Обратите внимание на ослабленный резонанс около 1 рад/с.

clf
subplot(121), wcsigmaplot(Tnom,{1e-2,1e2}), grid
set(gca,'YLim',[-20 10]), title('Nominal tuning')
subplot(122), wcsigmaplot(Trob,{1e-2,1e2}), grid
set(gca,'YLim',[-20 10]), title('Robust tuning'), legend('off')

Сравнение двух контроллеров PID показывает сходное поведение, за исключением одного ключевого различия. Номинально настроенный PID чрезмерно полагается на «отмену» (вырезание) резонанса установки, что не является надежной стратегией при наличии неопределенности в резонансной частоте.

Cnom = getBlockValue(ST,'Controller');
Crob = getBlockValue(UST,'Controller');
clf, bode(Cnom,Crob), grid
legend('Nominal tuning','Robust tuning')

Для получения дополнительной информации постройте график индекса производительности (максимальное значение «мягких» целей настройки Req1,Req2) как функция неопределенных параметров$m,k$ для номинального демпфирования. $c=1$Используйте функцию «изменяющийся параметр» slTuner для создания массива моделей с замкнутым контуром по сетке$m,k$ значений, покрывающих их диапазоны неопределенности.

% Specify a 6-by-6 grid of (m,k) values for linearization
ms = linspace(um.Range(1),um.Range(2),6);
ks = linspace(uk.Range(1),uk.Range(2),6);
[ms,ks] = ndgrid(ms,ks);
params(1).Name = 'm';
params(1).Value = ms;
params(2).Name = 'k';
params(2).Value = ks;
STP = slTuner('rct_mass_spring_damper','Controller',params);

% Evaluate performance index over (m,k) grid for nominally tuned PID
setBlockValue(STP,'Controller',Cnom)
[~,F1] = evalGoal(Req1,STP);
[~,F2] = evalGoal(Req2,STP);
Fnom = max(F1,F2);

% Evaluate performance index over (m,k) grid for robust PID
setBlockValue(STP,'Controller',Crob)
[~,F1] = evalGoal(Req1,STP);
[~,F2] = evalGoal(Req2,STP);
Frob = max(F1,F2);

% Compare the two performance surfaces
clf
subplot(211), surf(ms,ks,Fnom)
xlabel('m'), ylabel('k'), zlabel('Performance'), title('Nominal tuning (c=1)')
subplot(212), surf(ms,ks,Frob), set(gca,'ZLim',[1 2])
xlabel('m'), ylabel('k'), zlabel('Performance'), title('Robust tuning (c=1)')

Этот график показывает, что номинальная настройка очень чувствительна к изменениям массы$m$ или жесткости пружины, $k$в то время как надежная настройка по существу нечувствительна к этим параметрам. Для завершения проектирования используйте writeBlockValue чтобы применить надежное увеличение PID к модели Simulink и продолжить проверку в Simulink.

writeBlockValue(UST)

Связанные примеры

Подробнее