Запланируйте контроллеры в нескольких рабочих точках

Если ваш объект нелинеен, контроллер, разработанный, чтобы действовать в конкретной целевой области, может выполнить плохо в других областях. Распространенный способ компенсировать состоит в том, чтобы создать несколько контроллеров, каждый разработанный для конкретной комбинации условий работы. Можно затем переключиться между контроллерами в режиме реального времени, когда условия изменяются. Для получения дополнительной информации смотрите Запланированный на усиление MPC.

Следующий пример показывает, как скоординировать многоуровневую модель прогнозирующие контроллеры с этой целью.

Модель объекта управления

Объект содержит две массы, M1 и M2, соединенный с двумя пружинами. Пружина с коэффициентом упругости, k1 вытягивает массовый M1 направо, и пружина с коэффициентом упругости k2, вытягивает массовый M2 налево. Переменная, которой управляют, является силой, вытягивающей массовый M1 налево, показавший Красной стрелой в следующей фигуре.

Обе массы перемещаются свободно, пока они не сталкиваются. Столкновение неэластично, и массы склеиваются, пока изменение в приложенной силе не разделяет их. Поэтому существует два условий работы для системы с различной динамикой.

Цель управления состоит в том, чтобы заставить положение M1 отследить ссылочный сигнал, показавший синим треугольником в предыдущем изображении. Только положение M1 и датчика контакта доступно для обратной связи.

Задайте параметры модели.

M1 = 1;       % masses
M2 = 5;
k1 = 1;       % spring constants
k2 = 0.1;
b1 = 0.3;     % friction coefficients
b2 = 0.8;
yeq1 = 10;    % wall mount positions
yeq2 = -10;

Создайте модель в пространстве состояний для того, когда массы не будут в контакте; это - когда массовый M1 перемещается свободно.

A1 = [0 1; -k1/M1 -b1/M1];
B1 = [0 0; -1/M1 k1*yeq1/M1];
C1 = [1 0];
D1 = [0 0];
sys1 = ss(A1,B1,C1,D1);
sys1 = setmpcsignals(sys1,'MV',1,'MD',2);

Создайте модель в пространстве состояний для того, когда массы будут соединены.

A2 = [0 1; -(k1+k2)/(M1+M2) -(b1+b2)/(M1+M2)];
B2 = [0 0; -1/(M1+M2) (k1*yeq1+k2*yeq2)/(M1+M2)];
C2 = [1 0];
D2 = [0 0];
sys2 = ss(A2,B2,C2,D2);
sys2 = setmpcsignals(sys2,'MV',1,'MD',2);

Для обеих моделей:

  • Состояния являются положением и скоростью M1.

  • Входные параметры являются приложенной силой, которая является переменной, которой управляют, (MV) и калибровочным сигналом коэффициента упругости, который является измеренным воздействием (MD).

  • Вывод является положением M1.

Разработайте контроллеры MPC

Разработайте один контроллер MPC для каждой из моделей объекта управления. Оба контроллера идентичны за исключением своих внутренних моделей прогноза.

Задайте тот же шаг расчета, Ts, горизонт прогноза, p, и управляйте горизонтом, m, для обоих контроллеров.

Ts = 0.2;
p = 20;
m = 1;

Создайте контроллеры MPC по умолчанию для каждой модели объекта управления.

MPC1 = mpc(sys1,Ts,p,m);
MPC2 = mpc(sys2,Ts,p,m);
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000.
-->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000.
-->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000.
-->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000.
-->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.

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

MPC1.MV = struct('Min',0,'Max',30,'RateMin',-10,'RateMax',10);
MPC2.MV = MPC1.MV;

Моделируйте запланированные на усиление контроллеры

Моделируйте производительность контроллеров, использующих блок MPC Controller.

Откройте модель Simulink.

mdl = 'mpc_switching';
open_system(mdl)

