Этот пример показывает, как моделировать и сгенерировать код в реальном времени для блока MPC Controller с Simulink Coder. Код может быть сгенерирован и в одинарных и в двойных точностях.
Чтобы запустить этот пример, Simulink® и Simulink® Coder™ требуются.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end if ~mpcchecktoolboxinstalled('simulinkcoder') disp('Simulink(R) Coder(TM) is required to run this example.'); return end
У вас должно быть разрешение записи сгенерировать соответствующие файлы и исполняемый файл. Так, перед стартовой симуляцией и генерацией кода, измените текущий каталог на временную директорию.
cwd = pwd; tmpdir = tempname; mkdir(tmpdir); cd(tmpdir);
Задайте объект SISO.
plant = ss(tf([3 1],[1 0.6 1]));
Задайте контроллер MPC для объекта.
Ts = 0.1; %Sampling time p = 10; %Prediction horizon m = 2; %Control horizon Weights = struct('MV',0,'MVRate',0.01,'OV',1); % Weights MV = struct('Min',-Inf,'Max',Inf,'RateMin',-100,'RateMax',100); % Input constraints OV = struct('Min',-2,'Max',2); % Output constraints mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);
По умолчанию Диспетчер MPC блоки использует с двойной точностью в симуляции и генерации кода.
Моделируйте модель в Simulink.
mdl1 = 'mpc_rtwdemo';
open_system(mdl1)
sim(mdl1)
-->Converting model to discrete time. -->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.
Усилие контроллера и объект вывод сохранены в базовое рабочее пространство как переменные u и y, соответственно.
Создайте модель с командой rtwbuild
.
disp('Generating C code... Please wait until it finishes.') set_param(mdl1,'RTWVerbose','off') rtwbuild(mdl1);
Generating C code... Please wait until it finishes. ### Starting build procedure for model: mpc_rtwdemo ### Successful completion of build procedure for model: mpc_rtwdemo
В системе Windows исполняемый файл под названием "mpc_rtwdemo.exe" появляется во временной директории после того, как процесс сборки закончится.
Запустите исполняемый файл.
if ispc disp('Running executable...') status = system(mdl1); else disp('The example only runs the executable on Windows system.') end
The example only runs the executable on Windows system.
После того, как исполняемый файл завершается успешно (status=0), файл данных, названный "mpc_rtwdemo.mat", появляется во временной директории.
Сравните ответы от сгенерированного кода (rt_u и rt_y) с ответами от предыдущей симуляции в Simulink (u и y).
Они численно равны.
Можно также сконфигурировать блок MPC, чтобы использовать с одинарной точностью в симуляции и генерации кода.
mdl2 = 'mpc_rtwdemo_single';
open_system(mdl2)
Чтобы сделать это, откройте диалоговое окно блока MPC и выберите "один", когда "выходные данные вводят" в нижней части диалогового окна.
open_system([mdl2 '/MPC Controller'])
Моделируйте модель в Simulink.
close_system([mdl2 '/MPC Controller'])
sim(mdl2)
Усилие контроллера и объект вывод сохранены в базовое рабочее пространство как переменные u1 и y1, соответственно.
Создайте модель с командой rtwbuild
.
disp('Generating C code... Please wait until it finishes.') set_param(mdl2,'RTWVerbose','off') rtwbuild(mdl2);
Generating C code... Please wait until it finishes. ### Starting build procedure for model: mpc_rtwdemo_single ### Successful completion of build procedure for model: mpc_rtwdemo_single
В системе Windows исполняемый файл под названием "mpc_rtwdemo_single.exe" появляется во временной директории после того, как процесс сборки закончится.
Запустите исполняемый файл.
if ispc disp('Running executable...') status = system(mdl2); else disp('The example only runs the executable on Windows system.') end
The example only runs the executable on Windows system.
После того, как исполняемый файл завершается успешно (status=0), файл данных, названный "mpc_rtwdemo_single.mat", появляется во временной директории.
Сравните ответы от сгенерированного кода (rt_u1 и rt_y1) с ответами от предыдущей симуляции в Simulink (u1 и y1).
Они численно равны.
Закройте модель Simulink.
bdclose(mdl1) bdclose(mdl2)
cd(cwd)