Система водоснабжения с водонапорной башней
Моделирование системы водоснабжения
Приведенная модель системы водоснабжения состоит из водонапорной башни высотой 10 м и подкачивающего центробежного насоса, приводимого асинхронной электрической машиной, питающейся от трехфазной сети 400В/50 Гц. При открытии заслонки (имитация расхода на потребителя) Уровень воды в башне начинает понижаться с начального значения 10 м. По достижении уровня воды в баке ниже отметки 9 м происходит замыкание контактов трехфазного выключателя, центробежный насос включается и компенсирует израсходованный объем воды.
modelName = "WaterSupply"
if !(modelName in [m.name for m in engee.get_all_models()]) engee.load( "$(@__DIR__)/$(modelName).engee"); end;
data = engee.run( modelName )

Построим графики выходных величин
# Так как время симуляции достаточно большое (250 с), строим графики с прореживанием
# 1. Задаем параметры времени
step_sec = 1.0
t_max = 250.0
# Массив секунд для оси X (0, 1, 2 ... 250)
target_times = 0.0:step_sec:t_max
# 2. Находим общее количество строк в исходных данных
# Загружаем один массив, чтобы узнать, сколько всего шагов сделала симуляция
raw_throttle = collect(WorkspaceArray{Float64}("$(modelName)/Throttle"))
total_rows = size(raw_throttle, 1)
# Вычисляем индексы строк, которые равномерно распределены от 1 до конца таблицы на 251 точку
indices = round.(Int, range(1, total_rows, length=length(target_times)))
# 3. Загружаем данные из WorkspaceArray и СРАЗУ фильтруем их по индексам
df_throttle = raw_throttle[indices, :]
df_power = collect(WorkspaceArray{Float64}("$(modelName)/Активная мощность (о.е.)"))[indices, :]
df_speed = collect(WorkspaceArray{Float64}("$(modelName)/Скорость ротора (о.е.)"))[indices, :]
df_q1 = collect(WorkspaceArray{Float64}("$(modelName)/Расходомер-1/Q1"))[indices, :]
df_q2 = collect(WorkspaceArray{Float64}("$(modelName)/Расходомер/Q2"))[indices, :]
df_fluid = collect(WorkspaceArray{Float64}("$(modelName)/FluidLevel"))[indices, :]
df_current = collect(WorkspaceArray{Vector{Float64}}("$(modelName)/iABC/Ток по фазам"))
raw_current_time = df_current.time
# 4. Строим 4 графика с привязкой к оси времени в секундах
p1 = plot( target_times, [df_throttle.value], title="Площадь отверстия истечения (открытие задвижки) (м²)" )
p2 = plot( raw_current_time, reduce(hcat, df_current.value)', title="Ток в обмотках (А)", xlims=(101.9, 102.0), ylims=(-15, 15))
p3 = plot( target_times, [df_power.value])
plot!( target_times, [df_speed.value], title="Активная мощность и скорость ротора (отн.ед.)" )
p4 = plot( target_times, [df_q1.value*(-1)])
plot!( target_times, [df_q2.value*(-1)], title="Расход потребителя и расход насоса (л³/мин)", ylims=(0.0,1200) )
p5 = plot( target_times, [df_fluid.value], title="Уровень воды в башне", xlabel="Время, с" )
# 5. Сборка финального полотна
plot( p1, p2, p3, p4, p5, layout=(5,1), leg=false, size=(1200,600), titlefont=font(10) )
Заключение
Модель, в зависимости от потребного расхода для потребителей, высоты и емкости водонапорной башни, позволяет подобрать центробежный насос с напорно-расходной характеристикой и рабочей точкой в зависимости от сопротивления сети. Затем, в зависимости от подобранного насоса, имеется возможность подобрать электродвигатель и рассчитать параметры энергопотребления системы водоснабжения.