В этом примере показано, как использовать линейный контроллер 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);
Создайте линейный контроллер со шаг расчета одной секунды и горизонтами предсказания и управления по умолчанию.
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
свойство может также быть «двоичным» или «целым».
MPCobj.MV(2).Type = [0 100];
Симуляция начинается при номинальном условии. При t = 5 скорость нагнетания растёт до тех пор, пока насос 1 не достигнет полной производительности, и насос 2 не будет включен. Насос 2 включается при t = 12. Насос 1 должен уменьшаться как можно быстрее, чтобы сохранить уровень в границах, затем установить новую установившуюся рабочую точку. При t = 60 разряд начинает наклоняться вниз в номинальное состояние. Cotnroller 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