Насос характеризуется напорной характеристикой - зависимостью напора насоса от его подачи.
Рассмотрим некий погружной канализационный насос.
import numpy as np # работа с массивами
from scipy.interpolate import interp1d # интерполяция/экстраполяция
# Данные для построения напорной характеристики
Qs = np.array([0, 5, 15, 20, 30, 35])
Hs = np.array([30.8, 29.5, 25.5, 23, 16.5, 12.2])
# Напорная характеристика
Напор = interp1d(Qs, Hs, kind = 'cubic', fill_value='extrapolate')
# Данные для построения зависимости КПД от подачи
Qs = np.array([0, 5, 15, 20, 23, 30, 35])
effs = np.array([0, 20, 45, 50, 51, 47, 38.3])
# Зависимость КПД от подачи
КПД = interp1d(Qs, effs, kind = 'cubic', fill_value='extrapolate')
Q1s = np.linspace(0,50) # диапазон для построения напорной характеристики, продлённой вправо
Q2s = np.linspace(0,35) # диапазон для которого есть данные от производителя
Q1s = np.array([Q for Q in Q1s if Напор(Q)>0]) # удаляем Q для которых напор получился меньше нуля
НХs = [Напор(Q) for Q in Q1s] # напорная характеристика насоса, продлённая вправо
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 10.0
fig, ax = plt.subplots(figsize = (8, 4))
ax.arrow(5, 5, 21.5, 0, head_width = 0.5)
ax.arrow(22.5, 5, -16.5, 0, head_width = 0.5)
ax.text(11.5, 6, "Рабочая область")
ax.set_title('Характеристики насосного агрегата')
ax.plot(Q2s, [Напор(Q) for Q in Q2s], color = 'blue', label = 'Напорная характеристика')
ax.plot(Q1s, НХs, '--', color = 'blue')
ax.set_xlabel('$Q,\,м^3/ч$'); ax.set_ylabel('$H,\,м$')
ax.set_xlim(0., 50); ax.set_ylim(0., 35); ax.grid();
ax2 = ax.twinx();
ax2.plot(Q2s, [КПД(Q)for Q in Q2s], label = 'КПД', color = 'red');
ax2.plot(Q1s, [КПД(Q)for Q in Q1s], '--', color = 'red');
ax2.set_ylim(0, 60);
ax2.set_ylabel('$\eta,\ \%$');
plt.axvline(x = 5, color = 'grey')
plt.axvline(x = 27.5, color = 'grey')
# Объединение легенд двух графиков в одну общую
h1, l1 = ax.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax.legend(h1+h2, l1+l2);
Штриховой линией показаны участки, полученные экстраполяцией данных производителя насоса. Левая граница рабочего диапазона (5 м3/ч) лимитирована минимальным расходом жидкости, необходимым для охлаждения уплотнений, правая (27,5 м3/ч) - мощностью электродвигателя.
Электрическая мощность, потребляемая электродвигателем насоса ($P$, Вт) находится по формуле:
$$P = \rho g H q / \eta,$$где $\rho$ - плотность перекачиваемой жидкости ($\rho = 998.2\ кг/м^3$ для воды при $t = 20\ ^\circ C$); $g=9.81\ м/с^2$ - ускорение свободного падения; $H$ - напор насоса, м; $q = Q / 3600$ - объёмный расход, $м^3/с$; $Q$ - объёмный расход, $м^3/ч$; $\eta$ - КПД насосного агрегата.
Qs = np.linspace(0.1, 45)
g = 9.81 # ускорение свободного падения, м/с2
dens = 998.2 # прлотность воды при t = 20 С, кг/м3
# Функция вычисления потребляемой электродвигателем мощности
def calcP(Qs):
return dens * g * np.array([Напор(Q) * Q / КПД(Q) * 100 for Q in Qs]) / 3600
Ps = calcP(Qs)
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_title('Потребляемая электродвигателем мощность')
ax.plot(Qs, Ps / 1000)
ax.set_xlabel('$Q,\,м^3/ч$'); ax.set_ylabel('$P,\,кВт$')
ax.set_xlim(0., 50); ax.set_ylim(1.5, 3.5); ax.grid();
# Потребляемая мощность на левой и правой границе рабочего диапазона, Вт
calcP([5, 27.5])
array([2006.0700625 , 2775.01975552])
Напор насоса расходуется на преодоление сил трения, возникающих при движении жидкости в трубопроводе, на преодоление местных сопротивлений (сужение, расширение, поворот потока) и на приведение жидкость в движение (на создание динамического давления).
$$\Delta H = \left(\frac{\lambda l}{d} + \zeta + 1\right) \frac{w^2}{2g} \quad \quad (1)$$$\Delta H$ - потеря напора, м; $\lambda$ - коэффициент сопротивления трения единицы относительной длины (коэффициент гидравлического трения); $l$ - длина трубы, м; $d$ - внутренний диаметр трубы, м; $\zeta$ - коэффициент местного сопротивления (сумма всех коэффициентов местного сопротивления); $w$ - скорость движения жидкости, м/с; $g = 9.81\ м/с^2$ - ускорение свободного падения.
В момент пуска $l = 0,\ 𝜁 = 0$, поэтому напор насоса полностью затрачивается на создание динамического давления. $H = H_{дин} = \Delta H_{вых} = w^2/(2g)$
Скорость жидкости $w=Q/(3600F)$, где $F$ - площадь проходного сечения напорного патрубка насоса: $F = \pi d^2/4$, где $d = 50\ мм$ - внутренний диаметр напорного патрубка.
Построим зависимоть $H_{дин}$ от расхода $Q$.
from math import pi
d = 50 * 1e-3 # диаметр 50 мм
F = pi * d * d / 4 # площадь сечения
ws = Q1s / 3600 / F # скорость жидкости
dHs = 1 / 2 / g * ws ** 2 # потери давления с выходной скоростью
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_title('Потери с выходной скоростью для d = 50 мм')
ax.plot(Q1s, dHs, label = 'Динамическое давление жидкости')
ax.set_xlabel('$Q,\,м^3/ч$'); ax.set_ylabel('$H_{дин},\,м$')
ax.set_xlim(0., 50); ax.set_ylim(0, 2.5); ax.grid();
ax2 = ax.twinx();
ax2.plot(Q1s, ws, color = 'red', label = 'Скорость жидкости')
ax2.set_ylabel('$w,\,м/с$')
ax2.set_ylim(0, 8)
# Объединение легенд двух графиков в одну общую
h1, l1 = ax.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax.legend(h1+h2, l1+l2);
Рабочая точка насоса при работе на сеть - это точка пересечения напорной характеристики насоса с характеристикой гидравлической сети. В момент пуска характеристикой сети является зависимость потери напора насоса с выходной скоростью от расхода.
from scipy.optimize import newton
# Найдём значение расхода в точке пересечения напорной характеристики
# с характеристикой сети
Q_р = newton(lambda Q: Напор(Q) - interp1d(Q1s, dHs)(Q), 44)
Q_р # м3/ч
44.09682198187218
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_title('Рабочая точка насоса без нагрузки')
ax.plot(Q1s, НХs, label = 'Напорная характеристика насоса')
ax.plot(Q1s, dHs, label = 'Динамическое давление жидкости')
ax.plot(Q_р, Напор(Q_р), '*', color = 'red', label = 'Рабочая точка')
ax.set_xlabel('$Q,\,м^3/ч$'); ax.set_ylabel('$H,\ H_{дин},\,м$')
ax.set_xlim(0., 50); ax.set_ylim(0, 32); ax.grid();
ax.legend();
# Рабочая точка насоса без нагрузки [Q (м3/ч), H (м)]
Q_р, float(Напор(Q_р))
(44.09682198187218, 1.9837641150571343)
По мере заполнения трубопровода к потере напора с выходной скоростью прибавляются всё большие значения потерь от трения и потерь на преодоление местных сопротивлений (растут величины l и 𝜁 в формуле (1)), крутизна параболы (характеристики гидравлической сети) увеличивается и рабочая точка (точка пересечения напорной характеристики насоса с характеристикой сети) начинает двигаться вверх-влево по напорной характеристике насоса.
Присоединим к напорному патрубку насоса трубопровод длиной 150 м с внутренним диаметром 50 мм и посмотрим, как будут меняться параметры системы насос + труба + вода в течении времени после пуска насоса.
from hydrcalc import calc_lambda # см [1]
help(calc_lambda)
Help on function calc_lambda in module hydrcalc: calc_lambda(w, D, Delta=0, kvisc=1e-06, quadr=False) Расчёт коэффициента сопротивления трения единицы относительной длины трубы w: скорость потока, м/с D: внутренний диаметр трубы, м Delta: абсолютная шероховатость, м (по умолчанию - отсутствие шероховатости, гладкая труба) kvisc: кинематическая вязкость, м2/с (по умолчанию - вязкость воды при 20 С) quadr: False (по умолчанию) - не происходит смены формулы при Re>560/delta, True - при Re>560/delta применяется формула для квадратичного закона сопротивления
ш = 0.02e-3 # абсолютная шероховатость внутренней поверхности труб (0,02 мм)
# Функция нахождения Q по H для напорной характеристики
Q_H = interp1d(НХs, Q1s, kind = 'cubic')
# Функция нахождения скорости (м/с) по расходу (м3/ч)
def calc_w(Q):
return Q / F / 3600
# Функция расчёта потери напора (давления)
def calc_dH(lamb, l, Q):
w = calc_w(Q)
return (1 + lamb * l / d) * w * w / 2 / g
t = 0; ts = [0.] # время, с
dt = 0.1 # шаг интегрирования по времени, с
L =150. # длина трубопровода, м
# длина трубы, заполненная жидкостью
l = 0.; ls = [0.]
Q = Q_р; Qs = [Q_р]
w = calc_w(Q); ws = [calc_w(Q)]
#w0 = w
dH = w * w / 2 / g; dHs = [dH]
lambs = [float('NaN')]
I = 0
w
6.238424171607383
V = 0 # объём воды, прокаченный насосом
while l < L:
l += w * dt;
lamb = calc_lambda(w, d, ш)
Q = newton(lambda x: Напор(x) - calc_dH(lamb, l, x), Qs[-1])
w = calc_w(Q);
ls.append(l)
lambs.append(calc_lambda(w, d, ш))
Qs.append(Q)
dHs.append(Напор(Q))
V += Q * dt
ws.append(w)
I += 1
t = I * dt; ts.append(t)
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2,1, figsize = (8, 8))
data =[ws, ls, dHs, Qs]
ylabels = ['$w,\ м/с$', '$l,\ м$', '$\Delta H,\ м$', '$Q,\ м^3/ч$']
labels = ['Скорость $w$', 'Заполнение $l$', 'Сопротивление $\Delta H$', 'Расход $Q$']
for i, ax in enumerate(axes):
ax.set_xlabel('$t, секунды$'); ax.set_ylabel(ylabels[i*2])
ax.plot(ts, data[i*2], label = labels[i*2])
ax.grid(); ax.set_xlim(0, t); ax.set_ylim(0, )
ax2 = ax.twinx();
ax2.plot(ts, data[i*2+1], color = 'green', label = labels[i*2+1])
ax2.set_ylim(0, )
ax2.set_ylabel(ylabels[i*2+1])
# Объединение легенд двух графиков в одну общую
h1, l1 = ax.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax.legend(h1+h2, l1+l2, loc = 4);
# Проверка: объём воды прокаченной насосом должен равняться
# внутреннему объёму трубопровода
V /= 3600 # объём воды, прокаченный насосом, м3
V, F * L # F * L - внутренний объём трубы, м3
(0.29438611996372493, 0.2945243112740431)
Ps = calcP(Qs) # Потребляемая мощность в зависимости от подачи
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_title('Потребляемая электродвигателем мощность')
ax.plot(ts, Ps / 1000)
ax.set_xlabel('$t,\,секунды$'); ax.set_ylabel('$P,\,кВт$')
ax.set_xlim(0., ts[-1]); ax.set_ylim(2.4, 3.2);
ax.grid();
# Потребляемая мощность в момент пуска и максимальная потребляемая мощность, Вт
Ps[0], max(Ps)
(2662.2623399233153, 3124.626588439659)
Максимальная мощность в нашем примере составила 3,12 кВт, что нужно учитывать при подборе электродвигателя.
При пуске насоса на закрытую задвижку подача изменяется от нулевого до рабочего значения. Если рабочая точка выбрана внутри рабочей области (в диапазоне подач от 5 $м^3/ч$ до 27,5 $м^3/ч$), то потребляемая электродвигателем насоса мощность не превысит 2,8 кВт.
Таким образом, насос предназначенный для пуска на открытую задвижку должен комплектоваться более мощным электродвигателем по сравнению с насосом, который всегда будет пускаться на закрытую задвижку.
Инженерные расчёты на Python, С.В. Медведев, 2020-2023
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020-2023