Привет из конвертерного цеха металлургического комбината! Смотрите, у нас тут есть вот такой суп в ковше, стоящем на сталевозе:

image
Таких ковшей на 320 тонн стали в цехе 40 штук, и они медленно остывают. Этой стали грустно и одиноко, она подмерзает. Через эти ковши проходит 10 миллионов тонн стали в год, это 14% стали России

На входе в цех у нас жидкий чугун и металлолом, на выходе надо получить сляб — большой слиток стали. Контур системы диспетчеризации «Гефест» начинается с конвертера, где мы продуваем чугун кислородом, таким образом окисляем и удаляем ненужные нам примеси. После конвертера получается «стальной бульон» для супа, в который уже можно добавлять основные ингредиенты, чтобы получались разные марки стали. За смену мы выплавляем несколько заказов, и каждая сталь требует своего рецепта — это разные добавки, разные техпроцессы, разные температуры и разные последовательности действий.

image
На участке аргонной установки

Раньше графики последовательности действий составлялись в блокноте человеком и были недостаточно оптимизированы. Плюс непредсказуемость: графики с довольно широкими временными границами дают большие потери производительности, а графики с узкими границами — не дают прореагировать на возможную поломку, задержку в процессе или вынужденную остановку.

В общем, мы написали систему, которая не только оптимизирует загрузку этого участка производства, но и регулярно (во время смены) пересчитывает всю логистику ковшей.

Но давайте начну с, собственно, рассказа про то, что же именно оптимизируется в цехе.

image
Слева — установка печь-ковш, впереди — подход к трайб-аппарату

Как устроен цех


Идею конвертерного производства стали я примерно описал выше. На входе у нас чугун, который выплавляется в доменной печи, и лом чермета. На конвертерный участок он поступает всё ещё в жидком виде и заливается в конвертер (после завалки туда лома).

Конвертер достаточно хорошо автоматизирован. Поскольку химический состав сырья варьируется, у него есть датчики, позволяющие примерно понять, что происходит внутри и выбрать верный температурный режим, режим окисления и так далее. В конвертере чугун продувается кислородом, что даёт его разогрев до температуры 1600+ градусов Цельсия, окисление кремния, марганца и углерода. Полученные оксиды удаляются из расплава, и на выходе получается жидкий металл в объёме ковша (плавка) — то, что позже станет сталью определённой марки.

Конвертеров у нас три штуки, они могут подавать «бульон» в любое время и по заданному расписанию. При этом если процесс окисления запущен, мы не можем его остановить, в любом случае на выходе примерно через 40 минут получится ковш расплава, с которым надо будет что-то делать.

Выглядит он вот так:

image

А так выглядит проба металла (остывшая), которую берут из ковша на агрегате внепечной обработки. На длинной ручке, которой эту пробу берут, на конце есть ёмкость такой формы, как этот застывший образец. Там разрежённая среда, и в эту форму засасывается жидкий металл, а сама форма сгорает.

image

На данной фотографии ковш перемещается по цеху на мостовом кране. Кранов у нас 10 штук, они вот такие:

image
Лебёдка мостового крана

Здесь хорошо видно ещё одно ограничение логистики: мостовой кран может двигаться по цеху по своим направляющим только в диапазоне от одного крана до другого, а не полностью независимо. Краны управляются из кабин:

image

Итак, вы получаете ковш с жидким металлом. Далее его нужно перемещать по цеху, чтобы в зависимости от сорта изготавливаемого металла, тем или иным образом обработать плавку — довести до нужной температуры, добавить примеси (флюсы и/или ферросплавы) и некоторое время перемешивать при определённой температуре.

image

Чем меньше отклонение реального процесса от нормативного времени обработки плавки, тем меньше нужно тратить ресурсов (в частности, электроэнергии) на производство. У каждого ковша есть критическая температура (температура ликвидуса), после снижения до которой расплав становится непригоден для дальнейшей разливки. Плавку в такой ситуации надо догревать. Как мы говорим — сталь мёрзнет. Лучший способ её догреть — это опустить в неё графитированные электроды и включить ток (в конвертер ничего не возвращается). Стендов с электродами (установки печь-ковш) всего два. Они вот такие:

image

