В этом примере показано, как использовать программное обеспечение 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
function, убедитесь, что модель является минимальной реализацией.
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)
Постройте график входных и выходных сигналов процесса. Следующий рисунок показывает сигнал срабатывания питательной воды в кг/с.
plot(FeedWater.time/60,FeedWater.signals.values) title('Feedwater flow rate [kg/s]'); ylabel('Flow [kg/s]') xlabel('time [min]') grid on
Следующий график показывает сигнал срабатывания тепла в кДж.
plot(Heat.time/60,Heat.signals.values/1000) title('Applied heat [kJ]'); ylabel('Heat [kJ]') xlabel('time [min]') grid on
Следующий рисунок показывает тепловое нарушение порядка в кДж. Нарушение порядка изменяется на целых 50% от номинального значения тепла.
plot(HeatDist.time/60,HeatDist.signals.values/1000) title('Heat disturbance [kJ]'); ylabel('Heat [kJ]') xlabel('time [min]') grid on
На рисунке ниже показано соответствующее давление в барабане кПа. Давление изменяется примерно на 1% от номинального значения, хотя нарушение порядка относительно большое.
plot(DrumPressure.time/60,DrumPressure.signals.values) title('Drum pressure [kPa]'); ylabel('Pressure [kPa]') xlabel('time [min]') grid on bdclose(mdl)