В этом примере показано, как конфигурировать и моделировать блоки контроллера MPC, размещенные в подсистемах Function-Call и Triggered.
Определите завод 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
Подсистема Function-Call вызывается непосредственно другим блоком во время моделирования. Для обеспечения правильной работы контроллера MPC в подсистеме Function-Call необходимо сконфигурировать блок контроллера MPC для использования наследуемого времени выборки и периодически вызывать подсистему Function-Call с тем же временем выборки, которое определено в объекте контроллера MPC.
Откройте модель.
mdl1 = 'mpc_rtwdemo_functioncall';
open_system(mdl1)

Блок контроллера MPC находится внутри MPC в блоке триггерной подсистемы.
open_system([mdl1 '/MPC in Function-Call Subsystem'])

Настройте контроллер на использование наследуемого времени выборки. Для этого выберите свойство Inherit sample time блока MPC Controller.
Периодически вызывайте подсистему Function-Call с правильным временем выборки.
Для этого примера, поскольку контроллер имеет время выборки 0,1 секунды, настройте триггерный блок в подсистеме Function-Call для использования того же времени выборки.

В этом примере используйте блок генератора вызовов функций для выполнения подсистемы вызовов функций со скоростью выборки 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 на использование наследуемого времени выборки и периодически вызывать подсистему Triggered с тем же временем выборки, которое определено в объекте контроллера MPC.
Откройте модель.
mdl2 = 'mpc_rtwdemo_triggered';
open_system(mdl2)

Блок контроллера MPC находится в MPC в блоке триггерной подсистемы.
open_system([mdl2 '/MPC in Triggered Subsystem']);

Сконфигурируйте блок MPC для использования наследуемого времени выборки, как в случае модели подсистемы функционального вызова.
Периодически запустите подсистему Triggered с правильным временем выборки.
В этом примере сконфигурируйте блок триггера внутри запускаемой подсистемы для использования falling тип триггера.

В этом примере блок генератора импульсов используется для обеспечения периодического сигнала запуска с частотой выборки 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)
Сравните результаты моделирования из подсистемы Function-Call и подсистемы Triggered с результатом, сгенерированным блоком контроллера MPC, который не помещается в подсистему и не наследует время выборки.
mdl = 'mpc_rtwdemo';
open_system(mdl)
sim(mdl)

Сравните отклики управляемой переменной.
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')

Сравните ответы на выходные данные завода.
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)
Функционально-вызываемая подсистема (Simulink) | Запускаемая подсистема (Simulink)