При плотном графике каждый внеплановый догрев означает распространение волны опозданий дальше по очереди. Кроме того, графитированные электроды сами по себе довольно дорогие, и каждый такой догрев — это рост себестоимости конечного продукта. Поэтому наш сервис и работает на то, чтобы не дать стали замёрзнуть.

image
Разливщик стали берёт пробу металла на установке печь-ковш (УПК)

Агрегатов в конвертерном цехе 8 штук, мы двигаем ковши между ними, часто оставляем в них на N минут. Между конвертером, например, в вакууматоре и на других узлах сталь может провести 20 минут, может 40 — зависит от задачи (как именно нужно обработать плавку, чтобы получить заказанную марку стали) и начальных условий.

image
Перенос теплоизолирующей засыпки

В конце цеха сталь попадает в одну из УНРС — установку непрерывной разливки стали.

image
Это вид сверху на одну из наших УНРС. Мы видим два стенда для установки стальковшей. Сталь из ковша слева, который с крышкой, уже почти разлилась, через пару минут там останется один шлак. Ковш справа только что был поставлен краном, он полный, его разливка начнётся сразу, как иссякнет сталь в левом ковше. Как уже говорилось, крайне важно, чтобы поток стали в УНРС не прерывался

image
Установка доводки металла

Ключевое слово «непрерывной»: в эти установки должны попадать ковши с правильно подготовленным «супом» без остановок. Напоминаю, если мы формируем очередь перед УНРС, то сталь в ковшах остывает, поэтому всё нужно точно вовремя. Мы можем варьировать скорость разливки, но в небольших пределах.

Вот принципиальная схема цеха:

image

На этой стадии может показаться, что задача сводится к формированию оптимальных очередей на агрегаты цеха и догрев того, что в эти очереди не умещается. В цехе постоянно решается задача, как оптимально выпускать сталь из конвертеров и обрабатывать её на различных агрегатах, чтобы выдержать все серии на УНРС.

image
Алюминиевая проволока для раскисления стали

Более широкая задача


Может показаться, что можно один раз подобрать набор оптимальных режимов загрузки узлов производства и придерживаться его. К сожалению, это работало бы только в той ситуации, если бы мы могли производить примерно одинаковый набор сталей — или если бы мы делали очень длинные серии в больших заказах. На практике гибкость на нашем участке производства означает некоторые потери в оптимальности процесса, но эти потери куда меньше, чем выигрыш за счёт гибкости производства в целом.

Проще говоря, каждый день нам нужно лить разные заказы — несколько разных сталей, каждая из которых имеет свой процесс и свой «рецепт супа».

Заказы поступают примерно за две-три недели в систему более высокого уровня, где кластеризуются, группируются, дефрагментируются и спускаются в цех в виде суточных планов.

На основе отобранных для исполнения в данные сутки заказов начальник отдела планирования составляет суточное задание по загрузке УНРС, что-то вроде следующего: «с 12 до 15 на такой-то машине мы разливаем такую-то серию, переналаживаем 2 часа, затем с 17 до 22 разливаем следующую серию, переналаживаем, затем с полуночи до 4 утра третью». На каждую из пяти разных установок может быть запланировано несколько серий, отличающихся по продолжительности. Кроме серий на УНРС, ему необходимо запланировать работу конвертеров. Эта задача, вообще-то, требует расчёта, особенно в случае большого количества разноплановых заказов. Но до сих пор она решалась на опыте и профессиональном чутье специалиста вручную. Сейчас же он имеет возможность создать несколько сценариев, комбинируя разное время запуска разных серий и пробуя сочетания. Лучший план из полученных отправляется в работу.

После того, как начальник смены составит такой верхнеуровневый план на сутки, он уходит в диспетчерскую службу цеха, где начальник смены составляет более подробный план с учётом всех промежуточных агрегатов. Раньше, опять же, специалист вручную рассчитывал такие планы. Точнее, на самом деле, конечно, этот процесс автоматизировался, но всё равно у систем автоматизации не было возможности пересчитывать график в реальном времени в зависимости от положения и статуса каждого ковша, то есть он составлялся один или два раза в смену. Сейчас мы сделали систему, которая может пересчитывать оптимальные графики постоянно. При выходе ситуации за план, он пересчитывается.

