exponenta event banner

Создание кода для вычисления оптимальных перемещений MPC в MATLAB

В этом примере показано, как использовать mpcmoveCodeGeneration команда для генерации кода C для вычисления оптимальных перемещений управления MPC для приложений реального времени.

Модель установки

Установка является одновходовой, одновыпускной, стабильной, линейного завода 2-го порядка.

plant = tf(5,[1 0.8 3]);

Преобразуйте растение в форму дискретного времени, состояния-пространства и укажите нулевой вектор начальных состояний.

Ts = 1;      
plant = ss(c2d(plant,Ts));
x0 = zeros(size(plant.B,1),1);

Проектирование контроллера MPC

Создайте контроллер 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.

Укажите веса настройки контроллера.

mpcobj.Weights.MV = 0;
mpcobj.Weights.MVrate = 0.5;
mpcobj.Weights.OV = 1;

Укажите начальные ограничения на управляемую переменную и выходные данные завода. Эти ограничения будут обновлены во время выполнения.

mpcobj.MV.Min = -1;
mpcobj.MV.Max = 1;
mpcobj.OV.Min = -1;
mpcobj.OV.Max = 1;

Моделирование интерактивных изменений ограничений с помощью mpcmove Команда

В моделировании с замкнутым контуром зависимости обновляются и подаются в mpcmove команда на каждом интервале управления.

yMPCMOVE = [];
uMPCMOVE = [];

Установите время моделирования.

Tsim = 20;

Инициализируйте данные ограничения в оперативном режиме.

MVMinData = -0.2-[1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5 ...
    0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];
MVMaxData = 0.2+[1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5 ...
    0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];
OVMinData = -0.2-[1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5 ...
    0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];
OVMaxData = 0.2+[1 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5 ...
    0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];

Инициализация состояний установки.

x = x0;

Инициализация состояний MPC.

xmpc = mpcstate(mpcobj);
-->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.

Запуск моделирования по замкнутому циклу с помощью вызова mpcmove в цикле.

options = mpcmoveopt;
for ct = 1:round(Tsim/Ts)+1
    % Update and store plant output.
    y = plant.C*x;
    yMPCMOVE = [yMPCMOVE y];
    % Update constraints.
    options.MVMin = MVMinData(ct);
    options.MVMax = MVMaxData(ct);
    options.OutputMin = OVMinData(ct);
    options.OutputMax = OVMaxData(ct);
    % Compute control actions.
    u = mpcmove(mpcobj,xmpc,y,1,[],options);
    % Update and store plant state.
    x = plant.A*x + plant.B*u;
    uMPCMOVE = [uMPCMOVE u];
end

Проверка результатов моделирования с помощью mpcmoveCodeGeneration Команда

Для подготовки к созданию кода, который вычисляет оптимальные движения управления из MATLAB, рекомендуется воспроизвести те же результаты управления с помощью mpcmoveCodeGeneration перед использованием codegen из продукта MATLAB Coder.

yCodeGen = [];
uCodeGen = [];

Инициализация состояний установки.

x = x0;

Создание структур данных для использования с mpcmoveCodeGeneration using getCodeGenerationData.

[coredata,statedata,onlinedata] = getCodeGenerationData(mpcobj);

Запуск моделирования по замкнутому циклу с помощью вызова mpcmoveCodeGeneration в цикле.

for ct = 1:round(Tsim/Ts)+1
    % Update and store plant output.
    y = plant.C*x;
    yCodeGen = [yCodeGen y];
    % Update measured output in online data.
    onlinedata.signals.ym = y;    
    % Update reference in online data.
    onlinedata.signals.ref = 1;    
    % Update constraints in online data.
    onlinedata.limits.umin = MVMinData(ct);
    onlinedata.limits.umax = MVMaxData(ct);
    onlinedata.limits.ymin = OVMinData(ct);
    onlinedata.limits.ymax = OVMaxData(ct);
    % Compute control actions.
    [u,statedata] = mpcmoveCodeGeneration(coredata,statedata,onlinedata);
    % Update and store plant state.
    x = plant.A*x + plant.B*u;
    uCodeGen = [uCodeGen u];
end

