Явное MPC управление сервопривода постоянного тока с ограничением на невынесенный выход

Этот пример показывает, как использовать явный MPC для управления сервомеханизмом постоянного тока при ограничениях по напряжению и крутящему моменту вала.

Для аналогичного примера, который использует традиционный неявный MPC, смотрите Сервопривод постоянного тока с ограничением на невынесенный выход.

Задайте Модель электродвигателя DC-Servo

Линейная динамическая модель без разомкнутого контура задана в plant. Переменные tau - максимальный допустимый крутящий момент, используемый в качестве выхода ограничения.

[plant,tau] = mpcmotormodel;

Задайте типы входного и выходного сигналов для контроллера MPC. Второй выход, крутящий момент, неизмерим.

plant = setmpcsignals(plant,'MV',1,'MO',1,'UO',2);

Задайте ограничения

Управляемая переменная ограничена между +/- 220 вольтами. Поскольку входные параметры и выходы объекта имеют различные порядки величины, вы также используете шкалу факторы для упрощения настройки MPC. Типичными вариантами шкалы коэффициента являются верхний/нижний предел или рабочая область значений.

MV = struct('Min',-220,'Max',220,'ScaleFactor',440);

Ограничения выхода крутящего момента накладываются только на первых трех шагах предсказания, чтобы ограничить сложность явного проекта MPC.

OV = struct('Min',{Inf, [-tau;-tau;-tau;-Inf]},...
            'Max',{Inf, [tau;tau;tau;Inf]},...
            'ScaleFactor',{2*pi, 2*tau});

Задайте веса настройки

Задача управления состоит в том, чтобы получить нуль нулевого отслеживания для углового положения. Поскольку у вас есть только одна манипулируемая переменная, крутящий момент вала допускается плавающий в пределах своего ограничения, устанавливая его вес равным нулю.

Weights = struct('MV',0,'MVRate',0.1,'OV',[0.1 0]);

Создайте контроллер MPC

Создайте контроллер со шаг расчета Ts, горизонт предсказания p, и управляйте горизонтом m.

Ts = 0.1;
p = 10;
m = 2;
mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);

Сгенерируйте явный контроллер

Явный MPC выполняет эквивалентную явную кусочно-аффинную версию закона MPC управления, заданную традиционным неявным контроллером MPC. Чтобы сгенерировать явный MPC-контроллер из неявного MPC-контроллера, необходимо задать область значений для каждого состояния контроллера, опорного сигнала, манипулируемой переменной и измеренной нарушением порядка так, чтобы многопараметрическая квадратичная задача программирования была решена в наборах параметров, заданных этими областями значений.

Создайте структуру области значений, где можно задать область значений для каждого параметра впоследствии.

range = generateExplicitRange(mpcobj);
-->Converting model to discrete time.
   Assuming no disturbance added to measured output channel #1.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Задайте области значений для состояний контроллера

Состояния контроллера MPC включают состояния из модели объекта управления, модели возмущения и модели шума в этом порядке. Установка области значений переменной состояния иногда затрудняется, когда состояние не соответствует физическому параметру. В этом случае для сбора данных о области значений состояний рекомендуется выполнить несколько симуляции разомкнутого объекта с типичными опорными и возмущающими сигналами.

range.State.Min(:) = -1000;
range.State.Max(:) = 1000;

Обычно вы знаете практический диапазон опорных сигналов, используемых в номинальной рабочей точке объекта. Области значений, используемые для генерации явного контроллера MPC, должны быть по крайней мере такими же большими, как и практическая область значений. Обратите внимание, что область значений для ссылки крутящего момента зафиксирована на 0 потому что это имеет нулевой вес.

range.Reference.Min = [-5;0];
range.Reference.Max = [5;0];

Если управляемые переменные ограничены, области значений, используемые для генерации явного контроллера MPC, должны быть по крайней мере такими же большими, как и эти пределы.

range.ManipulatedVariable.Min = MV.Min - 1;
range.ManipulatedVariable.Max = MV.Max + 1;

Создайте явный контроллер MPC с заданными областями.

mpcobjExplicit = generateExplicitMPC(mpcobj,range)

Regions found / unexplored:       75/       0

 
Explicit MPC Controller
---------------------------------------------
Controller sample time:    0.1 (seconds)
Polyhedral regions:        75
Number of parameters:      6
Is solution simplified:    No
State Estimation:          Default Kalman gain
---------------------------------------------
Type 'mpcobjExplicit.MPC' for the original implicit MPC design.
Type 'mpcobjExplicit.Range' for the valid range of parameters.
Type 'mpcobjExplicit.OptimizationOptions' for the options used in multi-parametric QP computation.
Type 'mpcobjExplicit.PiecewiseAffineSolution' for regions and gain in each solution.

Построение кусочно-аффинной перегородки

