В этом примере показано, как использовать линейный MPC-контроллер с непрерывными и дискретными управляющими действиями для управления уровнем уравнительного резервуара в Simulink.
Многие нефтехимические процессы включают в себя пропускную способность, чтобы изолировать операции ниже по течению от сбоев в потоках выше по течению. В этом примере рассматривается жидкостный уравнительный резервуар, подаваемый двумя насосами.
Насос 1 имеет переменную скорость и может обеспечивать скорость потока от 0 до 100 л/мин. Скорость изменения расхода ограничена 50 л/мин в минуту.
Насос 2 включен и подает 100 л/мин, когда он включен.
Также имеется непрерывно регулируемый клапан, который регулирует выпуск из резервуара, чтобы приспособить процесс после него.
mdl = 'ReservoirMPC';
open_system(mdl)

Задача управления состоит в том, чтобы использовать два насоса (регулируемые переменные) для поддержания объема резервуара на его уставке, когда выпускной клапан вводит возмущение в уравнительный резервуар (измеренное возмущение).
Когда потребность ниже по потоку постоянна, насос 1 контролирует уровень в резервуаре для перенапряжения, в идеале поддерживая его на уровне около 50%. При возникновении возмущения оба насоса могут действовать для поддержания объема резервуара между 25% и 75% в течение переходного периода. Однако, когда потребность ниже по потоку высока, насос 2 должен включиться.
Таким образом, контроллер MPC управляет двумя насосами таким образом, что:
Уровень в резервуаре остается на уровне около 50% при постоянном спросе.
Уровень в резервуаре остается в идеальном диапазоне при включении и отключении насоса 2. Включение-выключение насоса 2 нежелательно.
В модели Simulink модель уравнительного резервуара находится в подсистеме «Резервуар». Он реализует следующие уравнения.
dV/dt = Qin - Qout, где V - объем резервуара от 0 до 100 (%)
Qin = Q1 + Q2, сумма двух расходов насоса (л/мин)
Qout = 0.2*sqrt(2)*X*sqrt(V), скорость разряда (л/мин)
X - открытие выпускного клапана между 0 и 100 (в процентах)
Установка работает в номинальной установившейся рабочей точке: насос 1 работает со скоростью 70 л/мин, насос 2 выключен, нагнетательный клапан 35%, объем бака 50%. Создайте линейную модель резервуара в этой рабочей точке. Эта модель имеет три входных сигнала: Q1 и Q2 являются управляемыми переменными и X - измеренное возмущение.
plant = ss(-0.7,[1 1 -2],1,[0 0 0]); plant = setmpcsignals(plant,'MV',[1 2],'MD',3);
Создайте линейный контроллер MPC с временем выборки одну секунду и горизонтами прогнозирования и управления по умолчанию.
Ts = 1; MPCobj = mpc(plant,Ts);
-->The "PredictionHorizon" property of "mpc" object is empty. Trying PredictionHorizon = 10. -->The "ControlHorizon" property of the "mpc" object is empty. Assuming 2. -->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.
Установите номинальные значения контроллера в соответствии с рабочей точкой установившегося режима.
MPCobj.Model.Nominal.U = [70; 0; 35]; MPCobj.Model.Nominal.Y = 50; MPCobj.Model.Nominal.X = 50; MPCobj.Model.Nominal.DX = 0;
Выберите весовые коэффициенты MVRate так, чтобы контроллер регулировал насос 1 по сравнению с насосом 2. В других случаях контроллер штрафует насос 1 за движение, меньшее, чем насос 2.
MPCobj.Weights.MVrate = [0.1 0.2];
Укажите границы безопасности для непрерывных входных и выходных и выходных сигналов.
MPCobj.OV.Min = 0; MPCobj.OV.Max = 100; MPCobj.MV(1).Min = 0; MPCobj.MV(1).Max = 100; MPCobj.MV(1).RateMin = -50; MPCobj.MV(1).RateMax = 50;
Так как насос 2 имеет две дискретные настройки (0 и 100 л/мин), укажите дискретный набор в Type свойства контроллера. В зависимости от приложения, Type свойство также может быть «binary» или «integer».
MPCobj.MV(2).Type = [0 100];
Моделирование начинается в номинальном состоянии. При t = 5 скорость нагнетания увеличивается до полной производительности насоса 1 и насос 2 должен включиться. Насос 2 включается при t = 12. Насос 1 должен затем уменьшаться как можно быстрее, чтобы поддерживать уровень в пределах, а затем устанавливать новую рабочую точку установившегося режима. При t = 60 разряд начинает снижаться до номинального состояния. Контроллер MPC поддерживает объем в идеальном диапазоне, и насос 2 не проявляет быстрой цикличности.
sim(mdl)
open_system([mdl '/Volume'])
-->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.
ans =
Simulink.SimulationOutput:
tout: [106x1 double]
SimulationMetadata: [1x1 Simulink.SimulationMetadata]
ErrorMessage: [0x0 char]

На следующем рисунке показаны расходы от двух насосов.
open_system([mdl '/Pumps'])

Насос 2 включается и выключается контроллером MPC, как и ожидалось.
bdclose(mdl) % close simulink model.
Дискретный блок управления MPC