В этом примере показано, как сконфигурировать и симулировать Контроллер 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 Controller в MPC в Инициированном блоке Subsystem.
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 в Инициированном блоке Subsystem.
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 Controller, который не помещается в подсистеме и не наследовал шаг расчета.
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 | Triggered Subsystem