Кожухотрубный теплообменник
Кожухотрубный теплообменник

0. Что имеем на старте

  1. Компания L****, находясь, в непростой для себя точке решает изменить модель бизнеса и принимает решение пойти в область IT. За 10 лет компания спроектировала и запустила в работу более 900 кожухотрубных теплообменников. На базе данного опыта решено было создать облачный сервис для автоматизированного подбора и проектирования кожухотруных теплообменных аппаратов.

  2. Из первоначального штата компании (более 80 человек) в группу разработки вошли 6 человек:

    1. Инженер-конструктор 1-ой категории (есть небольшой опыт на VBA)

    2. Инженер-теплотехник 2-ой категории (без опыта программирования)

    3. Инженер-теплотехник 3-ий категории (без опыта программирования)

    4. Инженер-физик (без опыта программирования)

    5. Инженер-химик (годовой курс по Python)

    6. Инженер-математик (есть опыт программирования на PHP)

1. Подготовка

1.1. Выбор стека

Руководителем группы был выбран Инженер-математик, обладавший на тот момент наибольшим опытом программирования.

В качестве языка программирования был выбран Python по следующим ключевым причинам:

  1. Простота синтаксиса

  2. Поддержка ООП

  3. Наличие большого количества готовых прикладных библиотек

В качестве среды разработки был выбран JupiterLab, тогда еще версии 2.0:

JupiterLab 2.0
JupiterLab 2.0

В качестве базы данных выбрали MySQL, поскольку у руководителя проекта в ней тоже был опыт работы )

1.2. Первый план на полгода

Первым шагом было создание плана разработки на полгода. Создан был план в корпоративной MediaWiki:

План реализации проекта до конца 2020 года
План реализации проекта до конца 2020 года

2. Обучение Python

Поскольку навыков программирования в Python не было ни у одного члена команды мы начали с самых азов.

В качестве ориентиров были бесплатный курс по Python от Яндекса и курс лекций от Тимофея Хирьянова.

Примеры, разобранные в учебных курсах мы сразу адаптировали под задачи нашего проекта, затем совместно разбирали данную тему уже на этих адаптированных примера и выполняли самостоятельное домашнее задание, которое тоже было адаптировано под нашу тематику. В итоге у нас получилось порядка 8 уроков.

Пример из урока по функциям
# Одна или несколько переменных в функции могут быть заданы по умолчанию
# Но сначала в функции должны быть перечислены обязательные аргументы

def F(Q = 1.5, dT = 10, k = 1600):
    return Q*10**6/(k*dT)

print(F())
print(F(1.5,14))
print(F(dT=14, Q=1.5))
print(F(Q=1.5, dT=14))  # к берется по умолчанию равным 1600
print(F(Q=1.5, dT=14, k=2000))
Пример домашнего задания
# Ниже подготовлен массив свойств воды: 
# [tºС, ρ кг/м³, ср Дж/(кг×К), λ Вт/(м×К), μ н×с/м²]

WP = [
[1,1000,4218,0.564,0.001790],
[5,1000,4208,0.572,0.001549],
[10,1000,4196,0.582,0.001306],
[15,999,4191,0.591,0.001160],
[20,999,4185,0.600,0.001002],
[25,997,4183,0.608,0.000900],
[30,996,4180,0.615,0.000798],
[35,994,4180,0.622,0.000726],
[40,993,4179,0.629,0.000653],
[45,991,4180,0.635,0.000600],
[50,988,4180,0.641,0.000547],
[55,986,4172,0.646,0.000507],
[60,984,4183,0.651,0.000467],
[65,981,4186,0.656,0.000436],
[70,978,4188,0.660,0.000404],
[75,975,4192,0.664,0.000379],
[80,972,4196,0.667,0.000355],
[85,969,4201,0.670,0.000335],
[90,966,4205,0.673,0.000315],
[95,962,4211,0.676,0.000298],
[100,959,4217,0.678,0.000282],
[110,951,4230,0.682,0.000255],
[120,944,4246,0.684,0.000232],
[130,935,4265,0.685,0.000213],
[140,926,4286,0.685,0.000197],
[150,917,4310,0.684,0.000183],
[160,908,4338,0.682,0.000170],
[170,898,4369,0.679,0.000160],
[180,887,4406,0.675,0.000150],
[190,876,4447,0.669,0.000142],
[200,865,4494,0.663,0.000134],
[210,853,4548,0.656,0.000128],
[220,840,4611,0.648,0.000122],
[230,827,4683,0.639,0.000116],
[240,814,4767,0.629,0.000111],
[250,799,4865,0.618,0.000106],
[260,784,4981,0.606,0.000102],
[270,768,5120,0.592,0.000098],
[280,751,5290,0.578,0.000094],
[290,732,5490,0.562,0.000090],
[300,712,5750,0.545,0.000086]
]

