В этом примере показано, как использовать линейный контроллер MPC и с непрерывным - и с действия управления дискретного набора, чтобы управлять уровнем бака скачка в Simulink®.
Много нефтехимических процессов включают максимальную мощность, чтобы изолировать нисходящие операции от нарушений в восходящих потоках. Этот пример считает жидкий бак скачка предоставленным двумя насосами.
Накачайте 1, переменная скорость и может поставить скорость потока жидкости между 0 и 100 L/min. Скорость изменения скорости потока жидкости ограничивается 50 L/min в минуту.
Накачайте 2, является релейным и поставляет 100 L/min, когда это включено.
Эта система также имеет плавно регулируемый клапан, который регулирует выброс бака, чтобы вместить нисходящий процесс.
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
, сумма двух скоростей потока жидкости насоса (L/min)
Qout = 0.2*sqrt(2)*X*sqrt(V)
, уровень выброса (L/min)
X
, выпускной клапан, который может открыться между 0 и 100 (процент)
Объект начинает запускаться в его номинальной установившейся рабочей точке: накачайте 1, достигает 70 L/min, накачайте 2, выключено, выпускной клапан в 35%, и объем бака в 50%. Создайте линейную модель бака в этой рабочей точке. Эта модель имеет три входных параметров: переменные Q1
, которыми управляют, и
Q2
, и измеренный disturbance|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. Таким образом, диспетчер штрафует насос 2 корректировки меньше, чем насос 1 корректировка.
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 L/min), задайте дискретный набор в 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'])
As expected, the MPC controller turns pump 2 on and off.
bdclose(mdl) % close simulink model.
Дискретный набор управления MPC