Этот пример показывает, как использовать несколько контроллеров MPC, чтобы управлять нелинейным непрерывным реактором смесителя (CSTR), когда он переходит от низкой скорости преобразования до высокой скорости преобразования.
Несколько Контроллеров MPC разработаны в различных условиях работы и затем реализованы с блоком Multiple MPC Controller в Simulink. Во время выполнения сигнал планирования используется, чтобы переключить контроллер от одного до другого.
Постоянно реактор смесителя (CSTR) является общей химической системой в перерабатывающей промышленности. Схематическая из системы CSTR:
Это - покрытый кожухом неадиабатический реактор корпуса, описанный экстенсивно в книге Себорга, "Динамика процесса и Управление", опубликованный Вайли, 2004. Судно принято, чтобы быть отлично смешанным, и происходит одна экзотермическая и необратимая реакция первого порядка,-> B. Входной поток реагента A питается корпус на постоянном объемном уровне. Поток продукта выходит постоянно на том же объемном уровне, и жидкая плотность является постоянной. Таким образом объем реагирующей жидкости является постоянным.
Входные параметры модели CSTR:
и выходные параметры (y (t)), которые являются также состояниями модели (x (t)):
Цель управления состоит в том, чтобы поддержать концентрацию реагента A в его желаемом заданном значении, которое изменяется в зависимости от времени когда реакторные переходы от низкой скорости преобразования до высокой скорости преобразования. Температура хладагента является переменной, которой управляют, используемой контроллером MPC, чтобы отследить ссылку. Входная потоковая концентрация канала и температура приняты, чтобы быть постоянными. Модель Simulink mpc_cstr_plant
реализует нелинейный объект CSTR.
Известно, что движущие силы CSTR строго нелинейны относительно реакторных температурных изменений и могут быть разомкнутым циклом, нестабильным во время перехода от условий работы до другого. Один контроллер MPC, разработанный в особых условиях работы, не может дать удовлетворительную производительность управления в широком рабочем диапазоне.
Чтобы управлять нелинейным объектом CSTR с линейным методом MPC управления, у вас есть несколько опций:
Если линейная модель объекта управления не может быть получена во время выполнения, сначала необходимо получить несколько линейных моделей объекта управления оффлайн в различных условиях работы, которые покрывают типичный рабочий диапазон. Затем можно выбрать один из двух подходов, чтобы реализовать стратегию MPC управления:
(1) Разработайте несколько контроллеров MPC оффлайн, один для каждой модели объекта управления. Во время выполнения используйте блок Multiple MPC Controller, который переключает контроллеры MPC от одного до другого на основе желаемой стратегии планирования, как обсуждено в этом примере. Используйте этот подход, когда модели объекта управления будут иметь различные порядки или задержки.
(2) Разработайте один контроллер MPC оффлайн в номинальной рабочей точке. Во время выполнения используйте блок Adaptive MPC Controller (обновляющий прогнозирующую модель в каждом интервале управления) вместе с блоком Linear Parameter Varying (LPV) System (предоставляющий линейную модель объекта управления стратегию планирования). Смотрите Адаптивное MPC управление Нелинейным Химическим Реактором Используя Линейный Параметр, Отличающийся Система для получения дополнительной информации. Используйте этот подход, когда все модели объекта управления будут иметь тот же порядок и задержку.
Если линейная модель объекта управления может быть получена во время выполнения, необходимо использовать блок Adaptive MPC Controller, чтобы достигнуть нелинейного управления. Существует два типичных способа получить линейную модель объекта управления онлайн:
(1) Используйте последовательную линеаризацию. Смотрите Адаптивное MPC управление Нелинейным Химическим Реактором Используя Последовательную Линеаризацию для получения дополнительной информации. Используйте этот подход, когда нелинейная модель объекта управления будет доступна и сможет линеаризоваться во время выполнения.
(2) Используйте онлайновую оценку, чтобы идентифицировать линейную модель, когда круг будет замкнут. Смотрите Адаптивное MPC управление Нелинейным Химическим Реактором Используя Онлайновую Образцовую Оценку для получения дополнительной информации. Используйте этот подход, когда линейная модель объекта управления не сможет быть получена или из системы LPV или из последовательной линеаризации.
Чтобы запустить этот пример, Simulink® и Simulink Control Design® требуются.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end if ~mpcchecktoolboxinstalled('slcontrol') disp('Simulink Control Design(R) is required to run this example.') return end
Во-первых, линейная модель объекта управления получена в начальных условиях работы, СТОИМОСТЬ И СТРАХОВАНИЕ является 10 kgmol/m^3, Ti и Tc являются 298.15 K. Функции от Simulink Control Design, такие как operspec
, findop
, и linearize
, используются, чтобы сгенерировать линейную систему пространства состояний из модели Simulink.
Создайте спецификацию рабочей точки.
plant_mdl = 'mpc_cstr_plant';
op = operspec(plant_mdl);
Питайтесь концентрация известна при начальном условии.
op.Inputs(1).u = 10; op.Inputs(1).Known = true;
Температура канала известна при начальном условии.
op.Inputs(2).u = 298.15; op.Inputs(2).Known = true;
Температура хладагента известна при начальном условии.
op.Inputs(3).u = 298.15; op.Inputs(3).Known = true;
Вычислите начальное условие.
[op_point,op_report] = findop(plant_mdl,op);
% Obtain nominal values of x, y and u.
x0 = [op_report.States(1).x; op_report.States(2).x];
y0 = [op_report.Outputs(1).y; op_report.Outputs(2).y];
u0 = [op_report.Inputs(1).u; op_report.Inputs(2).u; op_report.Inputs(3).u];
Operating point search report: --------------------------------- Operating point search report for the Model mpc_cstr_plant. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- (1.) mpc_cstr_plant/CSTR/Integrator x: 311 dx: 8.12e-11 (0) (2.) mpc_cstr_plant/CSTR/Integrator1 x: 8.57 dx: -6.87e-12 (0) Inputs: ---------- (1.) mpc_cstr_plant/CAi u: 10 (2.) mpc_cstr_plant/Ti u: 298 (3.) mpc_cstr_plant/Tc u: 298 Outputs: ---------- (1.) mpc_cstr_plant/T y: 311 [-Inf Inf] (2.) mpc_cstr_plant/CA y: 8.57 [-Inf Inf]
Получите линейную модель при начальном условии.
plant = linearize(plant_mdl,op_point);
Проверьте, что линейная модель является разомкнутым циклом, стабильным при этом условии.
eig(plant)
ans = -0.5223 -0.8952
Вы разрабатываете MPC в начальных условиях работы.
Ts = 0.5;
Задайте типы сигнала, используемые в MPC. Примите, что и реакторная температура и концентрация измеримы.
plant.InputGroup.UnmeasuredDisturbances = [1 2]; plant.InputGroup.ManipulatedVariables = 3; plant.OutputGroup.Measured = [1 2]; plant.InputName = {'CAi','Ti','Tc'}; plant.OutputName = {'T','CA'};
Создайте контроллер MPC с прогнозом по умолчанию и управляйте горизонтами
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. for output(s) y1 and zero weight for output(s) y2
Установите номинальные значения в контроллере. Обратите внимание на то, что номинальная стоимость для неизмеренного воздействия должна быть нулем.
mpcobj.Model.Nominal = struct('X',x0,'U',[0;0;u0(3)],'Y',y0,'DX',[0 0]);
Установите масштабные коэффициенты, потому что сигналы ввода и вывода объекта имеют различные порядки величины.
Uscale = [10;30;50]; Yscale = [50;10]; mpcobj.DV(1).ScaleFactor = Uscale(1); mpcobj.DV(2).ScaleFactor = Uscale(2); mpcobj.MV.ScaleFactor = Uscale(3); mpcobj.OV(1).ScaleFactor = Yscale(1); mpcobj.OV(2).ScaleFactor = Yscale(2);
Цель будет состоять в том, чтобы отследить заданный переход в реакторной концентрации. Реакторная температура будет измеряться и использоваться в оценке состояния, но диспетчер не попытается отрегулировать его непосредственно. Это будет отличаться по мере необходимости, чтобы отрегулировать концентрацию. Таким образом обнулите его вес MPC.
mpcobj.Weights.OV = [0 1];
Объект вводит 1, и 2 неизмеренные воздействия. По умолчанию контроллер принимает интегрированный белый шум с модульным значением в этих входных параметрах при конфигурировании средства оценки состояния. Попытайтесь увеличить сигнал к шуму средства оценки состояния фактором 10, чтобы улучшать производительность подавления помех.
Dist = ss(getindist(mpcobj));
Dist.B = eye(2)*10;
setindist(mpcobj,'model',Dist);
-->Converting model to discrete time. -->The "Model.Disturbance" property of "mpc" object is empty: Assuming unmeasured input disturbance #1 is integrated white noise. Assuming unmeasured input disturbance #2 is integrated white noise. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Все другие параметры MPC в их значениях по умолчанию.
"mpc_cstr_single" содержит модель Simulink® с CSTR и Контроллером MPC блоки в настройке обратной связи.
mpc_mdl = 'mpc_cstr_single';
open_system(mpc_mdl)
Обратите внимание на то, что блок MPC Controller сконфигурирован, чтобы предусмотреть в (предварительном просмотре) изменения заданного значения в будущем; то есть, ожидая переход заданного значения. Это обычно улучшает отслеживание заданного значения.
Задайте постоянное заданное значение для вывода.
CSTR_Setpoints.time = [0; 60]; CSTR_Setpoints.signals.values = [y0 y0]';
Протестируйте ответ на 5%-е увеличение концентрации канала.
set_param([mpc_mdl '/Feed Concentration'],'Value','10.5');
Установите шкалы графика и моделируйте ответ.
open_system([mpc_mdl '/Measurements']) open_system([mpc_mdl '/Coolant Temperature']) set_param([mpc_mdl '/Measurements'],'Ymin','305~8','Ymax','320~9') set_param([mpc_mdl '/Coolant Temperature'],'Ymin','295','Ymax','305') sim(mpc_mdl,10)
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Ответ с обратной связью является удовлетворительным.
Во-первых, задайте желаемый переход заданного значения. После 10-минутного периода прогрева сползайте заданное значение концентрации вниз на уровне 0,25 в минуту, пока это не достигнет 2.0 kmol/m^3.
CSTR_Setpoints.time = [0 10 11:39]'; CSTR_Setpoints.signals.values = [y0(1)*ones(31,1),[y0(2);y0(2);(y0(2):-0.25:2)';2;2]];
Удалите 5%-е увеличение концентрации канала, используемой ранее.
set_param([mpc_mdl '/Feed Concentration'],'Value','10')
Установите шкалы графика и моделируйте ответ.
set_param([mpc_mdl '/Measurements'],'Ymin','300~0','Ymax','400~10') set_param([mpc_mdl '/Coolant Temperature'],'Ymin','240','Ymax','360')
Модель Simulate.
sim(mpc_mdl,60)
Ответ с обратной связью недопустим. Производительность вдоль полного перехода может улучшаться, если другие контроллеры MPC разработаны в различных условиях работы вдоль пути к переходу. В следующем разделе двух два дополнительных контроллера MPC являются проектом на промежуточных и итоговых переходных стадиях соответственно.
Создайте спецификацию рабочей точки.
op = operspec(plant_mdl);
Питайтесь концентрация известна.
op.Inputs(1).u = 10; op.Inputs(1).Known = true;
Температура канала известна.
op.Inputs(2).u = 298.15; op.Inputs(2).Known = true;
Реакторная концентрация известна.
op.Outputs(2).y = 5.5; op.Outputs(2).Known = true;
Найдите условия работы устойчивого состояния.
[op_point,op_report] = findop(plant_mdl,op);
% Obtain nominal values of x, y and u.
x0 = [op_report.States(1).x; op_report.States(2).x];
y0 = [op_report.Outputs(1).y; op_report.Outputs(2).y];
u0 = [op_report.Inputs(1).u; op_report.Inputs(2).u; op_report.Inputs(3).u];
Operating point search report: --------------------------------- Operating point search report for the Model mpc_cstr_plant. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- (1.) mpc_cstr_plant/CSTR/Integrator x: 339 dx: 3.42e-08 (0) (2.) mpc_cstr_plant/CSTR/Integrator1 x: 5.5 dx: -2.87e-09 (0) Inputs: ---------- (1.) mpc_cstr_plant/CAi u: 10 (2.) mpc_cstr_plant/Ti u: 298 (3.) mpc_cstr_plant/Tc u: 298 [-Inf Inf] Outputs: ---------- (1.) mpc_cstr_plant/T y: 339 [-Inf Inf] (2.) mpc_cstr_plant/CA y: 5.5 (5.5)
Получите линейную модель при начальном условии.
plant_intermediate = linearize(plant_mdl,op_point);
Проверьте, что линейная модель является разомкнутым циклом, нестабильным при этом условии.
eig(plant_intermediate)
ans = 0.4941 -0.8357
Задайте типы сигнала, используемые в MPC. Примите, что и реакторная температура и концентрация измеримы.
plant_intermediate.InputGroup.UnmeasuredDisturbances = [1 2]; plant_intermediate.InputGroup.ManipulatedVariables = 3; plant_intermediate.OutputGroup.Measured = [1 2]; plant_intermediate.InputName = {'CAi','Ti','Tc'}; plant_intermediate.OutputName = {'T','CA'};
Создайте контроллер MPC с прогнозом по умолчанию и управляйте горизонтами.
mpcobj_intermediate = mpc(plant_intermediate,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. for output(s) y1 and zero weight for output(s) y2
Установите номинальные значения, масштабные коэффициенты и веса в контроллере.
mpcobj_intermediate.Model.Nominal = struct('X',x0,'U',[0;0;u0(3)],'Y',y0,'DX',[0 0]); Uscale = [10;30;50]; Yscale = [50;10]; mpcobj_intermediate.DV(1).ScaleFactor = Uscale(1); mpcobj_intermediate.DV(2).ScaleFactor = Uscale(2); mpcobj_intermediate.MV.ScaleFactor = Uscale(3); mpcobj_intermediate.OV(1).ScaleFactor = Yscale(1); mpcobj_intermediate.OV(2).ScaleFactor = Yscale(2); mpcobj_intermediate.Weights.OV = [0 1]; Dist = ss(getindist(mpcobj_intermediate)); Dist.B = eye(2)*10; setindist(mpcobj_intermediate,'model',Dist);
-->Converting model to discrete time. -->The "Model.Disturbance" property of "mpc" object is empty: Assuming unmeasured input disturbance #1 is integrated white noise. Assuming unmeasured input disturbance #2 is integrated white noise. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Создайте спецификацию рабочей точки.
op = operspec(plant_mdl);
Питайтесь концентрация известна.
op.Inputs(1).u = 10; op.Inputs(1).Known = true;
Температура канала известна.
op.Inputs(2).u = 298.15; op.Inputs(2).Known = true;
Реакторная концентрация известна.
op.Outputs(2).y = 2; op.Outputs(2).Known = true;
Найдите установившиеся условия работы.
[op_point,op_report] = findop(plant_mdl,op);
% Obtain nominal values of x, y and u.
x0 = [op_report.States(1).x; op_report.States(2).x];
y0 = [op_report.Outputs(1).y; op_report.Outputs(2).y];
u0 = [op_report.Inputs(1).u; op_report.Inputs(2).u; op_report.Inputs(3).u];
Operating point search report: --------------------------------- Operating point search report for the Model mpc_cstr_plant. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- (1.) mpc_cstr_plant/CSTR/Integrator x: 373 dx: 5.57e-11 (0) (2.) mpc_cstr_plant/CSTR/Integrator1 x: 2 dx: -4.6e-12 (0) Inputs: ---------- (1.) mpc_cstr_plant/CAi u: 10 (2.) mpc_cstr_plant/Ti u: 298 (3.) mpc_cstr_plant/Tc u: 305 [-Inf Inf] Outputs: ---------- (1.) mpc_cstr_plant/T y: 373 [-Inf Inf] (2.) mpc_cstr_plant/CA y: 2 (2)
Получите линейную модель при начальном условии.
plant_final = linearize(plant_mdl,op_point);
Проверьте, что линейная модель является снова разомкнутым циклом, стабильным при этом условии.
eig(plant_final)
ans = -1.1077 + 1.0901i -1.1077 - 1.0901i
Задайте типы сигнала, используемые в MPC. Примите, что и реакторная температура и концентрация измеримы.
plant_final.InputGroup.UnmeasuredDisturbances = [1 2]; plant_final.InputGroup.ManipulatedVariables = 3; plant_final.OutputGroup.Measured = [1 2]; plant_final.InputName = {'CAi','Ti','Tc'}; plant_final.OutputName = {'T','CA'};
Создайте контроллер MPC с прогнозом по умолчанию и управляйте горизонтами.
mpcobj_final = mpc(plant_final,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. for output(s) y1 and zero weight for output(s) y2
Установите номинальные значения, масштабные коэффициенты и веса в контроллере.
mpcobj_final.Model.Nominal = struct('X',x0,'U',[0;0;u0(3)],'Y',y0,'DX',[0 0]); Uscale = [10;30;50]; Yscale = [50;10]; mpcobj_final.DV(1).ScaleFactor = Uscale(1); mpcobj_final.DV(2).ScaleFactor = Uscale(2); mpcobj_final.MV.ScaleFactor = Uscale(3); mpcobj_final.OV(1).ScaleFactor = Yscale(1); mpcobj_final.OV(2).ScaleFactor = Yscale(2); mpcobj_final.Weights.OV = [0 1]; Dist = ss(getindist(mpcobj_final)); Dist.B = eye(2)*10; setindist(mpcobj_final,'model',Dist);
-->Converting model to discrete time. -->The "Model.Disturbance" property of "mpc" object is empty: Assuming unmeasured input disturbance #1 is integrated white noise. Assuming unmeasured input disturbance #2 is integrated white noise. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Следующая модель использует блок Multiple MPC Controllers, чтобы реализовать три контроллера MPC через рабочий диапазон.
mmpc_mdl = 'mpc_cstr_multiple';
open_system(mmpc_mdl)
Обратите внимание на то, что это было сконфигурировано, чтобы использовать эти три контроллера в последовательности: mpcobj
, mpcobj_intermediate
и mpcobj_final
.
open_system([mmpc_mdl '/Multiple MPC Controllers'])
Обратите внимание также, что два переключателя задают, когда переключиться от одного диспетчера на другого. Правила:
Если концентрация CSTR> = 8, используйте mpcobj
.
Если 3 <= концентрация CSTR <8, используйте mpcobj_intermediate
.
Если концентрация CSTR <3, используйте mpcobj_final
.
Моделируйте с блоком Multiple MPC Controllers
open_system([mmpc_mdl '/Measurements']) open_system([mmpc_mdl '/MV']) sim(mmpc_mdl)
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Переходом теперь хорошо управляют. Основное улучшение находится в переходе через нестабильный регион разомкнутого цикла. График переключающегося сигнала показывает, когда переходы контроллера происходят. Символ мВ изменяется в эти времена из-за изменения в динамических характеристиках, введенных новой моделью прогноза.
bdclose(plant_mdl) bdclose(mpc_mdl) bdclose(mmpc_mdl)
Контроллер MPC | Несколько контроллеров MPC