Q_max = 55; Q_min = 35 # диапазон регулирования расхода
F0 = 1 / 50 # относительная начальная пропускная способность РК
Q_ном = 50 # номинальное значение расхода при котором были расчитаны потери давления в [1], м3/ч
# Потери давления при расходе 50 м3/ч
dH_new = 20.681929759214405 # новый трубопровод, м
dH_old = 24.951257840805834 # старый (изношенный) трубопровод, м
# максимальное и минимальное значение нивелирной составляющей (зависит от уровня воды в баке А)
dz_max = 18; dz_min = 9
density = 998.2 # плотность воды при температуре 20 С
Изменим условия задачи из [1]. Насос работает постоянно, его подача должна регулироваться в диапазоне [$Q_{min}; Q_{max}$]. Регулирование расхода может осуществляться либо с помощью частотно-регулируемого привода (ЧРП) либо установкой в линии регулирующего клапана (РК). Рассмотрим вариант с РК (1 на рисунке). Величина расхода измеряется расходомером (2 на рисунке). Примем, что расходомер имеет нулевое гидравлическое сопротивление.
В [2] приведены расходные характеристики регулирующих клапанов с диапазоном регулирования $Д=50$ (относительная начальная пропускная способность РК $\Phi_0 = 1/50=0.02$) и различными типами пропускных характеристик.
Выберем РК с равнопроцентной пропускной характеристикой (третий график в [2]) со значением авторитета 0,1. При выборе величины авторитета РК следует иметь в виду, что чем больше значение авторитета РК тем с большей величиной напора потребуется насос для решения поставленной задачи. Насос с большим напором будет потреблять больше электроэнергии в течение всего срока службы системы. При маленьком значении авторитета РК имеет низкую чувствительность в области положения штока около h=1. Подробнее см. в [2].
Из [1] возьмём данные о гидравлическом сопротивлении соединяющего два бака трубопровода.
m = 0.1 # авторитет РК 10%
dH_cv = dH_old / (1 - m) * m # перепад давления на РК (м) при расходе Q_ном
import sys
sys.path.append("../0029_Расчёт_параметров_РК")
from controlvalve import ControlValve as CV # описание класса ControlValve см. в [3]
dp_cv = CV.dH2dp(dH_cv, density) # перевод перепада давления на РК при расходе Q_ном из метров в Па
#Найдем условную (максимальную) пропускную способность РК
Kvs_calc = CV.Kv_from_dp_cv_Q(dp_cv, Q_ном, density) # расчётное значение Kvs
Kvs_calc # м3/ч
95.89251280553334
В Таблице 1 в [4] ближайшим большим к полученному расчётному значению $K_{Vs}$ является $K_{Vs}=100$ $м^3/ч$.
При решении практических задач следует помнить, что существует производственный допуск на значение $K_{Vs}$ РК. В [6] сказано, что для РК с равнопроцентной пропускной характеристикой отклонение от номинального значения условной пропускной способности не должно превышать $\pm 15 \%$.
В контексте нашего случая это означает, что фактическое значение условной (максимальной) пропускной способности РК с номинальным $K_{Vs}=100\ м^3/ч$ может лежать в диапазоне
Kvs = 100
Kvs_н = Kvs * (1 - 0.15); Kvs_в = Kvs * (1 + 0.15)
print(f"[{Kvs_н}; {Kvs_в}] м3/ч")
[85.0; 114.99999999999999] м3/ч
#Создадим два объекта РК для крайних значений Kvs
cv_н = CV(Kvs_н, 1, F0, density=density) # РК_н - РК с нижним крайним значением Kvs
cv_в = CV(Kvs_в, 1, F0, density=density) # РК_в - РК с верхним крайним значением Kvs
С течением времени характеристики насоса ухудшаются, его подача уменьшается при неизменном гидравлическом сопротивлении сети - происходит деградация напорной характеристики насоса. Графически деградация напорной характеристики насоса выражается в смещении напорной характеристики насоса вниз. Т. к. расход $Q_{max}$ должен обеспечиваться в течение всего срока службы насоса, то насос должен быть выбран таким образом, чтобы он и в изношенном состоянии обеспечивал подачу $Q_{max}$.
Таким образом РК и насос должны быть подобраны таким образом, чтобы удовлетворялись следующие условия:
import sys
sys.path.append("../0015_Моделирование_гидравлической_сети")
from pipeline import Pipeline # класс моделирующий гидравлическую сеть (см.[7])
dp_cv_н = cv_н.dp_from_Q(Q_ном) # перепад навления на открытом РК_н (Па) при расходе Q_ном
dH_cv_н = CV.dp2dH(dp_cv_н, density) # перевод в м
ppln_old_cv_н = Pipeline(Q_ном, dH_old + dH_cv_н) # характеристика старого трубопровода с полностью открытым РК_н
#Напор насоса при котором расход равен Q_max при условии полностью открытого РК_н,
#старых трубах и минимальном уровне в баке А
H_Q_max = ppln_old_cv_н.dH_Q(Q_max, dz_max)
H_Q_max
52.460422048632125
Необходимо создать модели напорных характеристик для нового и изношенного насоса. Через рабочую точку [Q_max; H_Q_max] должна проходить напорная характеристика изношенного насоса.
#Моделирование напорной характеристики насоса
from scipy.interpolate import interp1d # интерполяция/экстрополяция
import numpy as np # работа с массивами
#Вид напорной характеристики может быть любой, но она должна проходить через точку [Q_max, H_Q_max]
#В данном случае напорную характеристику представим прямой линией, проходящей через две заданные точки
#Точки лежащие на напорной характеристики изношенного насоса
#Qs_pump = np.array([45, Q_max]) # подача
Qs_pump = np.array([0, Q_max]) # подача
Hs_pump_old = np.array([1.2 * H_Q_max, H_Q_max]) # напор
#Напорная характеристика изношенного насоса
f_pump_old = interp1d(Qs_pump, Hs_pump_old, kind = 'linear', fill_value = 'extrapolate')
Примем величину деградации напорной характеристики насоса за весь срок службы 10%.
degrad = 0.1 # деградация напорной характеристики
Hs_pump = Hs_pump_old / (1 - degrad) # при тех же Qs_pump значение нового напора будет в 1/(1-degrad) больше
#Напорная характеристика нового насоса
f_pump_new = interp1d(Qs_pump, Hs_pump, kind = 'linear', fill_value = 'extrapolate')
H_Q_min = f_pump_new(Q_min) # Напор нового насоса при котором Q = Q_min
#характеристика сети, проходящая через [Q_min; H_Q_min] при условии новых труб и максимальном уровне в баке А
ppln_hmin = Pipeline(Q_min, H_Q_min - dz_min)
print(H_Q_min, "м")
62.52858385594536 м
#Находим перепад давления на РК при h = h_min, метры водяного столба
ppln_new = Pipeline(Q_ном, dH_new) # гидравлическая характеристика нового трубопровода без РК
dH_cv_h_min = ppln_hmin.dH_Q(Q_min) - ppln_new.dH_Q(Q_min)
dH_cv_h_min # метры
43.3944382739303
#Перевод метров в Па
dp_cv_h_min = CV.dH2dp(dH_cv_h_min, density)
dp_cv_h_min # Па
424788.0707764603
#Минимальное положение штока РК_в при котором при новом насосе, новых трубах и
#максимальном уровне в баке А расход будет Q_min
h_min = cv_в.h_from_dp_cv_Q(dp_cv_h_min, Q_min)
h_min
0.5108170437708826
#Данные для построения графика
Qs, Hs_hmin = ppln_hmin.get_curve(0, 70, dz_min)
Qs, Hs_l_cv = ppln_old_cv_н.get_curve(0, 70, dz_max)
import matplotlib.pyplot as plt # библиотека для построения графиков
plt.rcParams['font.size'] = 12.0 # размер шрифта для всех графиков
fig, ax = plt.subplots(figsize = (10,5))
ax.grid(); ax.set_xlim(0,70); ax.set_ylim(0,70)
ax.plot(Qs, Hs_l_cv, label = "Мин. уровень в баке А + старые трубы + открытый РК_н")
ax.plot(Qs, Hs_hmin, label = "Макс. уровень в баке А + новые трубы + РК_в с $h=h_{min}$")
ax.plot(Qs, f_pump_new(Qs), label = "Напорная характеристика нового насоса")
ax.plot(Qs, f_pump_old(Qs), label = "Напорная характеристика изношенного насоса")
ax.plot(Q_min, H_Q_min,'o', color = 'navy', label = "Граничные точки")
ax.plot(Q_max, H_Q_max,'o', color = 'navy')
ax.set_xlabel('$Q,\, м^3/ч$'); ax.set_ylabel('$H,\, м$')
ax.legend();
При любом режиме работы и состоянии сети расход в диапазоне [35; 55] $м^3/ч$ будет обеспечивается положением штока РК в диапазоне [h_min; 1].
Следует заметить, что в левой граничной точке перепад давления на РК будет один и тот же вне зависимости от фактического значения $K_{Vs}$ РК. Это достигается разными положениями штоков у РК_н и РК_в.
cv_н.h_from_dp_cv_Q(dp_cv_h_min, Q_min), cv_в.h_from_dp_cv_Q(dp_cv_h_min, Q_min)
(0.5880867508900642, 0.5108170437708826)
Самый опасный с точки зрения возможности возникновения кавитации режим работы РК - это режим работы при котором на РК возникает наибольший перепад давления. Данный режим возникает при условии нового насоса, новых труб, максимальном уровне в баке А и положении штока РК $h=h_{min}$ (левая граничная точка на рисунке выше).
У РК с одноступенчатой редукцией кавитация отсутствует если выполнено следующее условие: $$K = \frac{p_1-p_2}{p_1 - p_{нас}} = \frac{\Delta p_{рк}}{p_1 - p_{нас}} \le 0.6$$ $p_1$ - давление перед РК, $p_2$ - давление за РК, $p_{нас}$ - давление насыщенного пара при температуре перекачиваемой воды, $\Delta p_{рк}$ перепад давления на РК. Чем выше значение $p_1$ при неизменном $\Delta p_{рк}$ тем меньше значение коэфициента $K$, а значит, тем лучше условия для обеспечения безкавитационной работы.
Давление перед РК зависит среди прочего от места установки РК. $$p_1 = p_{вс} + H - \Delta p + \Delta z$$ $p_{вс}$ - давление на всасе насоса, $H$ - напор насоса, $\Delta p$ - потери давления в линии от бака А до РК, $\Delta z$ - нивелирная составляющая (разница между высотным положением входного патрубка насоса и высотным положением РК).
Рассмотрим самый неблагоприятный с точки зрения отсутствия кавитации случай: когда РК расположен в самой высокой точке сети - на высоте $z_Б^{max}$ (см. рисунок в начале статьи) в непосредственной близости к баку Б.
Из [1] возьмём данные о высотных положениях элементов сети.
z_А = 25 # отметка дна бака А относительно уровня моря, м
z_Б = 27 # отметка дна бака Б относительно уровня моря, м
z_А_max = 10 # уровень воды в баке А при котором начинается откачка, м
z_А_min = 1 # уровень воды в баке А при котором заканчивается откачка, м
z_Б_max = 17 # отметка входного штуцера бака Б, м
dz = (z_А + z_А_min) - (z_Б + z_Б_max) # нивелирная составляющая, м
H_вс = z_А_max - z_А_min # подпор насоса на всасе, м (изб)
При $t=20$ C $p_{нас}=2339.2$ Па (см. [5])
p_нас = 2339.2 # давление насыщенного пара при t=20 C, Па
R_new = dH_new / Q_ном / Q_ном # гидравлическое сопротивление нового трубопровода (см. [7])
# Находим потери давления в трубопроводе при Q_min и переводим из м в Па
dp_new = CV.dH2dp(R_new * Q_min * Q_min, density)
dz = CV.dH2dp(dz, density) # переводим нивелирную составляющую из м в Па
p_вс = CV.dH2dp(H_вс, density) + 101325 # переводим подпор насоса из м (изб) в Па (абс)
H = CV.dH2dp(H_Q_min, density) # напор насоса в левой граничной точке, Па
p1 = p_вс + H - dp_new + dz # давление перед РК, Па
#Проверка - результат выражения должен быть 101325 Па
p1 - dp_cv_h_min
101324.99999999994
K = dp_cv_h_min / (p1 - p_нас) # проверка на кавитацию
K
0.8110142457979814
$K > 0.6$ означает, что при условии новых труб, нового насоса и высокого уровня в баке А при прикрытии одноступенчатого РК, с целью снижения расхода перекачиваемой воды до $Q_{min}$, возникает кавитация.
Выходом из данной ситуации может являться:
Посмотрим, что изменится если установить РК сразу за насосом. Для упрощения примем, что потери в трубопроводе происходят за РК и потери давления на участке между баком А и РК отсутствуют.
p1 = p_вс + H # давление перед РК
K = dp_cv_h_min / (p1 - p_нас)
K
0.531530594030748
$K < 0.6$, значит при любых режимах работы и состоянии системы РК сможет в бескавитационном режиме работы обеспечить регулирование расхода в диапазоне [$Q_{min}; Q_{max}$].
Построим две расходные характеристики:
Для первого случая ранее был определён расход и напор насоса при полностью открытом РК_н: Q_max и H_Q_max соответственно.
Q_max_н = Q_max; H_Q_max_н = H_Q_max
dp_cv_в = cv_в.dp_from_Q(Q_ном) # падение давления на открытом РК_в при расходе Q_ном
dH_cv_в = CV.dp2dH(dp_cv_в, density) # перевод Па в метры водяного столбв плотностью density
ppln_new_cv_в = Pipeline(Q_ном, dH_new+dH_cv_в) #характеристика нового трубопровода с открытым РК_в
Найдём точку пересечения характеристики трубопровода с напорной характеристикой нового насоса
from scipy.optimize import newton # ищет решение (Q) уравнения f(Q) = 0
# Функция f(Q) = 0
def f(Q, pump, ppln, z_min):
# Функция возвращает 0 при Q при котором пересекаются напорная характеристика
# насоса и характеристика сети
# pump, ppln, dz_min - дополнительные аргументы, передаваемые в newton параметром args=(pump, ppln, dz_min)
# pump - напорная характеристика насоса: pump(Q) возвращает напор (H) для заданной подачи (Q)
# ppln - характеристика сети: возвращает требуемый напор насоса (H) для заданного расхода (Q)
# dz_min - H из которого выходит характеристика сети
return pump(Q) - ppln.dH_Q(Q, dz_min)
Q_max_в = newton(f, Q_max, args=(f_pump_new, ppln_new_cv_в, dz_min)) # Q-координата точки пересечения
H_Q_max_н = f_pump_new(Q_max_в) # H-координата точки пересечения
print(f"Q_н = {Q_max_в} м3/ч, H_н = {H_Q_max_н} м")
Q_н = 71.20564210053797 м3/ч, H_н = 54.85438884529507 м
#Для использования метода get_char класса ControlValve необходимо знать значение авторитета РК
m_н = dH_cv_н / (dH_old + dH_cv_н) # авторитет РК_н
m_в = dH_cv_в / (dH_new + dH_cv_в) # авторитет РК_в
m_н, m_в
(0.12389285468506152, 0.08525729478709909)
#Данные для построения расходных характеристик РК
hs, Qs_н, _ = cv_н.get_char(Q_max_н, m_н) # расходная характеристика РК_н
hs, Qs_в, _ = cv_в.get_char(Q_max_в, m_в) # расходная характеристика РК_в
fig, ax = plt.subplots(figsize = (10,5))
ax.set_title("Границы рабочей области РК")
ax.grid(); ax.set_xlim(0,1); ax.set_ylim(0,82)
ax.plot(hs, Qs_н, label = "РК_н + мин. уровень в баке А + старые трубы + изношенный насос")
ax.plot(hs, Qs_в, label = "РК_в + макс. уровень в баке А + новые трубы + новый насос")
ax.set_xlabel('$\overline{h}$'); ax.set_ylabel("$Q,\, м^3/ч$")
ax.legend();
print((interp1d(Qs_в, hs, kind='cubic')(Q_min) - h_min) / h_min * 100, "%")
4.869417928217559 %
Разница между ранее найденным значением h_min и значением h_min из расходной характеристики объясняется тем, что при построении расходной характеристики не учитывавается увеличение напора насоса при уменьшении его подачи. Влияние наклона напорной характеристики насоса на форму расходной характеристики РК рассмотрено в [8].
Инженерные расчёты на Python, С.В. Медведев, 2020-2021
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020-2021