Документация Engee
Notebook

Моделирование управления давлением в трубопроводе

В данном примере продемонстрировано моделирование управления давлением в трубопроводе.

Принцип работы модели

Трубопровод описывается блоками библиотеки физического моделирования, в частности, за его объём отвечает блок Объём.

Через Клапан 1 жидкость поступает из блока Источник в блок Объём. К нему, в свою очередь, присоединён Датчик давления, с которого сигнал поступает на систему управления, представленную сумматором, задатчиком и PID-регулятором.

Схема модели:

liquid_pressure_regulator_1725958617592.png

PID-регулятор посылает управляющий сигнал на Клапан 1, чтобы тот открылся или закрылся, обеспечивая регулирование давления.

Справа от блока Объём, по пути движения жидкости, находится блок Утечка, который представляет собой, как и Клапан 1 управляемый дроссель.

Блок Утечка создаёт некоторое "случайное" истечение жидкости из моделируемого трубопровода.

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

Граничные условия

  1. В источнике давление всегда поддерживается 151,3 кПа.
  2. В резервуаре, характеризующем пространство, куда осуществляется сброс жидкости через утечку, давление всегда равно 50 кПа.

Начальные условия:

  1. Начальное давление в трубопроводе равно 100 кПа.
  2. Сигнал задатчика равен 100000, что в контексте регулирования означает 100 кПа.

Определение функции для загрузки и запуска модели:

In [ ]:
function start_model_engee()
    try
        engee.close("liquid_pressure_regulator", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/liquid_pressure_regulator.engee") # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/liquid_pressure_regulator.engee") # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)

Запуск симуляции

In [ ]:
try
    start_model_engee() # запуск симуляции с помощью специальной функции, реализованной выше
    catch err
    end;

Выделение из переменной simout данных о температуре участков и их запись в переменные:

In [ ]:
sleep(5)
result = simout;
res = collect(result)
Out[0]:
28-element Vector{WorkspaceArray}:
 WorkspaceArray("liquid_pressure_regulator/Step.1")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.port_a.p")
 WorkspaceArray("liquid_pressure_regulator/Утечка.rho_b")
 WorkspaceArray("liquid_pressure_regulator/Утечка.Vdot_b")
 WorkspaceArray("liquid_pressure_regulator/Утечка.restriction_area_in.u")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.rho_a")
 WorkspaceArray("liquid_pressure_regulator/Add.1")
 WorkspaceArray("liquid_pressure_regulator/Утечка.mdot_b")
 WorkspaceArray("liquid_pressure_regulator/Утечка.port_b.p")
 WorkspaceArray("liquid_pressure_regulator/Утечка.Vdot_a")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.port_b.mdot")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.mdot_a")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.restriction_area_in.u")
 ⋮
 WorkspaceArray("liquid_pressure_regulator/PID Controller.1")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.Vdot_a")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.port_b.p")
 WorkspaceArray("liquid_pressure_regulator/Утечка.delta_p")
 WorkspaceArray("liquid_pressure_regulator/Утечка.mdot_a")
 WorkspaceArray("liquid_pressure_regulator/Утечка.rho_a")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.mdot_b")
 WorkspaceArray("liquid_pressure_regulator/Утечка.port_a.mdot")
 WorkspaceArray("liquid_pressure_regulator/Датчик давления.1")
 WorkspaceArray("liquid_pressure_regulator/Утечка.port_a.p")
 WorkspaceArray("liquid_pressure_regulator/Утечка.port_b.mdot")
 WorkspaceArray("liquid_pressure_regulator/Клапан 1.Vdot_b")

Запись в переменные сигналов задатчика и датчика давления:

In [ ]:
control_signal = collect(res[1])
pressure = collect(res[25])
Out[0]:

10,001 rows × 2 columns

timevalue
Float64Float64
10.0100000.0
20.011.00048e5
30.021.00097e5
40.031.00145e5
50.041.00132e5
60.05100176.0
70.061.00164e5
80.071.00166e5
90.081.00155e5
100.091.00144e5
110.1100134.0
120.111.00123e5
130.121.00113e5
140.131.00103e5
150.141.00092e5
160.151.00082e5
170.161.00072e5
180.171.00061e5
190.181.00051e5
200.191.00041e5
210.21.00031e5
220.211.00022e5
230.221.00012e5
240.231.00002e5
250.2499992.2
260.2599982.6
270.2699973.0
280.2799963.5
290.2899954.0
300.2999944.6

Визуализация результатов моделирования

In [ ]:
using Plots
plot(control_signal[:,1], control_signal[:,2], label="Задатчик", linewidth=3)
plot!(pressure[:,1], pressure[:,2], label="Датчик давления", linewidth=3)
Out[0]:

Вывод:

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

Блоки, использованные в примере