print(WP[20][2])

# Задача: Написать функцию сведения теплового баланса
# с любым одним необязательным параметром

# Исходные данные (запрашиваются у пользователя)
# t1, Цельсий - температура на входе в трубное
# t2, Цельсий - температура на выходе в трубное
# T1, Цельсий - температура на входе в межтрубное
# T2, Цельсий - температура на выходе в межтрубное
# g, кг/час - расход среды в трубном
# G, кг/час - расход среды в трубном

# Вывод программы:
# t1 труб. вход = 
# t2 труб. выход = 
# T1 межтруб. вход = 
# T2 межтруб. выход = 
# g труб. = 
# G межтруб. = 
# Q труб. = 
# Q межтруб. = 

3. Начало работы

На момент старта проекта в компании L**** был реализован механизм расчета теплообменника в виде Excel файла. Вот его вид:

Расчет кожухотрубного теплообменника в Excel
Расчет кожухотрубного теплообменника в Excel
Пример логики в данном расчете :)
Пример логики в данном расчете :)

Для перевода данного расчета на Python следовало решить ряд подготовительных задач:

  • Оцифровать графики TEMA для определения поправки Z

  • Построить коммуникацию через API с пакетом теплофизических свойств для решения задачи по сведению теплового баланса

  • Занести в базу данных таблицы из ГОСТа: 34347-2017 сосуды и аппараты стальные сварные. общие технические условия / 34347 2017

3.1. Оцифровка графиков TEMA

Вид графика из TEMA
Итоговый результат оцифровки
Для каждого графика получается такая таблица в Excel
Для каждого графика получается такая таблица в Excel
Результат перевода в массивы Python
Mas_7_11 = [
  [
    0.1,
    [
      [1.000000000000000, 0.499999999999999],
      [0.999322833180564, 0.613635531736094],
      [0.997093063158007, 0.664615593443683],
      [0.996832262423495, 0.737096845531233]
    ]
  ]
]

3.2. Связь по API с пакетом теплофизических свойств

Генерация разбивок

Интерактивный виджет в JupiterLab для построения разбивок
Визуализация построения разбивок и расчета зазоров.
Визуализация построения разбивок и расчета зазоров.

Посекторный расчет теплообменника

Визуализация процесса расчета в JupiterLab
Расчет теплообменника по отдельным зонам. Каждая зона считается так, как будто это отдельно взятый теплообменник.
Расчет теплообменника по отдельным зонам. Каждая зона считается так, как будто это отдельно взятый теплообменник.

Генетический алгоритм поиска решения

Генетическая игра "Мир кроликов"

Ссылка на GitHub: https://github.com/tau15/Rabbit_World

Симуляция мира кроликов
Симуляция мира кроликов
Параметры мира кроликов
# World values
DNA_commands = 32 # Количество генов у каждого кролика
Food_limit = 100 # Кол-во еды, генерируемое в мире
Poison_limit = 0
Food_generation = 200
sleep_time = None
Bots_num = 8
DNA_lenght = 32
Survivers = 2
Mutation = 1
Love = True
Mutation_dna = 2
Устройство кролика :)
Внутри каждого кролика заложена программа (цепочка ДНК), представляющая собой последовательность действий кролика в игровой вселенной.
Внутри каждого кролика заложена программа (цепочка ДНК), представляющая собой последовательность действий кролика в игровой вселенной.
График корреляции массы аппарата и коэффициента теплопередачи К
На графиках видна обратная зависимость коэффициента теплопередачи и массы аппарата.
На графиках видна обратная зависимость коэффициента теплопередачи и массы аппарата.

Построение сетки решений и критериальный выбор лучшего решения

Блок-схема алгоритма построения сетки решений
На схеме показан алгоритм поиска решения, если пользователь не задал строго тип кожуха.
На схеме показан алгоритм поиска решения, если пользователь не задал строго тип кожуха.

Комментарии (5)


  1. mSnus
    13.02.2022 13:53
    +1

    Мне кажется, инженеры без опыта программирования просто обязаны были наступить на какие-нибудь грабли. Конверсия строк в числа, float-ы, приведение типов -- что-нибудь вот такое.

    В любом случае - молодцы! Но код лучше бы отдать на ревью кому-то опытному.


  1. ganqqwerty
    13.02.2022 14:00

    Не очень понял, где пригодились генетические алгоритмы. На последней блок-схеме вроде кучка if'ов ну то бишь дерево решений.


  1. greens76
    14.02.2022 10:43

    viable - жизнеспособный


  1. divanus
    14.02.2022 12:13

    А кролики-то помогли инженерам )


  1. Kekushiftkey
    14.02.2022 17:55
    +1

    вы великолепны!