Результаты моделирования идентичны тем, которые используются mpcmove.

t = 0:Ts:Tsim;
figure;
subplot(1,2,1)
plot(t,yMPCMOVE,'--*',t,yCodeGen,'o');
grid
legend('mpcmove','codegen')
title('Plant Output')
subplot(1,2,2)
plot(t,uMPCMOVE,'--*',t,uCodeGen,'o');
grid
legend('mpcmove','codegen')
title('Controller Moves')

Figure contains 2 axes. Axes 1 with title Plant Output contains 2 objects of type line. These objects represent mpcmove, codegen. Axes 2 with title Controller Moves contains 2 objects of type line. These objects represent mpcmove, codegen.

Создать функцию MEX из mpcmoveCodeGeneration Команда

Создание кода C из mpcmoveCodeGeneration используйте команду codegen из продукта MATLAB Coder. В этом примере создайте функцию MEX mpcmoveMEX для воспроизведения результатов моделирования в MATLAB. Цель создания кода можно изменить на статическую библиотеку C/C + +, динамическую библиотеку, исполняемый файл и т. д., используя другой набор coder.config настройки.

При создании кода C для mpcmoveCodeGeneration команда:

  • Поскольку проверка целостности данных входных аргументов не выполняется, необходимо убедиться, что все входные данные имеют правильные типы, размеры и значения.

  • Необходимо определить первый входной аргумент, mpcmove_struct, как константа при использовании codegen команда.

  • Второй входной аргумент, mpcmove_state, обновляется командой и возвращается в качестве второго вывода. В большинстве случаев не требуется изменять его содержимое, и его следует просто передать команде в следующем интервале управления. Единственным исключением является включение пользовательской оценки состояния. В этом случае необходимо указать текущую оценку состояния с помощью этого аргумента.

if ~license ('test', 'MATLAB_Coder')
    disp('MATLAB Coder(TM) is required to run this example.')
    return
end

Создание функции MEX.

fun = 'mpcmoveCodeGeneration';
funOutput = 'mpcmoveMEX';
Cfg = coder.config('mex');
Cfg.DynamicMemoryAllocation = 'off';
codegen('-config',Cfg,fun,'-o',funOutput,'-args',...
    {coder.Constant(coredata),statedata,onlinedata});
Code generation successful.

Инициализация хранилища данных.

yMEX = [];
uMEX = [];

Инициализация состояний установки.

x = x0;

Использовать getCodeGenerationData для создания структур данных для использования с mpcmoveCodeGeneration.

[coredata,statedata,onlinedata] = getCodeGenerationData(mpcobj);

Запуск моделирования с замкнутым контуром путем вызова сгенерированного mpcmoveMEX функции в цикле.

for ct = 1:round(Tsim/Ts)+1
    % Update and store the plant output.
    y = plant.C*x;
    yMEX = [yMEX y];
    % Update measured output in online data.
    onlinedata.signals.ym = y;    
    % Update reference in online data.
    onlinedata.signals.ref = 1;    
    % Update constraints in online data.
    onlinedata.limits.umin = MVMinData(ct);
    onlinedata.limits.umax = MVMaxData(ct);
    onlinedata.limits.ymin = OVMinData(ct);
    onlinedata.limits.ymax = OVMaxData(ct);
    % Compute control actions.
    [u,statedata] = mpcmoveMEX(coredata,statedata,onlinedata);
    % Update and store the plant state.
    x = plant.A*x + plant.B*u;
    uMEX = [uMEX u];
end

Результаты моделирования идентичны тем, которые используются mpcmove.

figure
subplot(1,2,1)
plot(t,yMPCMOVE,'--*',t,yMEX,'o')
grid
legend('mpcmove','mex')
title('Plant Output')
subplot(1,2,2)
plot(t,uMPCMOVE,'--*',t,uMEX,'o')
grid
legend('mpcmove','mex')
title('Controller Moves')

Figure contains 2 axes. Axes 1 with title Plant Output contains 2 objects of type line. These objects represent mpcmove, mex. Axes 2 with title Controller Moves contains 2 objects of type line. These objects represent mpcmove, mex.

См. также

|

Связанные темы