В этом примере показано, как спроектировать прогнозирующий контроллер модели в MATLAB для высокочастотной модели башни дистилляции, созданной в Аспене Плюс Dynamics®. Производительность контроллера затем проверяется через cosimulation между Simulink и Аспеном Плюс Динамика.
Башня дистилляции использует 29 идеальных этапов, чтобы разделить смесь бензола, толуола и ксилолов (представленный p-ксилолом). Процесс дистилляции непрерывен. Оборудование включает ребойлер и общий конденсатор как показано ниже:
Башня дистилляции действует при номинальном установившемся условии:
Поток канала содержит 30% бензола, 40% толуола и 30% ксилолов.
Скорость потока жидкости канала является 500 kmol/hour.
Чтобы удовлетворить требованию чистоты продукта перегонки, продукт перегонки содержит 95% бензола.
Чтобы удовлетворить требованию восстановления 95% бензола в канале, примесь бензола в нижних частях составляет 1,7%.
Цели управления описаны ниже, отсортированы по их важности:
Содержите постоянное давление башни.
Обеспечьте 5% толуола в продукте перегонки (это эквивалентно, чтобы обеспечить 95% бензола в продукте перегонки, потому что продукт перегонки только содержит бензол и толуол).
Обеспечьте 1,7% бензола в нижних частях.
Сохраните уровни жидкости в сборнике и емкости орошения в заданных пределах.
Используйте Аспен плюс RADFRAC
блокируйтесь, чтобы задать установившиеся характеристики башни. В дополнение к обычной информации, необходимой для установившейся симуляции, необходимо задать гидравлику лотка, геометрию сборника башни и размер емкости орошения. Лотки являются проектом решета, расположенным с интервалами на расстоянии в 18 дюймов. Все лотки имеют 1,95 м в диаметре с высотой плотины на 5 см. Номинальные жидкие глубины составляют 0,67 м и 1,4875 м в горизонтальной емкости орошения и сборнике соответственно.
Установившаяся модель портирована к Аспену плюс динамике (APD) для управляемой потоком симуляции. Это пропускает динамику привода и принимает точное регулирование скоростей потока жидкости, которыми управляют. По умолчанию APD добавляет ПИ-контроллеры, чтобы отрегулировать давление башни и эти два уровня жидкости. В этом примере намеренно удалены ПИ-контроллеры по умолчанию.
Модель APD высокочастотной башни дистилляции показывают ниже:
Прогнозирующий Контроллер модели требует модели LTI объекта. В этом примере входные параметры объекта:
Конденсаторная обязанность (W)
Обязанность ребойлера (W)
Массовый расход жидкости отлива (kg/h)
Массовый расход жидкости продукта перегонки (kg/h поток № 2)
Нижний массовый расход жидкости (kg/h поток № 3)
Питайте молярную скорость потока жидкости (kmol/h поток № 1)
Объект выходные параметры:
Давление башни (в конденсаторе: этап 1, панель)
Уровень жидкости (m) емкости орошения
Уровень жидкости (m) сборника
Массовый дробный толуол в продукте перегонки
Массовый дробный бензол в нижних частях
Аспен Плюс Динамика обеспечивает инструмент Control Design Interface (CDI), который линеаризует динамическую модель при заданном условии.
Следующие шаги взяты, чтобы получить линейную модель объекта управления в Аспене Плюс Динамика.
Step 1
: Добавьте скрипт в модель APD под Flowsheet
папка. В этом примере именем скрипта является CDI_Calcs
(как показано выше), и это содержит следующие команды APD:
Set Doc = ActiveDocument set CDI = Doc.CDI CDI.Reset CDI.AddInputVariable "blocks(""B1"").condenser(1).QR" CDI.AddInputVariable "blocks(""B1"").QrebR" CDI.AddInputVariable "blocks(""B1"").Reflux.FmR" CDI.AddInputVariable "streams(""2"").FmR" CDI.AddInputVariable "streams(""3"").FmR" CDI.AddInputVariable "streams(""1"").FR" CDI.AddOutputVariable "blocks(""B1"").Stage(1).P" CDI.AddOutputVariable "blocks(""B1"").Stage(1).Level" CDI.AddOutputVariable "blocks(""B1"").SumpLevel" CDI.AddOutputVariable "streams(""2"").Zmn(""TOLUENE"")" CDI.AddOutputVariable "streams(""3"").Zmn(""BENZENE"")" CDI.Calculate
Step 2
: Инициализируйте модель APD к номинальному установившемуся условию.
Step 3
: Вызовите скрипт, который генерирует следующие текстовые файлы:
cdi_A.dat
, cdi_B.dat
, cdi_C.dat
задайте A, B, и матрицы C стандартной модели в пространстве состояний LTI непрерывного времени. D матрица нуль. A, B, C матрицы являются разреженными матрицами.
cdi_list.lis
перечисляет переменные модели и их номинальную стоимость.
cdi_G.dat
задает ввод/вывод статическая матрица усиления при номинальном условии. Матрица усиления является также разреженной матрицей.
В этом примере, cdi_list.lis
включает следующую информацию:
A matrix computed, number of non-zero elements = 1408 B matrix computed, number of non-zero elements = 26 C matrix computed, number of non-zero elements = 20 G matrix computed, number of non-zero elements = 30 Number of state variables: 120 Number of input variables: 6 Number of output variables: 5 Input variables: 1 -3690034.247458334 BLOCKS("B1").Condenser(1).QR 2 3819023.193875 BLOCKS("B1").QRebR 3 22135.96620144 BLOCKS("B1").Reflux.FmR 4 11717.39655353 STREAMS("2").FmR 5 34352.86345834 STREAMS("3").FmR 6 500 STREAMS("1").FR Output variables: 1 1.100022977953499 BLOCKS("B1").Stage(1).P 2 0.6700005140605662 BLOCKS("B1").Stage(1).Level 3 1.4875 BLOCKS("B1").SumpLevel 4 0.05002582161855798 STREAMS("2").Zmn("TOLUENE") 5 0.01705308738356429 STREAMS("3").Zmn("BENZENE")
Номинальная стоимость переменных состояния, перечисленных в файле, проигнорирована, потому что они не нужны в проекте MPC.
Step 1
: Преобразуйте сгенерированные CDI разреженные матрицы в модель в пространстве состояний.
Загрузите матрицы пространства состояний от файлов данных CDI до рабочего пространства MATLAB и преобразуйте разреженные матрицы в полные матрицы.
load mpcdistillation_cdi_A.dat load mpcdistillation_cdi_B.dat load mpcdistillation_cdi_C.dat A = full(spconvert(mpcdistillation_cdi_A)); B = full(spconvert(mpcdistillation_cdi_B)); C = full(spconvert(mpcdistillation_cdi_C)); D = zeros(5,6);
Возможно, что целая строка разреженной матрицы или столбец являются нулем, в этом случае вышеупомянутые команды недостаточны. Используйте следующие дополнительные проверки, чтобы убедиться A, B, и C имеют правильные размерности:
[nxAr,nxAc] = size(A); [nxB,nu] = size(B); [ny,nxC] = size(C); nx = max([nxAr, nxAc, nxB, nxC]); if nx > nxC C = [C, zeros(ny,nx-nxC)]; end if nx > nxAc A = [A zeros(nxAr,nx-nxAc)]; end if nx > nxAr nxAc = size(A,2); A = [A; zeros(nx-nxAr, nxAc)]; end if nxB < nx B = [B; zeros(nx-nxB,nu)]; end
Step 2
: Масштабируйте сигналы объекта.
Это - хорошая практика, если не важный, чтобы преобразовать сигналы объекта от технических модулей до универсальной безразмерной шкалы (например, 0-1 или 0-100%). Одна альтернатива должна задать масштабные коэффициенты как часть Прогнозирующего Проектирования контроллера Модели. Это может упростить контроллер, настраивающийся значительно. Например, смотрите, Используя Масштабные коэффициенты, чтобы Упростить Настройку Веса.
В существующем примере, однако, мы будем использовать процедуру снижения сложности модели до проектирования контроллера, и мы поэтому масштабируем модель объекта управления, с помощью масштабированной модели и в снижении сложности модели и в проектировании контроллера. Мы задаем промежуток для каждого ввода и вывода, т.е. различие между ожидаемыми максимальными и минимальными значениями в технических модулях. Также запишите номинальную стоимость и нулевые значения в технических модулях, чтобы упростить последующие преобразования.
U_span = [2*(-3690034), 2*3819023, 2*22136, 2*11717, 2*34353, 2*500]; U_nom = 0.5*U_span; U_zero = zeros(1,6); Y_nom = [1.1, 0.67, 1.4875, 0.050026, 0.017053]; Y_span = [0.4, 2*Y_nom(2:5)]; Y_zero = [0.9, 0, 0, 0, 0];
Масштабируйте B и матрицы C, таким образом, что все переменные ввода/вывода выражаются как проценты.
B = B.*(ones(nx,1)*U_span); C = C./(ones(nx,1)*Y_span)';
Step 3
: Задайте модель объекта управления пространства состояний.
G = ss(A,B,C,D); G.TimeUnit = 'hours'; G.u = {'Qc','Qr','R','D','B','F'}; G.y = {'P','RLev','Slev','xD','xB'};
Step 4
: Уменьшайте порядок модели.
Снижение сложности модели ускоряет вычисления с незначительным эффектом на точности предсказания. Используйте hsvd
команда, чтобы определить, какие состояния могут быть безопасно отброшены. Используйте balred
функция, чтобы удалить эти состояния и уменьшать порядок модели.
[hsv, baldata] = hsvd(G); order = find(hsv>0.01,1,'last'); Options = balredOptions('StateElimMethod','Truncate'); G = balred(G,order,baldata,Options);
Исходная модель имеет 120 состояний, и упрощенная модель имеет только 16 состояний. Обратите внимание на то, что Truncate
опция используется в balred
функционируйте, чтобы сохранить нулевую D матрицу. Модель имеет два полюса в нуле, которые соответствуют этим двум уровням жидкости.
Прежде, чем продолжить проект MPC, это - хорошая практика, чтобы проверить, что масштабированная модель LTI точна для небольших изменений во входных параметрах объекта. Для этого необходимо сравнить ответ нелинейного объекта в APD и ответ линейной модели G
.
Step 1
: Чтобы получить ответ нелинейного объекта, создайте модель Simulink и добавьте Блок Средства моделирования Аспена в него.
Блок обеспечивается Аспеном Плюс Динамика в их AMSimulink
библиотека.
Step 2
: Дважды кликните блок и обеспечьте местоположение модели APD.
Информация о модели APD затем импортируется в Simulink. Для больших моделей APD может занять время процесс импорта.
Step 3
: Задайте сигналы ввода и вывода в блоке AMSimulation.
Используйте те же имена переменных и последовательность как в скрипте CDI.
Блок теперь показывает импорт и выходные порты для каждого сигнала, что вы задали.
Step 4
: Расширьте модель Simulink с входным сигналом, прибывающим из переменной Umat
и выходной сигнал, сохраненный в переменную Ypct_NL
. Обе переменные создаются на Шаге 5.
Начиная с Umat
находится в модулях процента, Pct2Engr
блок реализован, чтобы преобразовать от модулей процента до технических модулей.
Начиная с Ypct_NL
находится в модулях процента, блок "Engr2Pct" реализован, чтобы преобразовать от технических модулей до модулей процента.
Со всем соединенным и сконфигурированным, появляется следующей модель:
Step 5
: Проверьте линейную модель с cosimulation.
В этом примере 1-процентное увеличение масштабированного уровня отлива (вход № 3) используется в качестве сигнала возбуждения к объекту.
U_nom_pct = (U_nom - U_zero)*100./U_span; % Convert nominal condition from engineering units to percentages Y_nom_pct = (Y_nom - Y_zero)*100./Y_span; Tend = 1; % Simulation duration (1 hour) t = (0:1/60:Tend)'; % Sample period is 1 minute nT = length(t); Upct = ones(nT,1)*U_nom_pct; DUpct = zeros(nT,6); DUpct(:,3) = ones(nT,1); % Input signal where step occurs in channel #3
Ответ линейной модели объекта управления вычисляется с помощью lsim
команда и сохраненный в переменной Ypct_L
.
Ypct_L = lsim(G,DUpct,t); Ypct_L = Ypct_L + ones(nT,1)*Y_nom_pct;
Ответ нелинейного объекта получен через cosimulation между Simulink и Аспеном Плюс Динамика. Сигнал возбуждения Umat
создается как ниже. Результат хранится в переменной Ypct_NL
.
Umat = [t, Upct+DUpct];
Сравните линейные и нелинейные ответы модели.
Предсказания модели LTI отслеживают нелинейные ответы хорошо. Количество ошибки предсказания приемлемо. В любом случае Прогнозирующий Контроллер Модели должен быть настроен, чтобы разместить ошибки предсказания, которые неизбежны в приложениях.
Можно повторить перечисленные выше шаги, чтобы проверить подобное соглашение для других пяти входных параметров.
Учитывая модель предсказания LTI, вы готовы спроектировать Прогнозирующий Контроллер Модели. В этом примере переменные, которыми управляют, являются первыми пятью входными параметрами объекта. Шестой вход объекта (скорость потока жидкости канала) является измеренным воздействием для компенсации feedforward. Весь объект выходные параметры измеряется.
Step 1
: Увеличьте объект, чтобы смоделировать неизмеренные воздействия загрузки.
Испытывая недостаток больше в определенных деталях относительно воздействий загрузки, это - установившаяся практика, чтобы принять неизмеренное воздействие загрузки, происходящее в каждых из пяти входных параметров. Это позволяет средству оценки состояния MPC устранять смещение в каждом управляемом выходе, когда воздействие загрузки происходит.
В этом примере 5 неизмеренных воздействий загрузки добавляются к модели объекта управления G
. Всего, существует теперь 11 входных параметров к модели Gmpc
предсказания: 5 переменных, которыми управляют, 1 измеренное воздействие и 5 неизмеренных воздействий.
Gmpc = ss(G.A,G.B(:,[1:6,1:5]),G.C,zeros(5,11),'TimeUnit','hours'); InputName = cell(1,11); for i = 1:5 InputName{i} = G.InputName{i}; InputName{i+6} = [G.InputName{i}, '-UD']; end InputName{6} = G.InputName{6}; Gmpc.InputName = InputName; Gmpc.InputGroup = struct('MV',1:5,'MD',6,'UD',7:11); Gmpc.OutputName = G.OutputName;
Step 2
: Создайте начальный прогнозирующий контроллер модели и задайте шаг расчета и горизонты.
В этом примере период расчета контроллера составляет 30 секунд. Горизонт предсказания является 60 интервалами (30 минут), который является достаточно большим, чтобы сделать производительность контроллера нечувствительной к дальнейшим увеличениям горизонта предсказания. Горизонт управления является 4 интервалами (2 минуты), который относительно мал, чтобы уменьшать вычислительное усилие.
Ts = 30/3600; % sample time PH = 60; % prediction horizon CH = 4; % control horizon MPCobj = mpc(Gmpc,Ts,PH,CH); % MPC object
-->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.
Step 3
: Задайте веса для переменных, которыми управляют, и управлял выходными параметрами.
Веса являются ключевыми настраивающими корректировками в проекте MPC, и они должны быть выбраны на основе ваших целей управления.
Нет никакой причины содержать конкретный мВ в заданном значении, таким образом, устанавливает Weights.ManipulatedVariables
свойство обнулить:
MPCobj.Weights.ManipulatedVariables = [0, 0, 0, 0, 0];
Продукт продукта перегонки (мВ № 4) переходит к устройству хранения данных. Единственный мВ, влияющий на нисходящие модульные операции, является нижним уровнем (мВ № 5). Чтобы препятствовать быстрым изменениям в нижнем уровне, сохраните вес по умолчанию 0,1 для его скорости изменения. Уменьшайте другие веса скорости изменения фактором 10:
MPCobj.Weights.ManipulatedVariablesRate = [0.01, 0.01, 0.01, 0.01, 0.1];
Цели управления предоставляют инструкции, чтобы выбрать веса на управляемых выходных параметрах:
Давление башни должно быть отрегулировано плотно из соображений безопасности и из минимизации нарушений в температурах лотка и гидравлике. (объективный № 1)
Состав продукта перегонки должен также быть отрегулирован плотно. (объективный № 2)
Нижний состав может быть отрегулирован менее плотно. (объективный № 3)
Уровни жидкости являются четными менее важные. (объективный № 4)
С этими приоритетами в памяти, веса на управляемых выходных параметрах выбраны можно следующим образом::
MPCobj.Weights.OutputVariables = [10, 0.1, 0.1, 1, 0.5];
Масштабирование модели упрощает выбор весов оптимизации. В противном случае, в дополнение к относительному приоритету каждой переменной, необходимо было бы также рассмотреть относительные величины переменных и выбрать веса соответственно.
Step 4
: Задайте номинальные значения ввода/вывода объекта.
В этом примере номинальная стоимость масштабируется как проценты. Контроллер MPC требует, чтобы номинальная стоимость для неизмеренных воздействий была нулем.
MPCobj.Model.Nominal.U = [U_nom_pct'; zeros(5,1)]; MPCobj.Model.Nominal.Y = Y_nom_pct';
Step 5
: Настройте усиление средства оценки состояния.
Корректировка усиления средства оценки состояния влияет на производительность подавления помех. Увеличение усиления средства оценки состояния (например, путем увеличения усиления возмущения ввода/вывода) заставляет контроллер отвечать более настойчиво к выходным изменениям (потому что контроллер принимает, что основной источник выходных изменений является воздействием вместо шума измерения). С другой стороны, уменьшение усиления средства оценки состояния делает систему с обратной связью более устойчивой.
Во-первых, проверяйте, обеспечивает ли использование средства оценки состояния по умолчанию достойную производительность подавления помех.
Симулируйте ответ с обратной связью на 1%-й модульный шаг в отливе (мВ № 3) в MATLAB. Симуляция использует G
как объект, который не подразумевает несоответствия модели.
T = 30; % Simulation time r = Y_nom_pct; % Nominal setpoints v = U_nom_pct(6); % No measured disturbance SimOptions = mpcsimopt(MPCobj); SimOptions.InputNoise = [0 0 1 0 0]; % 1% unit step in reflux [y_L,t_L,u_L] = sim(MPCobj, T, r, v, SimOptions); % Closed-loop simulation
-->Converting model to discrete time. -->The "Model.Disturbance" property of "mpc" object is empty: Assuming unmeasured input disturbance #7 is integrated white noise. Assuming unmeasured input disturbance #8 is integrated white noise. Assuming unmeasured input disturbance #9 is integrated white noise. Assuming unmeasured input disturbance #10 is integrated white noise. Assuming unmeasured input disturbance #11 is integrated white noise. Assuming no disturbance added to measured output channel #1. Assuming no disturbance added to measured output channel #4. Assuming no disturbance added to measured output channel #5. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #3. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
% plot responses f1 = figure(); subplot(2,1,1); plot(t_L,y_L,[0 t_L(end)],[50 50],'k--') title('Controlled Outputs, %') legend(Gmpc.OutputName,'Location','NorthEastOutside') subplot(2,1,2); plot(t_L,u_L(:,1:5),[0 t_L(end)],[50 50],'k--') title('Manipulated Variables, %') legend(Gmpc.InputName(1:5),'Location','NorthEastOutside') xlabel('Time, h')
Средство оценки по умолчанию обеспечивает вялое отклонение загрузки. В частности, критический xD
выведите спады до 49%, и только что начал возвращаться к заданному значению после 0,25 часов.
Во-вторых, увеличьте усиление средства оценки путем умножения входного усиления возмущения по умолчанию на фактор 25.
EstGain = 25; % factor of 25 Gd = getindist(MPCobj); % get default input disturbance model Gd_new = EstGain*Gd; % create new input disturbance model setindist(MPCobj,'Model',Gd_new); % set input disturbance model [y_L,t_L,u_L] = sim(MPCobj,T,r,v,SimOptions); % Closed-loop simulation
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. Assuming no disturbance added to measured output channel #4. Assuming no disturbance added to measured output channel #5. Assuming no disturbance added to measured output channel #2. Assuming no disturbance added to measured output channel #3. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
% plot responses f2 = figure(); subplot(2,1,1); plot(t_L,y_L,[0 t_L(end)],[50 50],'k--') title('Controlled Outputs, %') legend(Gmpc.OutputName,'Location','NorthEastOutside') subplot(2,1,2) plot(t_L,u_L(:,1:5),[0 t_L(end)],[50 50],'k--') title('Manipulated Variables, %') legend(Gmpc.InputName(1:5),'Location','NorthEastOutside') xlabel('Time, h')
Теперь пиковое отклонение в xD
на 50% меньше случая по умолчанию и xD
возвращается к его заданному значению намного быстрее. Другие переменные также отвечают более быстро.
В-третьих, посмотрите на ответ отлива (#3 в "Переменных, которыми Управляют", график). Поскольку воздействие является 1%-м модульным шагом, ответ начинается в 51%, и его окончательное значение составляет 50% в устойчивом состоянии. Ответ отлива промахивается на 20% (достижение 49,8%) перед урегулированием. Эта сумма перерегулирования приемлема.
Если бы усиление средства оценки было увеличено далее (например, фактором 50), перерегулирование контроллера увеличилось бы также. Однако такое агрессивное поведение вряд ли будет устойчиво, когда применено нелинейная модель объекта управления.
Можно ввести другие воздействия загрузки, чтобы проверить, что подавление помех теперь быстро во всех случаях.
Масштабирование модели также упрощает настройку возмущения. В противном случае необходимо было бы настроить усиление каждого канала в возмущении, чтобы достигнуть хорошего подавления помех для всех загрузок.
Обычно вы затем проверяете ответ на изменения заданного значения. Если ответ слишком агрессивен, можно использовать фильтр заданного значения, чтобы сглаживать его. Фильтр заданного значения не оказывает влияния на подавление помех загрузки и таким образом может быть настроен независимо.
Используйте cosimulation, чтобы определить, достаточно ли проект MPC устойчив, чтобы управлять нелинейной моделью объекта управления.
Step 1
: Добавьте ограничения в контроллер MPC
Поскольку нелинейная модель объекта управления имеет ограничения ввода и вывода во время операции, мВ и ограничения OV заданы в контроллере MPC можно следующим образом:
MV = MPCobj.MV; OV = MPCobj.OV; % Physical bounds on MVs at 0 and 100 for i = 1:5 MV(i).Min = 0; MV(i).Max = 100; end MPCobj.MV = MV; % Keep liquid levels greater than 25% and less than 75% of capacity. for i = 2:3 OV(i).Min = 25; OV(i).Max = 75; end MPCobj.OV = OV;
Step 2
: Создайте модель Simulink для cosimulation.
Модель может симулировать 1%-й модульный шаг в отливе (мВ № 3). Это может также симулировать изменение в составе канала, который является общим воздействием и отличается от воздействий загрузки, рассмотренных явным образом в проекте.
Step 3
: Симулируйте 1%-й модульный шаг в отливе (мВ № 3). Сравните ответы с обратной связью между использованием линейной модели объекта управления и использованием нелинейной модели объекта управления.
Постройте состав продукта продукта перегонки (xD
) и уровень отлива (R
):
В cosimulation прогнозирующий контроллер модели отклоняет маленькое воздействие загрузки способом, почти идентичным линейной симуляции.
Step 4
: Симулируйте значительное сокращение части бензола (от 0,3 до 0,22) в потоке канала. Сравните ответы с обратной связью между использованием линейных и нелинейных моделей объекта управления.
Понижение части бензола требует длительного уменьшения в уровне продукта перегонки и соответствующего увеличения нижнего уровня. Там также поддержаны, заглядывает обязанностям тепла и незначительному увеличению отлива. Все корректировки мВ являются гладкими, и все управляли выходными параметрами, почти вернулись к их заданным значениям в течение 0,5 часов.