Итак, есть книга заказов, в которой указываются заказы, которые производство должно поставить. Часть заказов из этой книги попадают в конкретную смену, где оптимизируются в рамках производственного участка тактически. Каждый заказ — это серия разливки. Мы поднимаемся от разливки к конвертерам и прописываем, что будет происходить в какое время и на какой установке, и каким образом туда будут попадать ковши. Это делает начальник отдела по планированию производства.

Бывают смены, когда серии попадаются очень длинные, и все сутки участок работает по одному маршруту. Это облегчение для всех, и это упрощает задачу. Но чаще марки стали разные.

Система планирования в её текущей реализации работает исходя из того, что чугун приходит к нам в необходимом количестве и в те моменты, когда нужно загружать конвертеры. С этим тоже есть нюансы, но включение техпроцессов предыдущих переделов пока оставили в развитии, это отдельный и сложный вопрос.

Некоторые типоразмеры слябов и марки стали могут разливаться только на конкретных (не всех) установках. Некоторые серии должны быть обязательно в конце смены, поскольку их продолжит следующая смена.

Как это выглядит на практике


Вот кадры, которые показывают в презентациях:

image
Это онлайн-планировщик сменных заданий

image
А это «живая» мнемосхема цеха, на которой видно текущее местоположение стальковшей и другого оборудования

А вот так это выглядит в цехе:

image

image
Сталевар

image
Зеркало металла

Основной рабочий инструмент отслеживания плана — мнемосхема цеха и статусы каждого из ковшей:

image

На мнемосхеме мы наблюдаем в реальном времени перемещение ковшей, статус плавок в них, состояние сталевозов и кранов. Любой мостовой кран может стать узким местом, как и любой агрегат. Каждая плавка снабжается связкой с камерой, которая её отслеживает.

Система называется «Гефест». Алгоритм оптимизации плана, заложенный в систему, интересен в первую очередь тем, что позволяет очень гибко учесть всё то большое количество технологических требований и нюансов, которое отличает чистую математическую задачу от прикладной. Эта гибкость позволяет использовать оптимизатор ещё и как инструмент моделирования и сценарного анализа.

Что касается отслеживания ковшей, надо сказать, что это отдельная проблема, далеко выходящая за рамки исключительно распознавания образов и детекции событий нейросетями.

Вот тут вы можете видеть 1 Тб стали — на самом деле это лоток с металлоломом:

image

Номера стальковшей выглядят вот так. Видите его? А он есть, и машинное зрение его видит:

image

Первый блок отслеживания — это видеоаналитика, которая распознаёт сталевозы, положения кранов, номера ковшей (гораздо лучше, чем люди) и так далее. Второй блок — это алгоритмическая надстройка над сигналами видеоаналитики, ведь это отдельная непростая задача — сформировать целостную траекторию движения ковша с плавкой по событиям и сигналам с нескольких десятков камер.

Почему видеоаналитика, а не датчики? Потому что мы не видели датчика, который бы у нас не сгорел.

image

Температура стали 1600 градусов примерно. К концу смены датчик прогорит, будет залит каплями расплава или шлака, закопчён газами и, если там было что-то магнитное, размагничен. Несколько раз. Даже в самых экзотических местах даже пассивные метки довольно уязвимы.

Для каждого сортамента стали у нас есть зависимости, как именно увеличение времени обработки стали сказывается на допзатратах с нагревом и удалением кислорода. Первая наша цель — хорошее планирование, когда эти допзатраты не нужны — с учётом регламентных ремонтов, графика заказов и всех обстоятельств. Вторая цель — в случае нештатной ситуации — перераспределение графика для минимизации потерь. Сделать это на бумажке или в уме хоть сколько-то оптимально невозможно.

image

Итак:

  • Планировщик назначений даёт нам оптимальный план.
  • Оперативный планировщик позволяет получить детальный план по агрегатам и перестраивать его по требованию.
  • Критерии оптимизации планов производства заданы в математической модели сервиса.
  • При нештатной ситуации и несколько раз за смену планы актуализируются для минимизации потерь.
  • Работает цифровой двойник производства на основе видеоаналитики.
  • Есть прямой доступ ко всем видеокамерам системы.

Реализовали мы это своей командой и екатеринбургской командой ООО «Дата-Центр Автоматика», работающей в металлургии не первый год.

