Этот пример показывает, как сконфигурировать и моделировать Контроллер MPC блоки, помещенные в Вызове функции и Инициированных подсистемах.
Задайте объект 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);
Чтобы запустить этот пример, Simulink® требуется.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end
Подсистема вызова функций вызывается непосредственно другим блоком во время симуляции. Чтобы гарантировать, что контроллер MPC работает правильно в Подсистеме вызова функций, необходимо сконфигурировать блок MPC Controller, чтобы использовать наследованный шаг расчета и периодически вызывать Подсистему вызова функций с тем же шагом расчета, заданным в контроллере MPC объект.
Откройте модель.
mdl1 = 'mpc_rtwdemo_functioncall';
open_system(mdl1);
Сконфигурируйте блок MPC, чтобы использовать наследованный шаг расчета (-1).
Дважды кликните блок MPC. Установите флажок "Block uses inherited sample time (-1)".
open_system([mdl1 '/MPC in Function-Call Subsystem/MPC Controller']);
Вызывайте Подсистему вызова функций периодически с правильным шагом расчета.
В данном примере, поскольку у контроллера есть шаг расчета 0,1 секунд, сконфигурируйте триггерный блок в Подсистеме вызова функций, чтобы использовать тот же шаг расчета.
В данном примере используйте блок "Function-Call Generator", чтобы выполнить Подсистему вызова функций на уровне частоты дискретизации как 0,1 секунды.
Моделируйте модель.
close_system([mdl1 '/MPC in Function-Call Subsystem/MPC Controller']); open_system([mdl1 '/Inputs']); open_system([mdl1 '/Outputs//References']); 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_fc и y_fc, соответственно.
Закройте модель Simulink.
bdclose(mdl1);
Инициированная подсистема выполняется каждый раз, когда триггерное событие имеет место. Чтобы гарантировать, что контроллер MPC работает правильно в Инициированной подсистеме, необходимо сконфигурировать блок MPC Controller, чтобы использовать наследованный шаг расчета и периодически вызывать Инициированную подсистему с тем же шагом расчета, заданным в контроллере MPC объект.
Откройте модель.
mdl2 = 'mpc_rtwdemo_triggered';
open_system(mdl2);
Сконфигурируйте блок MPC, чтобы использовать наследованный шаг расчета (-1), как вы сделали ранее.
open_system([mdl2 '/MPC in Triggered Subsystem/MPC Controller']);
Выполняйте Инициированную подсистему периодически с правильным шагом расчета.
В данном примере сконфигурируйте триггерный блок в Инициированной подсистеме, чтобы использовать любого падающий триггерный тип.
В данном примере используйте блок "Pulse Generator", чтобы обеспечить периодический сигнал инициирования на уровне частоты дискретизации как 0,1 секунды.
Моделируйте модель.
close_system([mdl2 '/MPC in Triggered Subsystem/MPC Controller']); open_system([mdl2 '/Inputs']); open_system([mdl2 '/Outputs//References']); sim(mdl2);
Усилие контроллера и объект вывод сохранены в базовое рабочее пространство как переменные u_tr и y_tr, соответственно.
Закройте модель Simulink.
bdclose(mdl2);
Сравните результаты симуляции от Подсистемы вызова функций и Инициированной подсистемы с результатом, сгенерированным блоком MPC Controller, который не помещается в подсистеме и не наследовал шаг расчета.
mdl = 'mpc_rtwdemo';
open_system(mdl);
sim(mdl);
Сравните ответы переменной, которой управляют.
f1 = figure; plot(t,u,'b-',t,u_fc,'ro',t(1:end-1),u_tr,'k.'); title('Manipulated Variable'); legend('No Subsystem','Function-Call','Triggered');
Сравните ответы объект вывод.
f2 = figure; plot(t,y,'b-',t,y_fc,'ro',t(1:end-1),y_tr,'k.'); title('Plant Output'); legend('No Subsystem','Function-Call','Triggered');
Результаты всех трех моделей численно равны.
Закройте модель Simulink.
bdclose(mdl);
Подсистема вызова функций | Инициированная подсистема