В этом примере показано, как использовать 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 с горизонтами по умолчанию.
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')

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')

getCodeGenerationData | mpcmoveCodeGeneration