В этом примере показано, как сконфигурировать и симулировать блоки MPC Controller, помещенные в Function-Call и триггируемые подсистемы.
Определите объект 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 Controller находится внутри MPC в блоке Триггируемая подсистема.
open_system([mdl1 '/MPC in Function-Call Subsystem'])
Сконфигурируйте контроллер, чтобы использовать унаследованный шаг расчета. Для этого выберите свойство Inherit шаг расчета блока 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 Controller находится в блоке MPC in Триггируемая Подсистема.
open_system([mdl2 '/MPC in Triggered Subsystem']);
Сконфигурируйте блок MPC, чтобы использовать унаследованный шаг расчета, как вы это сделали для модели подсистемы вызова функций.
Периодически выполняйте триггируемую подсистему с правильным шагом расчета.
В данном примере сконфигурируйте блок Trigger внутри триггируемой подсистемы, чтобы использовать falling
тип триггера.
В этом примере используйте блок 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, который не помещен в подсистему и не наследует шага расчета.
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)
Function-Call Subsystem (Simulink) | Triggered Subsystem (Simulink)