Текущий экономический эффект — 4% экономии по электроэнергии, электродам и алюминиевой катанке. Он достигается за счёт сокращения времени выдержки металла в стальковше до 7%. Плановый эффект по экономии энергии, электродов и алюминия от использования сервиса — 100 миллионов рублей в год. При этом мы также снижаем брак, но посчитать точно пока не можем, здесь мы будем сравнивать исторические серии. По ощущениям — на порядок больше.

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


  1. panvartan
    28.09.2021 11:07
    +3

    Чувствуется, что "немецкая сталь" это не "просто маркетинг".


  1. tzlom
    28.09.2021 11:09

    один остывший не к месту ковш запросто может нанести ущерба на несколько миллионов рублей

    Как то дёшево прям, я думал раз в 50 больше будет

    Касательно планировщика - как он работает? Прямым перебором всех вариантов или там что-то более интересное?


    1. AlexanderSkorniakov Автор
      28.09.2021 11:59
      +3

      В принципе перебор вариантов, но там же масса технологических ограничений. Эти ограничения переводят большую часть таких вариантов в разряд запрещенных. Тут, наверно, самая интересная часть задачи — в генерировании ограничений для конкретного кейса.

      По поводу стоимости: мы ведь не выкидываем всю плавку целиком в мусорку, если что-то пошло не так. Просто из более качественного сорта она идет на марку пониже. Разницу в стоимости я примерно прикинул. Зависит от того, какие ферросплавы были добавлены и так далее.


      1. Gryphon88
        28.09.2021 16:43
        +1

        А на программном уровне как это реализуется? Через дерево решений, КА с обновлением запрещенных состояний/переходов или как-то иначе?

        ЗЫ Интересно, если сделать по примеру FoldIt игру-убивалку времени или мод для Факторио, не получится ли закраудсорсить внутрицеховую логистику?)


        1. Rigidus
          29.09.2021 14:18

          Тоже очень интересно. Программирование в огранчениях?


          1. Gryphon88
            29.09.2021 19:05

            "Как-то" написать можно, но вот чтобы без макарон и чтобы можно было понять написанный полгода тому код, у меня получилось только с использованием дерева решений. С удовольствием почитаю про архитектуру кода, который не надо примерно целиком переписывать при добавлении нового рабочего центра или коренном изменении графа связей (например, ещё проём в стене пробили).


            1. sok
              02.10.2021 15:58

              При множестве "правильных" решений(где есть чуть более и менее правильные) и очень широкой области поиска, неплохо подходит ГА, где ген - само расписание, а "актуальными" на данный момент ограничениями оценивается сам ген.

              Тогда если рухнет стена и появилась новая связь - вводятся новые ограничения "оценщики" гена, а текущее расписание продолжает оптимизироваться.

              Код при этом состоит из четких маленьких сущностей в один два экрана, а ограничения самостоятельны, просты и очевидны.


              1. Gryphon88
                04.10.2021 12:34

                Спасибо, в сторону ГА не смотрел, почти с ними не работал. Не подскажете по разработке и внедрению?

                1. Правильно ли я понимаю, что на проде продолжается эволюция?

                2. Как предотвращаются очевидно нежелетальные действия? Через высокий penalty или через хардкод?

                3. Насколько сложно сертифицировать самомодифицирующуюся программу на ГА? Deep learning и нейросети в РФ в критичной инфраструктуре, например, в медицине, лучше просто не использовать именно из-за сертификации.


                1. sok
                  04.10.2021 19:04

                  ГА(ГП) после восьми лет работы с ними для меня стали скорее философией, чем конкретными подходами. Так что на любой вопрос по ним я не могу дать четкого ответа, только собственное представление и понимание.

                  Давайте я отвечу примерами в упрощенном представлении задачи в контексте этой статьи - "расписание чанов с расплавом на отливку".

                  1. Да, но с особенностями. Все зависит от бюджета, рамок и сложности задачи. Можно каждый раз продолжать непрерывно искать от последнего найденного решения, а можно, к примеру купить стойку БД, куда оффлайн рассчитываем решение проблемы расписания с шагом, чтобы забить эту БД(разбиваем общую ситуацию на элементы, нумеруем их, получаем обобщенный хеш который в дальнейшем используем в качестве ключа), а после ищем всегда по алгоритму - текущая ситуация -> получаем хеш -> получаем из БД приближенное решение -> ищем от него более оптимальное от конкретной ситуации. Именно так можно гарантировать отработку ГА за заданное время(за время обращения к БД мы получим "среднее" НО решение).

                  2. От конкретной ситуации. Мне очень полюбился подход "ступенек", где у нас есть множество оценок решения, где мы смотрим на каждую последующую оценку только если предыдущие идентичны. (если хуже - решение отбрасываем, если лучше, соответственно - заменяем). Тогда "жесткие" условия задаются бинарной оценкой 0,1, суммируются и ставятся в самом начале. Неважно какая будет "мягкая" оценка(на второй позиции списка оценок), если ухудшается хоть один "жесткий" параметр - такое решение не пройдет. В контексте упомянутой БД, мы всегда можем рассчитать все решения так, чтобы не было нежелательных действий (к примеру "количество догревов"), ГП будет оптимизировать тогда что-то мягкое - "потери в рублях", "общее время простоя".

                  3. Могу предложить один из возможных вариантов - у нас на выходе будет полноценное "решение" - конкретное расписание, а не "решатель" как в случае нейросетей. Следовательно мы создаем верификатор "расписания", который содержит математическую/имитационную модель, сертифицируем ее а после подаем найденные решения ей на вход, конвертируя в удобный для верификатора формат. Она их одобряет и у нас на руках "сертифицированное" решение, а не программа которое их генерирует.


                  1. Gryphon88
                    08.10.2021 15:37
                    +2

                    Спасибо. Не посоветуете литературу или опенсорсный проект, чтобы знать, когда ГА вовремя и как они правильно используются? И в идеале то же самое, но с неправильно и невовремя.

                    ГА(ГП) после восьми лет работы с ними для меня стали скорее философией, чем конкретными подходами. Так что на любой вопрос по ним я не могу дать четкого ответа, только собственное представление и понимание.

                    Через какое-то время познаешь Дао, но при этом понимаешь, что Дао, высказанное словами, не настоящее Дао. А до момента просветления рассказать несложно, но информация будет несколько однобокой. Проходили, увы.


                    1. sok
                      08.10.2021 16:20

                      Издательство ДМК "Генетические алгоритмы на Python" Эйял Вирсански - даёт самый приятный и плавный ввод в эту тему. Саму книгу можно читать и не зная Python, а просто воспринимая его как псевдокод. Но тогда теряется другой плюс книги - автор для примеров использует одну из самых популярных библиотек по ГА в Python DEAP, так что после прочтения можно приступать к решению собственных задач с помощь серьезной библиотеки. Под мои задачи DEAP оказалась немного неудобной(нельзя легко сделать ту же "оценку ступенькой", приходится перегружать несколько классов и по мелочи(уже не помню), так что после пары доработок, я написал себе свои заготовки пустышки с чем и работаю до сих пор.

                      Самое главное в ГА - это отсутствие рамок. Если в книге в гене перемешивают биты, вы должны понимать что это лишь принцип, перемешивайте слова, ассесблерным инструкции, чаны с металлом, людей в очереди и т.п. ГА это лишь идея подходов, изложенная в конкретных примерах.


                      1. Gryphon88
                        13.10.2021 15:28

                        Спасибо большое, воскуряю.


  1. serafims
    28.09.2021 11:12

    То есть по сути для каждой рецептуры стали создается электронная технологическая карта, учитывающая время выполнения промежуточных операций над расплавом и скорость охлаждения стали в ковше (чтобы избежать догрева, если придется "ждать в очереди")? И затем в начале цикла грубо говоря идет команда "начинай процесс", в нужный момент времени, когда с учетом расположения и выполнения графика впереди идущими сталевозами наиболее вероятно попасть в максимальный разрыв подачи стали на УНРС?


    1. AlexanderSkorniakov Автор
      28.09.2021 12:22
      +3

      Почти так, но узких мест может быть несколько, а не одно. И важно оптимизировать весь график, а не движение какого-то одного ковша.


  1. vaniacer
    28.09.2021 11:27
    +36


  1. space2pacman
    28.09.2021 11:29
    +23

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


  1. alex__m
    28.09.2021 11:56
    +3

    Спасибо за статью! Отличная наглядная иллюстрация к книге "Цель" (Элияху Голдратт)


  1. maynoz
    28.09.2021 12:07
    +2

    Какую SCADA используете?


    1. AlexanderSkorniakov Автор
      28.09.2021 12:42
      +1

      Ядро – система DataTrack, российская разработка. Это система слежения за материалом. Нейросети также взяли готовой архитектуры. Остальное все рукописное.


  1. hw_store
    28.09.2021 12:57
    +2

    Всегда недоумевал, если температура расплава ~1600 градусов, то почему не плавится ковш? Он же не из вольфрама наверное, а тоже из стали


    1. shnegs
      28.09.2021 13:30
      +6

      Он прогорает. Внутри футеровка в несколько слоёв разных материалов. Её периодически меняют.

      Вот тут вы можете видеть 1 Тб стали 

      Долго вчитывался. Как так всего лишь один терабайт стали?


      1. shnegs
        28.09.2021 13:31

        :)


    1. Mariia_Simonova
      28.09.2021 13:35

      Ковш изнутри выкладывают огнеупорным кирпичом, и этот кирпич часто меняют, потому что прогорает. То же самое и с доменными печами


      1. Schicout
        28.09.2021 15:37

        А при засыпке лома она не страдает? Или в основном она страдает от температуры? Лом, помнится, активно так сыпят, как из ведра - ррраз и ковш пустой.


        1. AlexanderSkorniakov Автор
          28.09.2021 15:37

          Лом заваливают в конвертер и там плавят, то есть в стальковш он попадает в жидком виде уже.


          1. Schicout
            28.09.2021 16:49

            Да, спасибо, я уже понял, когда спрашивал, то в голове было про конвертер


        1. AlexanderSkorniakov Автор
          29.09.2021 13:27

          У ковша в цехе стоять незачем. Основная работа либо в помещениях операторских, либо на конвертерной площадке, либо на разливке. Людей работает немало, контактируют с друг другом много. Плюс учтите, что тут человека снимают, он об этом знает, и маска — необходимый СИЗ.


  1. anonymous
    00.00.0000 00:00


    1. AlexanderSkorniakov Автор
      28.09.2021 18:27
      +1

      Ковид, увы, не сгорает от наших температур, поэтому у нас не как на улице, а как в помещении. И люди в цехе есть. Приезжают как все, контактируют в транспорте/дома.


  1. anonymous
    00.00.0000 00:00


  1. ChePeter
    28.09.2021 17:46

    Интересный такой тетрис !

    Сверху падают фигурки, наверно по десятку квадратиков и по нескольку штук, и их робот должен уложить оптимально.


  1. Serg10
    28.09.2021 18:31

    Интересно в чем отливают ёмкость для этой лавы


    1. AlexanderSkorniakov Автор
      29.09.2021 13:47

      Сам ковш сварной из стали, но изнутри он выложен огнеупорным кирпичом, который и держит такую высокую температуру.


  1. stanislavskijvlad
    04.10.2021 10:39
    +2

    Увидел превью, захотелось бурой посыпать сверху :) Я считаю, что автор может продолжить цикл общих образовательных статей. Об истории металла, с античных лет. О современных сплавах, о составе стали рассказать, про автомобильный коленвал. И как плавить мельхиор ;)


  1. rotorobotor
    12.10.2021 10:56

    Прекрасная статья, очень здорово что есть такое окно теперь в реальную реальность.
    Как вы тренировали сеть и какую для распознавания номеров и значимой инфы?
    Как реализовали непрерывное отслеживание движения? Переход между камерами, кадрами, видеопотоками?


  1. AlexanderSkorniakov Автор
    12.10.2021 15:16

    Там использовалось несколько сетей, например, для детекции объектов применяли yolov3. Сети тренировали, когда уже развернули систему видеокамер, оттуда брали кадры для разметки и обучения. Целостные траектории строятся на двух компонентах — координатах объектов и сигналах состояний, по которым можно определить значимые события. Основное событие для отслеживания — передача ковша. Передача ковша, например, со сталевоза на кран может быть осуществлена в рамках конечного множества точек на схеме цеха. Вы отслеживаете попадание объектов в эти точки и при определенной комбинации сигналов состояний фиксируете то или иное событие. Тут, конечно, сразу возникают вопросы фильтрации шумов в сигналах и так далее, но идейно подход такой.


  1. SGordon123
    12.10.2021 17:08

    А почему обязательно греть, нельзя заблоговременно в термос сунуть или подуть коли перегрели?


  1. kompilainenn2
    05.11.2021 11:19
    +1

    вот уж не ожидал на хабре найти блог родного НЛМК