Документация 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 [ ]:
result = simout;
res = collect(result)
Out[0]:
14-element Vector{WorkspaceArray}:
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.port_a.p")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.restriction_area_in")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.rho_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Задатчик.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.mdot_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Сумматор.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.delta_p")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.rho_b")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.Vdot_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.port_b.p")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.mdot_b")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Датчик давления.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/PID-регулятор.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.Vdot_b")

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

In [ ]:
control_signal = collect(res[4])
pressure = collect(res[12])
Out[0]:
10001×2 DataFrame
9976 rows omitted
Rowtimevalue
Float64Float64
10.0100000.0
20.011.00783e5
30.021.01528e5
40.031.00949e5
50.041.01504e5
60.051.00924e5
70.061.00693e5
80.071.00127e5
90.0899619.1
100.0999082.9
110.198723.7
120.1198441.9
130.1298267.5
⋮⋮⋮
999099.891.20968e5
999199.91.20968e5
999299.911.20967e5
999399.92120966.0
999499.931.20965e5
999599.941.20964e5
999699.951.20964e5
999799.961.20963e5
999899.971.20962e5
999999.981.20961e5
1000099.991.20961e5
10001100.01.2096e5

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

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

Вывод:

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