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

Автор
avatar-mikhailpetrovmikhailpetrov
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 с, давление стабилизируется в допустимых пределах, его незначительные колебания связаны с утечкой жидкости из трубопровода.