Можно просмотреть любой 2-D раздел кусочно-аффинного раздела, заданный явным законом MPC управления. Для этого сначала создайте структуру параметра, где можно задать, какое 2-D сечение построить на графике.

params = generatePlotParameters(mpcobjExplicit);

В этом примере вы строите график первой переменной состояния против второй переменной состояния. Все другие параметры должны быть зафиксированы в значениях в соответствующих областях значений.

Исправьте другие переменные состояния.

params.State.Index = [3 4];
params.State.Value = [0 0];

Исправьте опорные сигналы.

params.Reference.Index = [1 2];
params.Reference.Value = [pi 0];

Исправьте манипулированные переменные.

params.ManipulatedVariable.Index = 1;
params.ManipulatedVariable.Value = 0;

Постройте график заданного 2-D раздела.

plotSection(mpcobjExplicit,params);
axis([-.3 .3 -2 2]);
grid
title('Section of partition [x3(t)=0, x4(t)=0, u(t-1)=0, r(t)=pi]')
xlabel('x1(t)')
ylabel('x2(t)')

Симулируйте контроллер, используя sim Функция

Сравните результаты симуляции замкнутой системы между неявным MPC и явными контроллерами.

Tstop = 8;                      % seconds
Tf = round(Tstop/Ts);           % simulation iterations
r = [pi 0];                     % reference signal
[y1,t1,u1] = sim(mpcobj,Tf,r);  % simulation with traditional MPC
[y2,t2,u2] = sim(mpcobjExplicit,Tf,r);   % simulation with Explicit MPC
-->Converting model to discrete time.
   Assuming no disturbance added to measured output channel #1.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Эти результаты симуляции идентичны.

fprintf('Difference between implicit and explicit MPC trajectories = %g\n',...
        norm(u2-u1)+norm(y2-y1));
Difference between implicit and explicit MPC trajectories = 8.68909e-12

Симулируйте с использованием Simulink

Чтобы запустить этот пример, требуется Simulink ®.

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink(R) is required to run this example.')
    return
end

Симулируйте управление с обратной связью линейной модели объекта управления в Simulink. Блок Explicit MPC Controller настроен на использование mpcobjExplicit в качестве его контроллера.

mdl = 'empc_motor';
open_system(mdl)
sim(mdl)

Реакция с обратной связью идентична традиционному контроллеру MPC, разработанному в сервоприводе постоянного тока с ограничением на невынесенный выход.

Управление с использованием субоптимального явного MPC

Чтобы уменьшить объем памяти, можно использовать simplify функция для уменьшения количества кусочно-аффинных регионов решения. Например, можно удалить области, чей радиус Чебышёва меньше 0.08. Однако цена, которую вы платите, состоит в том, что эффективность контроллера неоптимальна.

mpcobjExplicitSimplified = simplify(mpcobjExplicit,'radius',0.08)

Regions to analyze:       75/      75 --> 37 regions deleted.

 
Explicit MPC Controller
---------------------------------------------
Controller sample time:    0.1 (seconds)
Polyhedral regions:        38
Number of parameters:      6
Is solution simplified:    Yes
State Estimation:          Default Kalman gain
---------------------------------------------
Type 'mpcobjExplicitSimplified.MPC' for the original implicit MPC design.
Type 'mpcobjExplicitSimplified.Range' for the valid range of parameters.
Type 'mpcobjExplicitSimplified.OptimizationOptions' for the options used in multi-parametric QP computation.
Type 'mpcobjExplicitSimplified.PiecewiseAffineSolution' for regions and gain in each solution.

Количество кусочно-аффинных регионов уменьшено.

Сравните результаты симуляции замкнутой системы между неоптимальным явным MPC и явным MPC.

[y3,t3,u3] = sim(mpcobjExplicitSimplified, Tf, r);
-->Converting model to discrete time.
   Assuming no disturbance added to measured output channel #1.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

Результаты симуляции не те же.

fprintf('Difference between exact and suboptimal explicit MPC trajectories = %g\n',...
        norm(u3-u2)+norm(y3-y2));
Difference between exact and suboptimal explicit MPC trajectories = 439.399

Постройте график результатов.

figure
subplot(3,1,1)
plot(t1,y1(:,1),t3,y3(:,1),'o')
grid
title('Angle (rad)')
legend('Explicit','sub-optimal Explicit')
subplot(3,1,2)
plot(t1,y1(:,2),t3,y3(:,2),'o')
grid
title('Torque (Nm)')
legend('Explicit','sub-optimal Explicit')
subplot(3,1,3)
plot(t1,u1,t3,u3,'o')
grid
title('Voltage (V)')
legend('Explicit','sub-optimal Explicit')

Результат симуляции с использованием неоптимального явного MPC немного хуже.

Ссылки

[1] A. Bemporad and E. Mosca, «Выполнение жестких ограничений в неопределенных линейных системах путем управления ссылками», Automatica, vol. 34, no. 4, pp. 451-461, 1998.

bdclose(mdl)

Похожие темы