Построение расходно-напорной характеристики сети#
1. Введение#
Проектирование и анализ теплогидравлических систем являются неотъемлемой частью инженерной практики в теплоэнергетике, водоснабжении и многих других отраслях. Ключевым инструментом для оценки работоспособности и эффективности таких систем является расходно-напорная характеристика (РНХ) сети. Эта зависимость суммарных потерь давления в сети от расхода рабочей среды позволяет определить требуемую производительность насосного оборудования и обеспечить его согласованную работу с гидравлическим контуром.
2. Постановка задачи#
В рамках данного урока рассматривается практическая задача построения такой характеристики для конкретной теплогидравлической сети. Система состоит из насоса, перекачивающего воду между двумя резервуарами с заданными параметрами, и включает в себя линейные участки трубопроводов из полипропилена, местные сопротивления в виде отводов и фильтр с известными номинальными потерями, рис. 1:
Рис. 1 Исследуемая гидравлическая сеть#
3. Цель и задачи#
3.1. Цель#
3.2. Задачи#
Создать в среде REPEAT VISION расчетную модель заданной гидравлической сети, включая резервуары, участки трубопроводов и местные сопротивления (отводы, фильтр).
Корректно настроить свойства всех элементов сети (геометрические размеры, абсолютные шероховатости, номинальные потери давления и т. д.).
Выполнить серию гидравлических расчетов сети для различных значений массового расхода и получить соответствующие значения полных потерь давления (потребного напора).
Построить на основе расчетных точек график РНХ сети.
Изучить применение РНХ сети на примере определения рабочей точки выбранного насосного оборудования.
4. Подготовка расчетной модели#
Для построения характеристики сети необходимо воспроизвести гидравлическую сеть без насосного агрегата с помощью блоков моделирования:
Разместите в области моделирования следующие блоки библиотеки
Теплогидравлика(см. рис. 2 ниже):
Баки и гидроаккумуляторы:Резервуар (ТГ)- 2 шт.Трубопроводы и соединительные элементы:Колено (ТГ)- 2 шт.;Участок трубопровода (ТГ)- 3 шт.
Гидравлические сопротивления:Сопротивление потоку (ТГ)- 1 шт.
Рис. 2 Необходимые блоки#
Добавьте на блоки соответствующие метки, как показано на рис. 3:
Примечание
Метка блока добавляется в свойствах блока в одноименном поле Метка блока
Рис. 3 Блоки с метками#
Соедините блоки так, как показано на рис. 4. При необходимости, поверните их, с помощью маркера поворота.
Подсказка
Маркер поворота
появляется при нажатии на блок ЛКМ
Рис. 4 Модель гидравлической сети#
Для построение РНХ гидравлической сети необходимо провести серию расчетов и посмотреть, какое падение давления происходит. Для проведения серии расчетов добавим блок Идеальный источник расхода (ТГ) между резервуаром 1 и трубопроводом 1 и дифференциальный Датчик давления и температуры (ТГ) между идеальным источником расхода и резервуаром 2 (см. рис. 5 ниже). Свойства блока Датчик давления и температуры (ТГ) представлены на рис. 6.
Рис. 5 Гидравлическая сеть с источником расхода и датчиком давления#
Рис. 6 Свойства блока Датчик давления и температуры (ТГ)#
4.1. Заполнение свойств блоков#
В таблицах 1–5 представлены свойства для блоков. Если какое-то из свойств блоков не указано в таблице – его значения остается по умолчанию.
Таблица 1 – Свойства для блоков Участок трубопровода (ТГ)
Свойство/Метка блока |
Трубопровод 1 |
Трубопровод 2 |
Трубопровод 3 |
|---|---|---|---|
Длина трубы, м |
4 |
2 |
2 |
Диаметр трубы, м |
|||
Абсолютная шероховатость внутренней поверхности, м |
1e-5 |
1e-5 |
Важно
В REPEAT VISION десятичные числа задаются через точку.
Таблица 2 – Свойства для блоков Колено (ТГ)
Свойство/Метка блока |
Отвод 1 |
Отвод 2 |
|---|---|---|
Диаметр колена, м |
Таблица 3 – Свойства блока Сопротивление потоку (ТГ)
Свойство/Метка блока |
Фильтр |
|---|---|
Номинальный перепад давления, МПа |
|
Номинальный массовый расход, кг/с |
|
Площадь сечения портов, м² |
Таблица 4 – Свойства блока Идеальный источник расхода (ТГ)
Свойство/Блок |
Идеальный источник расхода (ТГ) |
|---|---|
Массовый расход, кг/с |
massFlowRate |
Работа над жидкостью |
Нет |
Площадь проходного сечения входного и выходного порта, м² |
Таблица 5 – Свойства для блоков Резервуар (ТГ)
Свойство/Блок |
Резервуар 1 |
Резервуар 2 |
|---|---|---|
Избыточное давление, Па |
reservoir1GaugePressure |
reservoir2GaugePressure |
Площадь сечения портов, м² |
5. Параметрические исследования#
Подробный процесс подготовки моделей и проведения параметрических исследований описан в разделе Автоматизация работы с моделью REPEAT VISION, ознакомьтесь с данным уроком.
В процессе параметрических исследований мы будем варьировать расход в сети, поэтому необходимо создать глобальную переменную под эту величину. Создадим ее во вкладке Переменные нижней панели (см. рис. 7 ниже). Также создадим переменные под избыточное давление в резервуарах, для учета их разницы при построении характеристики сети.
Рис. 7 Глобальные переменные модели#
Кроме этого, нам необходимо получать значения перепада давления в системе при разных расходах из JupyterLite, поэтому необходимо добавить блок Выходной порт. Добавим его и соединим с портом давления блока Датчик давления и температуры (ТГ) (в качестве пользовательского названия выбрано – pressureDrop), рис. 8:
Рис. 8 Выходной порт для получения данных о падении давления на элементах гидравлической сети#
Далее предоставлен код для блокнота JupyterLite с комментариями.
Реализация серии расчетов
# Импорт piplite (пакет Python, который позволяет устанавливать пакеты в блокнотах Jupyter Notebooks) и установка пакета repeat для работы.
import piplite
await piplite.install("repeat")
# Импорт необходимых библиотек
import numpy as np
import pandas as pd
import repeat as rp
# Добавление API ключа в настройки пользователя класса User
user = rp.User(token = 'Your private API key')
# Настройка класса Application для соединения с REPEAT VISION
app = rp.Application(user)
# Сохранение id проекта в отдельную переменную
project = 140501
# Настройка временного интервала для получения значений результатов моделирования
t_interval = rp.TimeInterval(start = 10, end = 1000)
# Создание экземпляра класса Model для получения результатов расчета из модели REPEAT VISION
model = app.get_exploration_model(project, t_interval)
# Переменные в исследуемой модели
existing_vars = model.existing_variables
print(existing_vars)
# Создаем диапазон значений для massFlowRate
mass_flow_rates = np.linspace(0., 0.7, num=20, dtype=float)
results = [] # Список для сохранения результатов
# Значения переменных для избыточных давлений в резеруарах
reservoir1GaugePressure = 0.0
reservoir2GaugePressure = 30000.0
# Цикл для выполнения серии расчетов
for mass_flow in mass_flow_rates:
# Создаем объект Series со значением текущего расхода
current_variable = pd.Series({'massFlowRate': mass_flow, 'reservoir1GaugePressure': reservoir1GaugePressure,'reservoir2GaugePressure': reservoir2GaugePressure,}, dtype=float)
# Запуск расчета модели
with model as md:
md.run(current_variable)
#Сохранение результатов одного расчета в pressureDrop
pressure_drop = md.get_results('pressureDrop')
# Сохраняем последнее значение и добавляем разницу давлений в резервурах
if not pressure_drop.empty:
last_value = pressure_drop.iloc[-1] + reservoir2GaugePressure - reservoir1GaugePressure
else:
last_value = np.nan # Используем NaN для отсутствующих значений
results.append((mass_flow, last_value)) # Добавление значений в список
# Создаем DataFrame из списка кортежей
results_df = pd.DataFrame(
results,
columns=['massFlowRate', 'pressureDrop']
)
print(results_df)
Визуализация данных
# Импортируем и устанавливаем необходимые библиотеки для визуализации
import matplotlib.pyplot as plt
await piplite.install("seaborn")
import seaborn as sns
def plot_pressure_drop_curve(results_df, figsize=(10, 6)):
"""
Создает график зависимости потерь давления от массового расхода.
Parameters:
-----------
results_df : pd.DataFrame
DataFrame с колонками 'massFlowRate' и 'pressureDrop'
figsize : tuple
Размер графика в дюймах (ширина, высота)
"""
# Настройка стиля графика
plt.style.use('seaborn-v0_8-dark')
# Создаем фигуру и оси с указанным размером
fig, ax = plt.subplots(figsize=figsize, dpi=100)
# Фильтруем данные, исключая NaN значения для чистоты графика
clean_data = results_df.dropna(subset=['pressureDrop'])
# Проверяем, есть ли данные для отображения
if len(clean_data) == 0:
print("Нет данных для построения графика (все значения NaN)")
return
# Создаем основной график - линию с маркерами
# Используем маркеры 'o' для точек и линию для соединения
ax.plot(clean_data['massFlowRate'],
clean_data['pressureDrop'],
marker='o', # Маркеры в виде кружков
markersize=8, # Размер маркеров
linewidth=2, # Толщина линии
color='steelblue', # Цвет линии
alpha=0.8, # Прозрачность
label='Характеристика гидравлической сети', # Метка для легенды
markerfacecolor='white', # Заливка маркеров
markeredgewidth=2) # Толщина обводки маркеров
# Добавляем маркеры для выделения отдельных точек
# Полезно при малом количестве точек
if len(clean_data) <= 10:
# Добавляем подписи значений над точками
for idx, row in clean_data.iterrows():
ax.annotate(f"{row['pressureDrop']:.2f}",
xy=(row['massFlowRate'], row['pressureDrop']),
xytext=(0, 10), # Смещение текста относительно точки
textcoords='offset points', # Координаты смещения в пунктах
ha='center', # Горизонтальное выравнивание
fontsize=9,
color='darkslategray')
# Настройка осей графика
ax.set_xlabel('Массовый расход, кг/с',
fontsize=12,
fontweight='bold',
labelpad=10) # Отступ подписи от оси
ax.set_ylabel('Потери давления, Па',
fontsize=12,
fontweight='bold',
labelpad=10) # Отступ подписи от оси
# Заголовок графика
ax.set_title('Расходно-напорная характеристика',
fontsize=14,
fontweight='bold',
pad=20) # Отступ заголовка
# Добавляем сетку
ax.grid(True, which='both', linestyle='--', color='#2F4F4F', alpha=0.6)
# Настраиваем пределы осей с небольшим запасом
x_min, x_max = clean_data['massFlowRate'].min(), clean_data['massFlowRate'].max()
y_min, y_max = clean_data['pressureDrop'].min(), clean_data['pressureDrop'].max()
# Добавляем 5% запаса по осям
x_padding = (x_max - x_min) * 0.05
y_padding = (y_max - y_min) * 0.05
ax.set_xlim(x_min - x_padding, x_max + x_padding)
ax.set_ylim(y_min - y_padding, y_max + y_padding)
# Добавляем легенду с настройками позиционирования
ax.legend(loc='lower right',
bbox_to_anchor=(1.0, 0.012),
fontsize=10,
framealpha=0.9,
facecolor='#2F4F4F',
edgecolor='white')
# Добавляем статистическую информацию в угол графика
stats_text = f"Количество точек: {len(clean_data)}\n" \
f"ΔP мин: {clean_data['pressureDrop'].min():.2f} Па\n" \
f"ΔP макс: {clean_data['pressureDrop'].max():.2f} Па"
ax.text(0.02, 0.98, stats_text,
transform=ax.transAxes, # Используем относительные координаты
verticalalignment='top',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8),
fontsize=9)
# Настраиваем внешний вид графика
# Убираем лишние отступы
plt.tight_layout()
# Отображаем график
plt.show()
# Возвращаем объекты фигуры и осей для возможной дальнейшей настройки
return fig, ax
# Создаем график
fig, ax = plot_pressure_drop_curve(results_df)
Сохранение графика
# Дополнительная функция для сохранения графика
def save_plot(fig, filename='pressure_drop_vs_flowrate.png', dpi=300):
"""
Сохраняет график в файл.
Parameters:
-----------
fig : matplotlib.figure.Figure
Объект фигуры
filename : str
Имя файла для сохранения
dpi : int
Разрешение изображения (точек на дюйм)
"""
fig.savefig(filename, dpi=dpi, bbox_inches='tight')
print(f"График сохранен как {filename}")
save_plot(fig, 'pressure_drop_vs_mass_flow.png')
В результате выполнения кода мы получаем график характеристики гидравлической сети, рис. 9:
Рис. 9 РНХ сети#
6. Применение характеристики сети#
Характеристика сети является отправной точкой для выбора насосного оборудования для проектируемой системы. На основе неё вы можете подобрать необходимый насос для обеспечения подачи и проверить его рабочую точку.
В качестве примера рассмотрим насос Wilo Star-RS 25/4 для работы в моделируемой сети. Его РНХ представлена на рис. 10 [1]:
Рис. 10 РНХ серии насосов WiloStar#
С имеющейся кривой снимем ряд точек (в интересующем нас диапазоне) для добавления кривой на график РНХ сети (таблица 6):
Таблица 6 - Точки РНХ Wilo Star-RS 25/4
Расход, м\(^3\)/ч |
Расход, кг/с |
Напор, м |
Напор, Па |
|---|---|---|---|
0 |
0 |
||
1 |
|||
Добавим РНХ насоса на график. Код, с необходимыми изменениями представлен далее.
Визуализация РНХ для насоса и сети
# Данные для выбранного насоса Wilo Star-RS 25/4
pump_df = pd.DataFrame({
'massFlowRate': [0.0, 0.0693, 0.1386, 0.2079, 0.2772, 0.3465, 0.3881],
'pressureDrop': [38182.5, 36028.6, 33776.8, 31525.0, 29077.4, 26434.0, 24867.6]
})
# Импортируем и устанавливаем необходимые библиотеки для визуализации
import matplotlib.pyplot as plt
await piplite.install("seaborn")
import seaborn as sns
def plot_pressure_drop_curve(results_df, pump_df, figsize=(10, 6)):
"""
Создает график зависимости потерь давления от массового расхода.
Parameters:
-----------
results_df : pd.DataFrame
DataFrame с колонками 'massFlowRate' и 'pressureDrop' для характеристики сети
pump_df: pd.DataFrame
DataFrame с колонками 'massFlowRate' и 'pressureDrop' для характеристики насоса
figsize : tuple
Размер графика в дюймах (ширина, высота)
"""
# Настройка стиля графика
plt.style.use('seaborn-v0_8-dark')
# Создаем фигуру и оси с указанным размером
fig, ax = plt.subplots(figsize=figsize, dpi=100)
# Фильтруем данные, исключая NaN значения для чистоты графика
clean_data = results_df.dropna(subset=['pressureDrop'])
#Данные для насоса
clean_pump_data = pump_df.dropna(subset=['pressureDrop'])
# Проверяем, есть ли данные для отображения
if len(clean_data) == 0:
print("Нет данных для построения графика (все значения NaN)")
return
# Создаем основной график - линию с маркерами
# Используем маркеры 'o' для точек и линию для соединения
ax.plot(clean_data['massFlowRate'],
clean_data['pressureDrop'],
marker='o', # Маркеры в виде кружков
markersize=8, # Размер маркеров
linewidth=2, # Толщина линии
color='steelblue', # Цвет линии
alpha=0.8, # Прозрачность
label='Характеристика гидравлической сети', # Метка для легенды
markerfacecolor='white', # Заливка маркеров
markeredgewidth=2) # Толщина обводки маркеров
# График РНХ насоса
ax.plot(clean_pump_data['massFlowRate'],
clean_pump_data['pressureDrop'],
marker='o', # Маркеры в виде кружков
markersize=8, # Размер маркеров
linewidth=2, # Толщина линии
color='#e63946', # Цвет линии
alpha=0.8, # Прозрачность
label='Характеристика насоса', # Метка для легенды
markerfacecolor='white', # Заливка маркеров
markeredgewidth=2) # Толщина обводки маркеров
# Добавляем маркеры для выделения отдельных точек
# Полезно при малом количестве точек
if len(clean_data) <= 10:
# Добавляем подписи значений над точками
for idx, row in clean_data.iterrows():
ax.annotate(f"{row['pressureDrop']:.2f}",
xy=(row['massFlowRate'], row['pressureDrop']),
xytext=(0, 10), # Смещение текста относительно точки
textcoords='offset points', # Координаты смещения в пунктах
ha='center', # Горизонтальное выравнивание
fontsize=9,
color='darkslategray')
# Настройка осей графика
ax.set_xlabel('Массовый расход, кг/с',
fontsize=12,
fontweight='bold',
labelpad=10) # Отступ подписи от оси
ax.set_ylabel('Потери давления, Па',
fontsize=12,
fontweight='bold',
labelpad=10) # Отступ подписи от оси
# Заголовок графика
ax.set_title('Расходно-напорная характеристика',
fontsize=14,
fontweight='bold',
pad=20) # Отступ заголовка
# Добавляем сетку
ax.grid(True, which='both', linestyle='--', color='#2F4F4F', alpha=0.6)
# Настраиваем пределы осей с небольшим запасом
x_min, x_max = clean_data['massFlowRate'].min(), clean_data['massFlowRate'].max()
y_min, y_max = clean_data['pressureDrop'].min(), clean_data['pressureDrop'].max()
# Добавляем 5% запаса по осям
x_padding = (x_max - x_min) * 0.05
y_padding = (y_max - y_min) * 0.05
ax.set_xlim(x_min - x_padding, x_max + x_padding)
ax.set_ylim(y_min - 12 * y_padding, y_max + y_padding)
# Добавляем легенду с настройками позиционирования
ax.legend(loc='lower right',
bbox_to_anchor=(1.0, 0.012),
fontsize=10,
framealpha=0.9,
facecolor='#2F4F4F',
edgecolor='white')
# Добавляем статистическую информацию в угол графика
stats_text = f"Количество точек: {len(clean_data)}\n" \
f"ΔP мин: {clean_data['pressureDrop'].min():.2f} Па\n" \
f"ΔP макс: {clean_data['pressureDrop'].max():.2f} Па"
ax.text(0.02, 0.98, stats_text,
transform=ax.transAxes, # Используем относительные координаты
verticalalignment='top',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8),
fontsize=9)
# Настраиваем внешний вид графика
# Убираем лишние отступы
plt.tight_layout()
# Отображаем график
plt.show()
# Возвращаем объекты фигуры и осей для возможной дальнейшей настройки
return fig, ax
# Создаем график
fig, ax = plot_pressure_drop_curve(results_df, pump_df)
Рис. 11 Графики характеристик насоса и сети#
В результате выполнения кода вы получаете РНХ сети и насоса на одном графике (см. рис. 11 выше), что позволяет визуально определить рабочую точку насоса в моделируемой сети. Согласно полученным графикам, рабочая точка насоса соответствует расходу около 0.22 [кг/с].
6.1. Определение рабочей точки насоса в математической модели#
Перейдем в модель и добавим блок Насос по характеристикам (ТГ) между фильтром и трубопроводом 2 и блок Датчик расхода (ТГ) (в качестве связанного блока используйте насос). Затем удалите блок Идеальный источник расхода (ТГ), рис. 12:
Рис. 12 Модель с насосом#
Заполните свойства насоса согласно таблице 7. Свойства заданы, исходя из кривой насоса, определенной ранее.
Таблица 7 - Свойства блока Насос по характеристикам (ТГ)
Свойство/Метка блока |
Wilo Star-RS 25/4 |
|---|---|
Площадь сечения порта, м² |
|
Вектор напора давления, м |
|
Вектор объемного расхода, л/мин |
Запустите модель на расчет и снимите показания датчика расхода.
Значение расхода составляет 0.21875383 [кг/с], что соответствует построенным ранее кривым и определённой графически рабочей точке, рис. 13:
Рис. 13 Расход среды в математической модели#
7. Выводы#
В ходе выполнения урока была успешно освоена методика построения РНХ для гидравлической сети с использованием ПО REPEAT VISION. Практическая работа позволила пройти полный цикл инженерного анализа: от создания и корректной настройки расчетной модели, включающей резервуары, трубопроводы и местные сопротивления, до автоматизации параметрических расчетов с помощью скриптовой среды JupyterLite для получения массива данных. В результате была построена характеристика сети.
Таким образом, освоенный инструментарий построения РНХ в REPEAT VISION представляет собой основу для проектирования, анализа и оптимизации теплогидравлических систем, обеспечивая обоснованный выбор насосного оборудования и прогнозирование его эффективной работы в составе конкретной сети.