Разработайте контроллер MPC в командной строке

Этот пример показывает, как создать и протестировать образцовый прогнозирующий контроллер из командной строки.

Задайте модель объекта управления

Этот пример использует модель объекта управления, описанную в Контроллере Проекта Используя MPC Designer. Создайте модель в пространстве состояний объекта и установите некоторые дополнительные образцовые свойства.

A = [-0.0285 -0.0014; -0.0371 -0.1476];
B = [-0.0850 0.0238; 0.0802 0.4462];
C = [0 1; 1 0];
D = zeros(2,2);
CSTR = ss(A,B,C,D);

CSTR.InputName = {'T_c','C_A_i'};
CSTR.OutputName = {'T','C_A'};
CSTR.StateName = {'C_A','T'};
CSTR.InputGroup.MV = 1;
CSTR.InputGroup.UD = 2;
CSTR.OutputGroup.MO = 1;
CSTR.OutputGroup.UO = 2;

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

Чтобы улучшить ясность примера, подавите сообщения Командного окна от диспетчера MPC.

old_status = mpcverbosity('off');

Создайте образцовый прогнозирующий контроллер с интервалом управления или шаг расчета, второго 1, и со всеми другими свойствами в их значениях по умолчанию.

Ts = 1;
MPCobj = mpc(CSTR,Ts);

Отобразите свойства контроллера в Командном окне.

display(MPCobj)
 
MPC object (created on 11-Jan-2019 01:26:11):
---------------------------------------------
Sampling time:      1 (seconds)
Prediction Horizon: 10
Control Horizon:    2

Plant Model:        
                                      --------------
      1  manipulated variable(s)   -->|  2 states  |
                                      |            |-->  1 measured output(s)
      0  measured disturbance(s)   -->|  2 inputs  |
                                      |            |-->  1 unmeasured output(s)
      1  unmeasured disturbance(s) -->|  2 outputs |
                                      --------------
Indices:
  (input vector)    Manipulated variables: [1 ]
                  Unmeasured disturbances: [2 ]
  (output vector)        Measured outputs: [1 ]
                       Unmeasured outputs: [2 ]

Disturbance and Noise Models:
        Output disturbance model: default (type "getoutdist(MPCobj)" for details)
         Input disturbance model: default (type "getindist(MPCobj)" for details)
         Measurement noise model: default (unity gain after scaling)

Weights:
        ManipulatedVariables: 0
    ManipulatedVariablesRate: 0.1000
             OutputVariables: [1 0]
                         ECR: 100000

State Estimation:  Default Kalman Filter (type "getEstimator(MPCobj)" for details)

Unconstrained

Просмотрите и измените свойства контроллера

Отобразите список свойств контроллера и их текущих значений.

get(MPCobj)
                          Ts: 1                   
       PredictionHorizon (P): 10                  
          ControlHorizon (C): 2                   
                       Model: [1x1 struct]        
   ManipulatedVariables (MV): [1x1 struct]        
        OutputVariables (OV): [1x2 struct]        
   DisturbanceVariables (DV): [1x1 struct]        
                 Weights (W): [1x1 struct]        
                   Optimizer: [1x1 struct]        
                       Notes: {}                  
                    UserData: []                  
                     History: 11-Jan-2020 01:26:11

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

Используйте запись через точку, чтобы изменить эти свойства. Например, измените горизонт прогноза на 15.

MPCobj.PredictionHorizon = 15;

Можно сократить имена свойства при условии, что сокращение однозначно.

Многие свойства контроллера являются структурами, содержащими дополнительные поля. Используйте запись через точку, чтобы просмотреть и изменить эти значения полей. Например, можно установить модули измерения для выходных переменных контроллера. Свойство OutputUnit в целях отображения только и является дополнительным.

MPCobj.Model.Plant.OutputUnit = {'Deg C','kmol/m^3'};

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

MPCobj.MV.Min = -10;
MPCobj.MV.Max = 10;
MPCobj.MV.RateMin = -3;
MPCobj.MV.RateMax = 3;

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

MPCobj.W.ManipulatedVariablesRate = 0.3;
MPCobj.W.OutputVariables = [1 0];

Можно также задать изменяющиеся во времени ограничения и веса по горизонту прогноза, который переключает на каждом временном шаге. Изменяющиеся во времени ограничения имеют нелинейный эффект, когда они активны. Например, чтобы обеспечить переменную, которой управляют, чтобы изменяться более медленно к концу горизонта прогноза, введите:

MPCobj.MV.RateMin = [-4; -3.5; -3; -2.5];

MPCobj.MV.RateMax = [4; 3.5; 3; 2.5];

-2.5 и значения 2.5 используются для четвертого шага и вне.

Точно так же можно задать различные веса выходной переменной для каждого шага горизонта прогноза. Например, введите:

MPCobj.W.OutputVariables = [0.1 0; 0.2 0; 0.5 0; 1 0];

Можно также изменить характеристики подавления помех контроллера. Смотрите setEstimator, setindist и setoutdist для получения дополнительной информации.

Рассмотрите проектирование контроллера

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

review(MPCobj)

В этом примере команда review нашла две потенциальных проблемы с проектом. Первое предупреждение спрашивает, намеревается ли пользователь иметь вес нуля на C_A вывод. Второе предупреждение советует пользователю стараться не иметь трудно ограничения и на MV и на MVRate.

Выполните линейные симуляции

Используйте функцию sim, чтобы запустить линейную симуляцию системы. Например, моделируйте ответ с обратной связью MPCobj для интервалов управления 26. Задайте заданные значения 2 и 0 для реакторной температуры и остаточной концентрации соответственно. Заданное значение для остаточной концентрации проигнорировано, потому что настраивающийся вес для второго вывода является нулем.

T = 26;
r = [0 0; 2 0];
sim(MPCobj,T,r)

Можно изменить опции симуляции с помощью mpcsimopt. Например, запустите симуляцию с переменными, выключенными ограничениями, которыми управляют.

MPCopts = mpcsimopt;
MPCopts.Constraints = 'off';
sim(MPCobj,T,r,MPCopts)

Первый шаг переменной, которой управляют, теперь превышает заданный 3 - модульное ограничение уровня.

Можно также выполнить симуляцию с несоответствием объекта/модели. Например, задайте объект с 50% большими усилениями, чем те в модели, используемой контроллером.

Plant = 1.5*CSTR;
MPCopts.Model = Plant;
sim(MPCobj,T,r,MPCopts)

Несоответствие объекта/модели ухудшает производительность контроллера немного. Ухудшение может быть серьезным и должно быть протестировано в зависимости от конкретного случая.

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

Сохраните результаты симуляции

Сохраните результаты симуляции в рабочем пространстве MATLAB.

[y,t,u] = sim(MPCobj,T,r);

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

figure
subplot(2,1,1)
plot(t,u)
title('Inputs')
legend('T_c')
subplot(2,1,2)
plot(t,y)
title('Outputs')
legend('T','C_A')
xlabel('Time')

Восстановите установку mpcverbosity.

mpcverbosity(old_status);

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

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте