Рассмотрим следующую схему системы теплоснабжения.
Для недопущения возникновения низкотемпературной коррозии элементов котла необходимо, чтобы температура поверхностей теплообмена со стороны продуктов сгорания была выше температуры конденсации содержащегося в продуктах сгорания водяного пара (см. [1]).
Насос рециркуляции предназначен для поддержании температуры воды на входе в котёл (или котёл-утилизатор) не менее заданного значения путём подачи нагретой в котле воды на его вход.
Требуемую подачу насоса рециркуляции можно найти по упрощённой формуле (в точной формуле вместо температур используются энтальпии): $$Q_р = Q_с \frac{t_ц - t_о}{t_п - t_ц}$$ где $Q_р,\ Q_с$ - расход в линии рециркуляции и в линии сетевого насоса (потребителя) соответственно, $t_ц$, $t_о$, $t_п$ - целевое значение теплоносителя на входе в котёл, температура обратной сетевой воды, температура прямой сетевой воды соответственно.
Расход через котёл составит $Q_к = Q_с + Q_р$
Расход через потребителя поддерживается постоянным с помощью РКс, тепловая нагрузка регулируется изменением температуры прямой сетевой воды (качественный метод регулирования). Расход в линии рециркуляции регулируется изменением сопротивления РКр.
Примем, что расход через потребителя (подача сетевого насоса) постоянен, составляет $Q_с=100\ м^3/ч$, и при данном расходе потери давления в ветке котла равны $dH_к=5$ м, а на потребителе $dH_п=40$ м.
Q_с = 100 # м3/ч
dH_к = 5 # перепад давления на котле при расходе через него Q_с, м
dH_п = 40 # потери давления на потребителе при Q_с, м
$R = dH / Q^2$ - формула для определения гидравлического сопротивления (см. [2])
# Гидравлическое сопротивления котла
R_к = dH_к / Q_с / Q_с
R_к #, м/(м3/ч)^2
0.0005
Примем, что максимально возможный расход в линии рециркуляции равен 50 $м^3/ч$.
Q_р_макс = 50 # максимальный расход в линии рециркуляции, м3/ч
Q_к_макс = Q_с + Q_р_макс # максимальный расход через котёл, м3/ч
dH_к_макс = R_к * Q_к_макс ** 2 # падение давления на котле при расходе Q_с + Q_р_макс, м
dH_к_макс #, м
11.25
Пусть РКс и РКр имеют равнопроцентную пропускную характеристику и авторитет a = 0,1 (см. [3]).
Для подбора РКс и РКр необходимо определиться с перепадом давления, относительно которого задан авторитет. Через котёл идёт поток, создаваемый двумя параллельно включёнными насосами. Распределим "ответственность" за перепад давления на котле между двумя ветками насосов.
$$dH_к = R_к(Q_с+Q_р)^2=R_к \left((Q_с^2 + Q_с Q_р)+(Q_с Q_р + Q_р^2)\right) = dH_к^с+ dH_к^р$$$$dH_к^с = R_к(Q_с^2 + Q_с Q_р)$$$$dH_к^р = R_к(Q_с Q_р + Q_р^2)$$# Перепад давления на котле от сетевого насоса (от Q_с)
dH_к_с = R_к * (Q_с * Q_с + Q_с * Q_р_макс)
# Перепад давления на котле от рециркуляционного насоса (от Q_р)
dH_к_р = R_к * (Q_с * Q_р_макс + Q_р_макс * Q_р_макс)
dH_к_с, dH_к_р, dH_к_с + dH_к_р #, м
(7.5, 3.75, 11.25)
a = 0.1 # авторитет РК
dH_рк_с = a / (1 - a) * (dH_п + dH_к_с) # перепад давления на открытом РКс при Q_с, м
dH_с = dH_п + dH_рк_с # Падение давления в линии сетевого насоса при Q_с, м
dH_с
45.27777777777778
H_с_Q_с = dH_к_макс + dH_с # напор сетевого насоса при Q_с, м
H_с_Q_с #, м
56.52777777777778
# Перепад давления на открытом РКр при Q_р_макс, м
dH_рк_р = a / (1 - a) * dH_к_р
dH_р = dH_рк_р # Падение давления в линии сетевого насоса при Q_р_макс, м
dH_р
0.4166666666666667
# Рабочая точка сетевого насоса
Q_с, H_с_Q_с # (м3/ч, м)
(100, 56.52777777777778)
Т.к. $Q_с$ постоянен, то точка [Q_с; H_с_Q_с] на напорной характеристике должна соответствовать максимальному КПД насоса (предположим, что такая точка находится в середине рабочего диапазона сетевого насоса).
H_р_Q_р_макс = dH_р + dH_к_макс # напор рециркуляционного насоса при Q_р_макс, м
H_р_Q_р_макс #, м
11.666666666666666
# Рабочая точка рециркуляционного насоса
Q_р_макс, H_р_Q_р_макс # (м3/ч, м)
(50, 11.666666666666666)
Рабочая точка [Q_р_макс; H_р_Q_р_макс] - это правая граница напорной характеристики рециркуляционного насоса, т.к. расход в линии рециркуляции может быть только меньше или равным Q_р_макс. Для надёжности "отодвинем" правую границу рабочего диапазона рециркуляционного насоса до Q_р_макс/0,9 (создадим на правой границе запас в 10%).
Для графического представления режимов работы насосов системы теплоснажения необходимо иметь в наличии напорные характеристики сетевого и рециркуляционного насосов. Мы не будем подбирать насосы, соответствующие приведённым выше параметрам, а сами смоделируем напорные характеристики.
Примем:
Q_р_пр = Q_р_макс / 0.9 # правая граница напорной характеристики РН, м3/ч
Q_р_лев = 0.1 * Q_р_пр # левая граница напорной характеристики РН, м3/ч
dH = 5. # разница в напорах на границах, м
# Напор на левой границе РН, м
H_р_лев = H_р_Q_р_макс + dH * (Q_р_макс - Q_р_лев) / (Q_р_пр - Q_р_лев)
H_р_пр = H_р_лев - dH # напор на правой границе РН, м
H_р_лев, H_р_пр
(16.11111111111111, 11.11111111111111)
Q_с_пр = Q_с / ((0.1 + 1) /2) # правая граница СН
Q_с_лев = 0.1 * Q_с_пр # левая граница СН
Q_с_лев, Q_с_пр, (Q_с_лев + Q_с_пр) / 2
(18.181818181818183, 181.8181818181818, 100.0)
# Наклон напорной характеристики сетевого насоса сделаем такой же как у рециркулящионного
k = dH / (Q_р_пр - Q_р_лев)
dH2 = k * (Q_с_пр - Q_с_лев) / 2
H_с_лев = H_с_Q_с + dH2 # напор на левой границе СН, м
H_с_пр = H_с_Q_с - dH2 # напор на правой границе СН, м
H_с_лев, H_с_пр
(64.70959595959596, 48.3459595959596)
import numpy as np # работа с массивами
from scipy.interpolate import interp1d # интерполяция/экстраполяция
# Напорная характеристика сетевого насоса
Напор_с = interp1d([Q_с_лев, Q_с_пр], [H_с_лев, H_с_пр])
# Напорная характеристика рециркуляционного насоса
Напор_р = interp1d([Q_р_лев, Q_р_пр], [H_р_лев, H_р_пр])
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 10.0
fig, ax = plt.subplots(figsize = (8, 4))
Qs_с = np.linspace(Q_с_лев,Q_с_пр)
Qs_р = np.linspace(Q_р_лев,Q_р_пр)
ax.plot(Qs_с, [Напор_с(Q) for Q in Qs_с], label = 'Сетевой насос')
ax.plot(Qs_р, [Напор_р(Q) for Q in Qs_р], label = 'Рециркуляционный насос')
ax.set_xlabel('$Q,\,м^3/ч$'); ax.set_ylabel('$H,\,м$')
ax.set_title('Напорные характеристики')
ax.set_xlim(0., 185); ax.set_ylim(0., 70); ax.grid(); ax.legend();
Представим схему на рис. 1 в следующем виде.
На схеме изображены три параллельные ветви. Одна ветвь пассивная - в ней имеется только гидравлическое сопротивление $R_к$ , две ветви - активные, в них кроме сопротивлений включены насосы (РН - рециркуляционный, СН - сетевой).
Так как в ветвях РН и СН установлены регулирующие клапаны (см. рис. 1), позволяющие изменять гидравлическое сопротивление ветвей, сопротивления в этих ветвях показаны переменными. При полностью открытых РКр и РКс $R_р = R_{ро}$ и $R_с = R_{со}$. При прикрытии РК происходит увеличения гидравлического сопротивления ветви и, как следствие, уменьшения расхода в ней. Сопротивление ветвей может меняться от $R_{ро}$ и $R_{со}$ соответственно до бесконечности (РК закрыт).
# Найдём гидравлические сопротивления веток СН, РН при полностью открытых РКс и РКр
# (сопротивление ветки котла было расчитано ранее)
R_со = dH_с / Q_с / Q_с # сопротивление ветки СН при открытом РКс
R_ро = dH_р / Q_р_макс / Q_р_макс # сопротивление ветки РН при открытом РКр
R_со, R_ро, R_к, # м/(м3/ч)^2
(0.004527777777777778, 0.00016666666666666666, 0.0005)
Уравнение гидравлической характеристики ветви котла при работе на неё двух параллельно подключённых насосов:
$$dH=R_к (Q_1 + Q_2)^2$$# Характеристика ветви котла, на которую работают два параллельно подключённых насоса
def fR_к(Q_1, Q_2 = 0.):
# Q_1 - расход в одной из ветви (СН или РН)
# Q_2 - расход в другой ветви (РН или СН)
return R_к *(Q_1 + Q_2) ** 2
Напор ветки РН (разница давлений на границах ветви) равен
$$H_{вр} = H_р - R_р Q_р^2$$где $H_{вр}$ - напор ветки РН при подаче $Q_р$, м; $H_р$ - напор РН при подаче $Q_р$, м; $R_р$ - сопротивление ветки РН, $м/(м^3/ч)^2$; $Q_р$ - расход в линии рециркуляции, $м^3/ч$.
# Напорная характеристика ветви рециркуляции
def Напор_вр(Q, n = 1):
# n - во сколько раз сопротивление ветки больше R_ро
return Напор_р(Q) - n * R_ро * Q * Q
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_xlabel('$Q_р,\,м^3/ч$'); ax.set_ylabel('$H,\,м$')
ax.plot(Qs_р, [Напор_р(Q) for Q in Qs_р], label = "НХ РН без $РК_р$")
Hs_вр_R1 = [Напор_вр(Q) for Q in Qs_р] # напор ветви РН при полностью открытом РКр
ax.plot(Qs_р, Hs_вр_R1, label = "НХ РН при $R_р = R_{ро}$")
ax.plot(Qs_р, [Напор_вр(Q, 20) for Q in Qs_р], label = "НХ РН при $R_р = 20\cdot R_{ро}$")
Hs_вр_R100 = [Напор_вр(Q, 100) for Q in Qs_р]
ax.plot(Qs_р, Hs_вр_R100, label = "НХ РН при $R_р = 100\cdot R_{ро}$")
ax.plot(Qs_р, [fR_к(Q_с, Q) for Q in Qs_р], label = "Характеристика ветки\nкотла ($Q_с=100\ м^3/ч$)")
ax.set_xlim(0., Q_р_пр); ax.set_ylim(0., 17); ax.grid()
ax.set_title('Ветвь рециркуляционного насоса')
ax.legend(bbox_to_anchor=(1.0, 1), loc="upper left");
НХ - напорная характеристика; синяя линия - НХ рециркуляционного насоса, оранжевая - НХ ветви РН при полностью открытом РКр, зелёная - НХ ветви РН при сопротивлении ветви РН в 20 раз больше сопротивления данной ветви при полностью открытом РКр, красная - НХ ветви РН при сопротивлении ветви РН в 100 раз больше сопротивления данной ветви при полностью открытом РКр, сиреневая - гидравлическая характеристика ветви котла при расходе через ветвь СН $Q_с = 100\ м^3/ч$. Пересечение НХ с гидравлической характеристикой ветви котла - рабочая точка данного режима работы ветви РН.
Как видно из приведённого выше графика, с помощью РКр (изменения сопротивления ветви РН) в ветви РН можно установить любой расход в диапазоне от левой границы рабочего диапазона РН до Q_р_макс.
Напор ветки СН (разница давлений на границах ветви) равен
$$H_{вс} = H_с - R_с Q_с^2$$где $H_{вс}$ - напор ветки СН при подаче $Q_с$, м; $H_с$ - напор СН при подаче $Q_с$, м; $R_с$ - сопротивление ветки СН, $м/(м^3/ч)^2$; $Q_с$ - расход в ветке СН, $м^3/ч$.
# Напорная характеристика ветви сетевого насоса
def Напор_вс(Q, n = 1):
# n - во сколько раз сопротивление ветки больше R_со
return Напор_с(Q) - n * R_со * Q * Q
# Определим на какую величину должен увеличиться перепад давления на РК_с,
# чтобы расход Q_с остался 100 м3/ч при условии Q_р = 0 м3/с.
ddH_рк_c = dH_к_макс - dH_к
ddH_рк_c #, м
6.25
# Сопротивление ветки сетеввого насоса с прикрытым РК_с
R_сп = (ddH_рк_c + dH_с) / Q_с / Q_с
# Относительное увеличение R_с при прикрытии РКс с целью снизить Q_с до 100 м3/ч при Q_р=0 м3/ч
n_сп = R_сп / R_со
n_сп
1.138036809815951
plt.rcParams['font.size'] = 10.0
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_xlabel('$Q_с,\,м^3/ч$'); ax.set_ylabel('$H,\,м$')
ax.plot(Qs_с, [Напор_с(Q) for Q in Qs_с], label = 'НХ СН без П и РК')
Hs_со = [Напор_вс(Q) for Q in Qs_с] # напор ветви СН при полностью открытом РКс
ax.plot(Qs_с, Hs_со, label = 'НХ СН + П + РК открыт')
# Напор ветви СН при прикрытом РКс (Q_с = 100 м3/ч при Q_р = 0)
Hs_сп = [Напор_вс(Q, n_сп) for Q in Qs_с]
ax.plot(Qs_с, Hs_сп, label = 'НХ СН + П + РК прикрыт')
ax.plot(Qs_с, [fR_к(0, Q) for Q in Qs_с], label = 'Характеристика ветки\nкотла ($Q_р=0\ м^3/ч$)')
ax.plot(Qs_с, [fR_к(Q_р_макс, Q) for Q in Qs_с], label = 'Характеристика ветки\nкотла ($Q_р=50\ м^3/ч$)')
ax.legend(bbox_to_anchor=(1., 1.), loc="upper left");
ax.set_title('Ветвь сетевого насоса')
ax.set_xlim(0., Q_с_пр); ax.set_ylim(0., 70); ax.grid()
Синяя линия - напорная характеристика сетевого насоса; оранжевая - НХ ветви СН при полностью открытом РКс; зелёная - НХ ветви СН, РКс прикрыт с целью установления расхода через ветвь СН $Q_с = 100\ м^3/ч$; красная - гидравлическая характеристика ветви котла при расходе через ветвь РН $Q_р = 0\ м^3/ч$; сиреневая - гидравлическая характеристика ветви котла при расходе через ветвь РН $Q_р = 50\ м^3/ч$.
Чтобы определить расход через ветвь СН при полностью открытом РКс и $Q_р = 0\ м^3/ч$, найдём точку пересечения красной и оранжевой линий.
from scipy.optimize import newton
Q = newton(lambda Q: fR_к(Q) - Напор_вс(Q), 100)
Q #, м3/ч
105.51494842321506
Таким образом, если при $Q_р = 0\ м^3/ч$ оставить РКс полностью открытым, то расход в ветви СН составит $106\ м^3/ч$ (горизонтальная координата точки пересечения оранжевой и красной линий) вместо требуемого $100\ м3/ч$. В случае отсутствия жёсткого требования по поддержанию расхода в ветви СН постоянным, РКс можно не устанавливать.
Рассмотрим работу системы с точки зрения ветви котла. На ветвь котла работают две параллельные ветви с насосами. При параллельном подключении насосов их подачи суммируются.
# Функция поиска Q по H в НХ ветви СН при открытом РКс
fQ_со_по_H = interp1d(Hs_со, Qs_с, kind = 'cubic')
# Находим напорные характеристики параллельно работающих ветвей СН и РН, РКс открыт
# 1) при открытом РКр
Hs_парал_R1 = Hs_вр_R1
Qs_парал_R1 = Qs_р + [fQ_со_по_H(H) for H in Hs_парал_R1]
# 2) при R_р = 100 * R_ро
Hs_парал_R100 = Hs_вр_R100
Qs_парал_R100 = Qs_р + [fQ_со_по_H(H) for H in Hs_парал_R100]
plt.rcParams['font.size'] = 10.0
fig, ax = plt.subplots(figsize = (8, 4))
ax.set_xlabel('$Q_к = Q_с + Q_р,\,м^3/ч$'); ax.set_ylabel('$H,\,м$')
ax.plot(Qs_с, Hs_со, label = 'НХ СН РКс открыт')
ax.plot(Qs_с, Hs_сп, label = 'НХ СН РКс прикрыт')
ax.plot(Qs_р, Hs_вр_R1, label = 'НХ РН РКр открыт')
ax.plot(Qs_парал_R1, Hs_парал_R1, label = 'НХ параллельно\nработающих\nСН РКс открыт и\n' +
'РН РКр открыт ($R_р = R_{ро}$)')
ax.plot(Qs_парал_R100, Hs_парал_R100, label = 'НХ параллельно\nработающих\nСН РКс открыт и\nРН при' +
' $R_р = 100\cdot R_{ро}$')
Qs = np.linspace(Q_р_лев, Q_с_пр)
ax.plot(Qs, [fR_к(Q) for Q in Qs], label = 'Характеристика ветки\nкотла')
ax.legend(bbox_to_anchor=(1., 1.), loc="upper left");
ax.set_title('Ветвь котла')
ax.set_xlim(0., Q_с_пр); ax.set_ylim(0., 70); ax.grid()
Для регулирования расхода в линии рециркуляции можно вместо регулирующего клапана использовать частотно-регулируемый привод (ЧРП). В этом случае следует выбрать насос, у которого максимальный КПД приходится на подачу Q_р_макс (см. [4]).
Инженерные расчёты на Python, С.В. Медведев, 2020-2023
Использование Python и Jupyter Notebook для инженерных расчётов, С.В. Медведев, 2020-2023