В этом примере показано, как использовать несколько контроллеров MPC, чтобы управлять нелинейным непрерывным реактором смесителя (CSTR), когда он переходит от низкой скорости преобразования до высокой скорости преобразования.
Несколько контроллеров MPC спроектированы в различных условиях работы и затем реализованы с блоком Multiple MPC Controllers в Simulink. Во время выполнения сигнал планирования используется, чтобы переключиться между контроллерами.
Постоянно реактор смесителя (CSTR) является общей химической системой в перерабатывающей промышленности. Схематическая из системы CSTR:
Эта система является покрытым кожухом неадиабатическим реактором бака, описанным экстенсивно в [1]. Судно принято, чтобы быть отлично смешанным, и происходит одна экзотермическая и необратимая реакция первого порядка,-> B. Входной поток реагента A питается бак на постоянном объемном уровне. Поток продукта выходит постоянно на том же объемном уровне, и жидкая плотность является постоянной. Таким образом объем реагирующей жидкости является постоянным.
Входные параметры модели CSTR:
Выходные параметры модели, которые являются также состояниями модели:
Цель управления состоит в том, чтобы обеспечить концентрацию реагента A в его желаемом заданном значении, которое изменяется в зависимости от времени когда реакторные переходы от низкой скорости преобразования до высокой скорости преобразования. Температура хладагента является переменной, которой управляют, используемой контроллером MPC, чтобы отследить ссылку. Входная потоковая концентрация канала и температура приняты постоянным. Модель Simulink mpc_cstr_plant
реализует нелинейный объект CSTR.
Известно, что движущие силы CSTR строго нелинейны относительно реакторных температурных изменений и могут быть разомкнутым циклом, нестабильным во время перехода от условий работы до другого. Один контроллер MPC, спроектированный в особых условиях работы, не может дать удовлетворительную производительность управления в широком рабочем диапазоне.
Чтобы управлять нелинейным объектом CSTR с линейным методом MPC управления, у вас есть несколько опций:
Если линейная модель объекта управления не может быть получена во время выполнения, сначала необходимо получить несколько линейных моделей объекта управления оффлайн в различных условиях работы, которые покрывают типичный рабочий диапазон. Затем можно выбрать один из двух подходов, чтобы реализовать стратегию MPC управления:
(1) Спроектируйте несколько контроллеров MPC оффлайн, один для каждой модели объекта управления. Во время выполнения используйте блок Multiple MPC Controller, который переключается между контроллерами на основе желаемой стратегии планирования, как обсуждено в этом примере. Используйте этот подход, когда модели объекта управления будут иметь различные порядки или задержки.
(2) Спроектируйте один контроллер MPC оффлайн в номинальной рабочей точке. Во время выполнения используйте блок Adaptive MPC Controller вместе с линейной варьирующейся по параметру системой (блок LPV System). Блок Adaptive MPC Controller обновляет прогнозную модель в каждом интервале управления, и блок LPV System предоставляет линейную модель объекта управления на основе стратегии планирования. Для получения дополнительной информации смотрите Адаптивное MPC управление Нелинейным Химическим Реактором Используя Линейную Варьирующуюся по параметру Систему. Используйте этот подход, когда все модели объекта управления будут иметь тот же порядок и задержку.
Если линейная модель объекта управления может быть получена во время выполнения, необходимо использовать блок Adaptive MPC Controller, чтобы достигнуть нелинейного управления. Существует два типичных способа получить линейную модель объекта управления онлайн:
(1) Используйте последовательную линеаризацию. Для получения дополнительной информации смотрите Адаптивное MPC управление Нелинейным Химическим Реактором Используя Последовательную Линеаризацию. Используйте этот подход, когда нелинейная модель объекта управления будет доступна и сможет линеаризоваться во время выполнения.
(2) Используйте онлайновую оценку, чтобы идентифицировать линейную модель, когда круг будет замкнут. Для получения дополнительной информации смотрите Адаптивное MPC управление Нелинейным Химическим Реактором Используя Онлайновую Оценку Модели. Используйте этот подход, когда линейная модель объекта управления не сможет быть получена или из системы LPV или из последовательной линеаризации.
Чтобы запустить этот пример, Simulink® и программное обеспечение Simulink Control Design™ требуются.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink is required to run this example.') return end if ~mpcchecktoolboxinstalled('slcontrol') disp('Simulink Control Design is required to run this example.') return end
Во-первых, получите линейную модель объекта управления в начальных условиях работы, где CAi
10 килограмм-молей/м^3, и оба Ti
и Tc
298.15 K. Чтобы сгенерировать линейную систему в пространстве состояний из модели Simulink, используйте функции, такие как operspec
, findop
, и linearize
от Simulink Control Design.
Создайте спецификацию рабочей точки.
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);
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]
Получите номинальную стоимость x
Y
, и 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];
Получите линейную модель при начальном условии.
plant = linearize(plant_mdl,op_point);
Проверьте, что линейная модель является разомкнутым циклом, устойчивым при этом условии.
eig(plant)
ans = -0.5223 -0.8952
Задайте типы сигнала, используемые в 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 с заданным шагом расчета и прогнозом по умолчанию и управляйте горизонтами.
Ts = 0.5; 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')
Симулируйте модель.
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.
Переход теперь хорошо управляется. Основное улучшение находится в переходе через нестабильный регион разомкнутого цикла. График переключающегося сигнала показывает, когда переходы контроллера происходят. Символ мВ изменяется в эти времена из-за изменения в динамических характеристиках, введенных новой моделью прогноза.
[1] Seborg, D. E. Т. Ф. Эдгар, и Д. А. Мелличамп, динамика процесса и управление, 2-й выпуск, Вайли, 2004.
bdclose(plant_mdl) bdclose(mpc_mdl) bdclose(mmpc_mdl)
MPC Controller | Multiple MPC Controllers