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

Моделирование гидравлического удара

В этом примере мы изучим, как можно моделировать гидроудар в длинной трубе при помощи блоков библиотеки Изотермическая жидкость (IL).

Поток жидкости в трубе управляется вентилем. Сперва система управления плавно открывает вентиль, увеличивая скорость потока, но сохраняя при этом стационарный характер течения. Затем при резком закрытии вентиля (0.1 с) мы можем наблюдать эффект гидроудара.

Описание модели

На верхнем уровне модель выглядит следующим образом:

image.png

Трубопровод соединяет два резервуара, в первом поддерживается давление 6 атмосфер. Жидкость будет течь во второй резервуар, давление в котором тоже постоянно и равно 5 атмосфер.

Между двумя трубами длиной 25 метров находится подсистема "Датчики", где расположены датчики расхода и давления. Для сохранения топологии модели, модуль построения графиков вынесен в отдельную подсистему "Приборы". Там можно осуществлять фильтрацию данных, но в этой модели мы лишь домножаем полное давление в паскалях на константу чтобы получить показания в атмосферах.

Работа блока управления вентилем зависит от переменной состояния sqitching_mode, которая может принимать значение "Fast" или "Slow". Быстрое перекрытие потока переводит систему в очень активный нестационарный режим, который мы продемонстрируем.

In [ ]:
switching_mode = "Fast";

Для моделирования вентиля мы используем блок Variable Local Restriction (IL), трубы представлены блоками Pipe (IL). Чтобы увидеть эффект гидроудара, нужно чтобы модель трубы позволяла моделировать сжимаемость и инерцию жидкости (по умолчанию трубы не учитывают инерцию, ее нужно включить в настройках блока Pipe (IL)).

Моделирование быстрого перекрытия вентиля

В этом варианте модели, ступенчатая функция, которая задает перекрытие вентиля, сглаживается при помощи передаточной функции $\frac{1}{0.01 s + 1}$. В итоге мы наблюдаем достаточно резкий переходный процесс.

In [ ]:
# Установим модель в режим быстрого переключения
switching_mode = "Fast";

# Загрузим и запустим модель
modelName = "water_hammer"
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
data = engee.run( modelName )
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "p_f"  => 2501×2 DataFrame…
  "mdot" => 2501×2 DataFrame

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

In [ ]:
gr()
plot(
    plot( data["p_f"].time, data["p_f"].value, leg=false, title="Массовый расход, кг/с" ),
    plot( data["mdot"].time, data["mdot"].value, leg=false, title="Давление, атм" ),
    layout=(2,1)
)
Out[0]:

Моделирование медленного перекрытия вентиля

Если же управлять вентилем достаточно медленно (сглаживая ступеньку при помощи передаточной функции $\frac{1}{s + 1}$), то мы наблюдаем плавный переходный процесс.

In [ ]:
# Установим модель в режим быстрого переключения
switching_mode = "Slow";

# Запустим другой вариант модели
data = engee.run( modelName )
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "p_f"  => 2501×2 DataFrame…
  "mdot" => 2501×2 DataFrame
In [ ]:
gr()
plot(
    plot( data["p_f"].time, data["p_f"].value, leg=false, title="Массовый расход, кг/с" ),
    plot( data["mdot"].time, data["mdot"].value, leg=false, title="Давление, атм" ),
    layout=(2,1)
)
Out[0]:

Заключение

Мы получили довольно убедительную демонстрацию эффекта гидравлического удара, применив при этом минимум вспомогательных блоков. Построили систему с двумя вариантами работы (быстрое и медленное закрытие вентиля) и вывели приборную панель через отдельную подсистему, успешно использовав блоки From и Goto.

Чтобы сделать модель более наглядной, можно было бы добавить больше сегментов трубопровода и измерять давление между ними, или моделировать демпфированный резервуар