Отрегулируйте давление в бойлере барабана

Этот пример показывает, как использовать программное обеспечение Simulink® Control Design™, с помощью бойлера барабана в качестве примера приложения. Используя функцию поиска рабочей точки, пример иллюстрирует линеаризацию модели, а также последующего наблюдателя состояния и проект LQR. В этой модели бойлера барабана проблема управления состоит в том, чтобы отрегулировать давление бойлера перед лицом случайных колебаний тепла от печи путем корректировки скорости потока жидкости подачи воды и номинального поданного тепла. В данном примере 95% случайных колебаний тепла составляют меньше чем 50% номинальной теплоты сгорания, которая весьма обычна для запущенного печью бойлера.

Откройте модель

Откройте модель Simulink.

mdl = 'Boiler_Demo';
open_system(mdl)

Когда вы открываете модель управления бойлера, программное обеспечение инициализирует размеры контроллера. u0 и y0 установлены после вычисления рабочей точки и поэтому первоначально обнуляются. Наблюдатель и регулятор вычисляются во время проектирования контроллера, продвигаются и также первоначально обнуляются.

Найдите номинальную рабочую точку и линеаризуйте модель

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

Создайте спецификацию рабочей точки, где значения состояния известны.

opspec = operspec(mdl);
opspec.States(1).Known = 1;
opspec.States(2).Known = 1;
opspec.States(3).Known = [1;1];

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

opspec.Inputs(1).Known = [0;0];     % Inputs unknown
opspec.Inputs(1).Min = [0;0];       % Input minimum value

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

opspec = addoutputspec(opspec,[mdl '/Boiler'],1);
opspec.Outputs(1).Known = 0;    % Outputs unknown
opspec.Outputs(1).Min = 0;      % Output minimum value

Вычислите рабочую точку и сгенерируйте отчет поиска рабочей точки.

[opSS,opReport] = findop(mdl,opspec);
 Operating point search report:
---------------------------------

 Operating point search report for the Model Boiler_Demo.
 (Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States: 
----------
(1.) Boiler_Demo/Boiler/Steam volume
      x:           5.6      dx:      7.85e-13 (0)
(2.) Boiler_Demo/Boiler/Temperature
      x:           180      dx:     -5.93e-14 (0)
(3.) Boiler_Demo/Observer/Internal
      x:             0      dx:             0 (0)
      x:             0      dx:             0 (0)

Inputs: 
----------
(1.) Boiler_Demo/Input
      u:      2.41e+05    [0 Inf]
      u:           100    [0 Inf]

Outputs: 
----------
(1.) Boiler_Demo/Boiler
      y:         1e+03    [0 Inf]

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

Boiler_io(1) = linio([mdl '/Sum'],1,'input');
Boiler_io(2) = linio([mdl '/Demux'],2,'input');

Затем, задайте выходные точки разомкнутого цикла для линеаризации.

Boiler_io(3) = linio([mdl '/Boiler'],1,'openoutput');
setlinio(mdl,Boiler_io);

Найдите линейную модель вокруг выбранной рабочей точки.

Lin_Boiler = linearize(mdl,opSS,Boiler_io);

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

Lin_Boiler = minreal(Lin_Boiler);
1 state removed.

Разработайте регулятор и наблюдателя состояния

Используя эту линейную модель, разработайте регулятор LQR, и Фильтр Калмана утверждают наблюдателя. Во-первых, найдите, что смещения контроллера убеждаются, что контроллер действует вокруг выбранной точки линеаризации путем получения вычисленной рабочей точки.

u0 = opReport.Inputs.u;
y0 = opReport.Outputs.y;

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

Q = diag(1e8);                  % Output regulation
R = diag([1e2,1e6]);            % Input limitation
[K,S,E] = lqry(Lin_Boiler,Q,R);

Разработайте Кальмана, утверждают наблюдателя, использующего функцию kalman. В данном примере основной источник шума является шумом процесса. Шум вводит систему только через один вход, следовательно форма G и H.

[A,B,C,D] = ssdata(Lin_Boiler);
G = B(:,1);
H = 0;
QN = 1e4;
RN = 1e-1;
NN = 0;
[Kobsv,L,P] = kalman(ss(A,[B G],C,[D H]),QN,RN);

Моделируйте модель

Моделируйте модель для разработанного контроллера.

sim(mdl)

Постройте сигналы ввода и вывода процесса. Следующие данные показывают сигнал приведения в действие подачи воды в kg/s.

plot(FeedWater.time/60,FeedWater.signals.values)
title('Feedwater flow rate [kg/s]');
ylabel('Flow [kg/s]')
xlabel('time [min]')
grid on

Следующий график показывает сигнал приведения в действие тепла в kJ.

plot(Heat.time/60,Heat.signals.values/1000)
title('Applied heat [kJ]');
ylabel('Heat [kJ]')
xlabel('time [min]')
grid on

Следующие данные показывают воздействие тепла в kJ. Воздействие отличается целых 50% номинальной теплотворности.

plot(HeatDist.time/60,HeatDist.signals.values/1000)
title('Heat disturbance [kJ]');
ylabel('Heat [kJ]')
xlabel('time [min]')
grid on

Фигура ниже показов соответствующее давление барабана в kPa. Давление отличается приблизительно 1% номинальной стоимости даже при том, что воздействие является относительно большим.

plot(DrumPressure.time/60,DrumPressure.signals.values)
title('Drum pressure [kPa]');
ylabel('Pressure [kPa]')
xlabel('time [min]')
grid on

bdclose(mdl)