Использование контроллера MPC, блока внутри Function-Call и триггируемых подсистем

В этом примере показано, как сконфигурировать и симулировать блоки MPC Controller, помещенные в Function-Call и триггируемые подсистемы.

Определите модель объекта управления и контроллер 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);

Сконфигурируйте и симулируйте блок контроллера MPC внутри подсистемы вызова функций

Чтобы запустить этот пример, требуется 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 работает правильно внутри триггируемой подсистемы, необходимо сконфигурировать блок 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)

См. также

(Simulink) | (Simulink)

Похожие темы