Используя контроллер MPC блок в вызове функции и инициированных подсистемах

Этот пример показывает, как сконфигурировать и моделировать Контроллер MPC блоки, помещенные в Вызове функции и Инициированных подсистемах.

Задайте контроллер 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, чтобы использовать наследованный шаг расчета (-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 работает правильно в Инициированной подсистеме, необходимо сконфигурировать блок 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);

Смотрите также

|

Похожие темы