В модели Массовая подсистема M1 моделирует движение массового M1, и при перемещении свободно и, когда соединено с M2. Массовая подсистема M2 моделирует движение массового M2, когда это перемещается свободно. Выбор режима и скоростные подсистемы сброса координируют столкновение и разделение масс.

Модель содержит переключающуюся логику, которая обнаруживает, когда положения M1 и M2 являются тем же самым. Получившееся переключение сигнализирует о подключениях к импорту switch блока Multiple MPC Controllers и средствах управления, какой контроллер MPC активен.

Задайте исходное положение для каждой массы.

y1initial = 0;
y2initial = 10;

Чтобы задать запланированные на усиление контроллеры, дважды кликните блок Multiple MPC Controllers. В диалоговом окне Block Parameters задайте контроллеры как массив ячеек имен контроллера. Установите начальные состояния для каждого контроллера к их соответствующей номинальной стоимости путем определения состояний как {'[],'[]'}.

Нажать ОК.

Запустите симуляцию.

sim(mdl)
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

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

open_system([mdl '/signals'])

Первоначально, MPC1 перемещает массовый M1 в ссылочное заданное значение. Приблизительно в 13 секунд M2 сталкивается с M1. Переключающийся сигнал изменяется от 1 до 2, который переключает управление на MPC2.

Столкновение отодвигает M1 от своего заданного значения, и MPC2 быстро возвращает объединенные массы в контрольную точку.

Во время последующих ссылочных переходов сигнала, когда массы отделяются и сталкиваются переключатели блока Multiple MPC Controllers между MPC1 и MPC2 соответственно. В результате объединенные массы обосновываются быстро к контрольным точкам.

Сравните с одним контроллером MPC

Чтобы продемонстрировать преимущество использования двух контроллеров MPC для этого приложения, моделируйте систему, использующую только MPC2.

Измените MPC1, чтобы совпадать с MPC2.

MPC1save = MPC1;
MPC1 = MPC2;

Запустите симуляцию.

sim(mdl)

Когда массы не соединяются, MPC2 прикладывает чрезмерную силу, поскольку это ожидает большую массу. Это агрессивное действие управления производит колебательное поведение. Если массы соединяются, производительность управления улучшается, поскольку контроллер разработан для этого условия.

Также изменение MPC2, чтобы совпадать с MPC1 приводит к вялым действиям управления и длинным временам установления, когда массы соединяются.

Задержите MPC1 к его исходной настройке.

MPC1 = MPC1save;

Создайте явные контроллеры MPC

Чтобы уменьшать онлайновое вычислительное усилие, можно создать явный контроллер MPC для каждых условий работы и реализовать запланированное на усиление явное MPC управление с помощью блока Multiple Explicit MPC Controllers. Для получения дополнительной информации о явных контроллерах MPC смотрите Явный MPC.

Чтобы создать явный контроллер MPC, сначала задайте рабочие диапазоны для состояний контроллера, входных сигналов и ссылочных сигналов.

Создайте явный объект области значений MPC с помощью соответствующего традиционного контроллера, MPC1.

range = generateExplicitRange(MPC1);

Задайте области значений для состояний контроллера. И MPC1 и MPC2 содержат состояния для:

  • Положение и скорость массового M1.

  • Интегратор от выходного возмущения по умолчанию.

Когда возможно, используйте свое знание объекта, чтобы задать области значений состояния. Например, первое состояние соответствует положению M1, который имеет область значений между-10 и 10.

Установка области значений переменной состояния может быть трудной, когда состояние не соответствует физическому параметру, такой что касается выходного состояния возмущения. В этом случае соберите информацию области значений с помощью симуляций с типичной ссылкой и сигналами воздействия. Для этой системы можно активировать дополнительный выходной порт est.state блока Multiple MPC Controllers и просмотреть предполагаемые состояния с помощью осциллографа. При симуляции ответов контроллера используйте ссылочный сигнал, который покрывает ожидаемый рабочий диапазон.

Задайте области значений состояния для явных контроллеров MPC на основе областей значений предполагаемых состояний.

range.State.Min(:) = [-10;-8;-3];
range.State.Max(:) = [10;8;3];

Задайте область значений для ссылочного сигнала. Выберите диапазон ссылки, который меньше, чем область значений положения M1.

range.Reference.Min = -8;
range.Reference.Max = 8;

Задайте переменный диапазон, которым управляют, с помощью заданных ограничений мВ.

range.ManipulatedVariable.Min = 0;
range.ManipulatedVariable.Max = 30;

Задайте область значений для измеренного сигнала воздействия. Поскольку измеренное воздействие является постоянным, задайте маленькую область значений вокруг постоянного значения, 1.

range.MeasuredDisturbance.Min = 0.9;
range.MeasuredDisturbance.Max = 1.1;

Создайте явный контроллер MPC, который соответствует MPC1 с помощью заданного объекта области значений.

expMPC1 = generateExplicitMPC(MPC1,range);

Regions found / unexplored:        4/       0

Создайте явный контроллер MPC, который соответствует MPC2. Поскольку MPC1 и MPC2 действуют по тем же и входным диапазонам состояния и имеют те же ограничения, можно использовать тот же объект области значений.

expMPC2 = generateExplicitMPC(MPC2,range);

Regions found / unexplored:        5/       0

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

Подтвердите явные контроллеры MPC

Это - хорошая практика, чтобы подтвердить производительность каждого явного контроллера MPC прежде, чем реализовать запланированный на усиление явный MPC. Например, чтобы сравнить производительность MPC1 и expMPC1, моделируйте ответ с обратной связью каждого контроллера, использующего sim.

r = [zeros(30,1); 5*ones(160,1); -5*ones(160,1)];
[Yimp,Timp,Uimp] = sim(MPC1,350,r,1);
[Yexp,Texp,Uexp] = sim(expMPC1,350,r,1);
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Сравните объект вывод, и управлял переменными последовательностями для этих двух контроллеров.

figure
subplot(2,1,1)
plot(Timp,Yimp,'b-',Texp,Yexp,'r--')
grid on
xlabel('Time (s)')
ylabel('Output')
title('Explicit MPC Validation')
legend('Implicit MPC','Explicit MPC')
subplot(2,1,2)
plot(Timp,Uimp,'b-',Texp,Uexp,'r--')
grid on
ylabel('MV')
xlabel('Time (s)')

Ответы с обратной связью и переменные последовательности, которыми управляют, неявного и явного соответствия контроллеров. Точно так же можно подтвердить производительность expMPC2 против того из MPC2.

Если ответы неявных и явных контроллеров не совпадают, настраивают явные области значений MPC и создают новый явный контроллер MPC.

Моделируйте запланированный на усиление явный MPC

Чтобы реализовать запланированное на усиление явное MPC управление, замените блок Multiple MPC Controllers на блок Multiple Explicit MPC Controllers.

expModel = 'mpc_switching_explicit';
open_system(expModel)

Чтобы задать явные контроллеры MPC, дважды кликните блок Multiple Explicit MPC Controllers. В диалоговом окне Block Parameters задайте контроллеры как массив ячеек имен контроллера. Установите начальные состояния для каждого контроллера к их соответствующей номинальной стоимости путем определения состояний как {'[],'[]'}.

Нажать ОК.

Если бы вы ранее подтвердили свои явные контроллеры MPC, то замена и конфигурирование блока Multiple Explicit MPC Controllers должны привести к тем же результатам как блок Multiple MPC Controllers.

Запустите симуляцию.

sim(expModel)

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

open_system([expModel '/signals'])

Запланированные на усиление явные контроллеры MPC обеспечивают ту же производительность как запланированные на усиление неявные контроллеры MPC.

bdclose('all')

Смотрите также

|

Похожие темы