Factorio

Factorio

Not enough ratings
Управление группами поездов через прерывания в Factorio 2.0
By HoldMyBeer
Эссэ о том, как сделать свой LTN с блэкджеком и прерываниями.
   
Award
Favorite
Favorited
Unfavorite
Введение
Приветствую архитекторов фабрик и к ним причастных.

Давненько ничего требующее моего внимания в мире Factorio не появлялось, но вот вышло долгожданная Factorio 2.0, самое время переизобрести очередной велосипед. Толковых реализаций управлением группами поездов через прерывания на станциях с параметрами я не встретил, поэтому вы сейчас читаете/смотрите очередную мою статью «недлявсех» со сложностью звездочка. Как обычно предлагаю Вам два варианта статьи в виде видоса (для молодых) и текста (для старперов).

В данной статье речь идет об управлении группами поездов через прерывания в ситиблочном исполнении фабрики, приводится пример ситиблоков, станций погрузки/разгрузки, депо и управление расписанием поездов. И конечно там, где Holdmybeer, там не обойтись без кучи проводов и комбинаторов? Поехали!

Для полноценного понимания логики предложенных схем желательно иметь представление о реализации счётчика на логике Factorio.

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

Предлагаемая мною форма ситиблоков возможно многим покажется знакомой. Да действительно, я спер её у широко известного в узких кругах отечественного бьюти блогера факторио fedisplay. Огромное количество вариантов ситиблоков предлагается с местом кругового разворота на перекрестке. У fedisplay использовалась схема четырехполосной железнодорожной линии ситиблока с разворотом не в точке пересечения вертикальных и горизонтальных линий, а в центре перегона, что собственно меня и заинтересовало. Сам перегон представлял собой ячейку длиной 6 квадратов, где умещалось 3 мини ситиблока.

Рис. 1: вариант ситиблока от fedisplay

Схема мне понравилась с первого взгляда, но я её переработал её в рамках своего преставления о прекрасном. Изначально схема была рассчитана на поезд конфигурации 1-1 с лимитом 2 поезда на станции. Этого мне было явно мало, поезд 1-1 для моего полета мысли маловат, я люблю поезда 1-2 (и 1-4), и ещё хотелось лимит в 3 поезда к станции. В общем я сократил количество миниблоков на перегоне с трех до двух, у меня в ячейке стало умещаться 4 миниблока, размеры ячейки 6х6 квадратов, по 3х3 на миниблок.

Рис. 2: мой старый вариант с размером ячейки 6 квадратов

Это была прекрасная схема ситиблока, которая замечательно работала с полутысячей поездов без заторов, но к сожалению обновление Factorio 2.0 увеличило радиус ж/д поворота на пару клеток, что «убило» мою схему… Пришлось делать новую. Теперь размеры ячейки 7х7 квадратов, размерность поездов 1-2 и лимит 3 поезда на станции я оставил прежние. И хотя новая схема увеличила размеры ситиблока, она имеет свои преимущества.

Рис. 3: мой вариант нового шаблона ситиблока

Шаблон ситиблока представляет собой четырехполосную железнодорожную сеть (для нищуков-неудачников в шаблоне есть двухполосный вариант железной дороги, а потом, после подлого грабежа жуков первоначальной стадии накопления капитала несложно проапгрейдить этот вариант уже до четырехполосной сети) с размерами ячейки 7 квадратов. Как я уже говорил круговой разворот для поезда располагается по центру перегона, а не на пересечении ж/д линий. Это предполагает хорошую защиту от затора поездов на интерконнектах, ведь славящихся этим закольцованные интерконекты в шаблоне отсутствуют. Двухполосный вариант для нищуков-неудачников не считается, ибо как нищуки-неудачники организуют полутора поездами затор? Конечно никак.

На ячейке предполагается размещение до четырех стандартных блоков. Обратите внимание, что въезд/выезд со станции должен сопрягаться с кругом разворота на перегоне.

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

Рис. 4: Шаблон с миниячейками

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

Ах да, хотя мой ситиблок создан для поездов 1-2, он переваривает в том числе и поезда 1-4. Что было идеально для мода Space Еxploration, где некоторые ресурсы были с лимитом 10-20 шт. на пачку и логичнее было использовать поезда 1-4 для отдельных категорий грузов вместо 1-2. Для работы с поездами 1-4 надо чуть изменить структуру светофоров на станциях и интерконнектах, установить лимит поездов на станции 2, а не 3. Замечу, при хорошей пропускной способности ситиблоков поезда размерностью длиннее 4 вагонов особого смысла делать нету, потому что для сохранения резвости поездов, надо чтобы на каждые 4 вагона приходился хотя бы один локомотив.

Небольшое замечание по шаблону. Как показывает практика работы на данном шаблоне ситиблока, типовая станция рассчитана на истечение/накопление ресурса со скоростью ~30-40 предметов в сек. Скорости выше 60 предметов в секунду лучше не закладывать, т.к. поезда часто будут не успевать отвозить/подвозить ресурсы и ячейка будет работать с перебоями.

Поэтому совет дня: если вам требуется скорости поставки ресурсов больше 60 ед/сек, поставьте дополнительную станцию поставки/запроса этого ресурса.
2. Принципы построения сети
Вообще сам принцип идеи сети запросов поездов я подсмотрел в этой замечательной статье . На первый взгляд все в статье красиво, я бы даже сказал весьма продумано, но в этой реализации сети достаточно много серьезных минусов: используется красная и зелёная логические линии, частое назначение "лишних" поездов на запрос груза, странное решение схемы станции разгрузки, ограниченность количества станций в депо числом четыре-пять (вообще можно нагородить больше станций, просто из-за случайного последовательного перебора станций в депо управляющий сигнал в поезда на станциях после пятой почти доходит) и наконец среднее время назначения поезда на запрос составляет аж 10-20 сек, что не выдерживает никакой критики. Поэтому пришлось колхозить свою реализацию сети лишённую указанных недостатков (спойлер - о которой вы сейчас читаете).

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

Распределение назначения поездов на задачи происходит по моим ощущениям в разы быстрее, чем в популярном моде LTN. Практика показывает, что сеть спокойно справляется с парой сотен поездов и столько же станций.

Важно:
1. На всю сеть необходимо установить один прерыватель.
2. Необходимо ручками установить свое число B (кратное 25) в каждом депо.
3. Для корректной работы сети необходимо подключить к сети каждую станцию погрузки и разгрузки.

3. Станция погрузки
На станции погрузки реализовано равномерное заполнение ящиков широко известной простенькой схемой. Отдельные бьюти блогеры наснимали видео аж получасовой длительностью и выше с одами о ходе полета мысли гениального сверхразума, разработавшего величайшую станцию погрузки, поэтому в описании сути ее работы буду краток. Для эффективной работы железнодорожной станции желательно чтобы все ящики станции наполнялись ресурсом равномерно. Это реализовано следующим образом: манипулятор грузит в ящик ресурсы, пока в нем ресурсов меньше, чем среднее значение ресурса в других ящиках. Замечу, что для архитектора фабрики здорового человека хорошим тоном является организация равномерной загрузки/разгрузки ящиков в том числе и через балансирование линий конвейера. Для размерности поезда 1-2 балансир конвейера это один разделитель, для поезда 1-4 надо городить уже балансир на четыре линии конвейера, вот в том числе почему используются поезда 1-2.

Рис. 5: Станция погрузки

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

Реализовано это следующим образом. Параметр в схеме станции погрузки определяет тип ресурса, который поставляет станция. Лимит поездов определяет максимальное количество поездов, которое может обслужить станция. В сравнивающем комбинаторе выбирается минимальное число из лимита поездов и числом поездов, которое сможет погрузить станция на данный момент времени (которое рассчитывается как груз в ящиках ÷ (число вагонов (2) * число ячеек в вагоне (40) * размер пачки (p0_s))). Получившееся число устанавливает лимит поездов на станции. Со станции считывается число идущих к ней поездов, и оно отрицательным значением отправляется в сеть для уменьшения числа запросов на поезда с ресурсом. Очевидно, что для корректной работы сети подключение станций погрузки к сети обязательно!
4. Станция разгрузки
Станция разгрузки использует следующие параметры, тип запрашиваемого ресурса, лимит поездов на станцию и число ресурса, которое необходимо поддерживать на станции в тыс. штук (окошко ввода параметров станции маленькое, поэтому в тысячах, это число потом умножается на -1000).

Рис. 6: Станция разгрузки

Положительное количество поездов, требуемых для заполнения груза до требуемого значения (которое рассчитывается как (груз в ящиках – запрос груза) ÷ (число вагонов (2) * число ячеек в вагоне (40) * размер пачки (p0_s))) сравнивается с лимитом поездов на станцию. Минимальное значение отправляется в станцию для установки лимита поездов и подается в сеть как запрос на поезд. Со станции считывается число идущих к ней поездов, и оно отрицательным значением отправляется в сеть для уменьшения числа запросов на поезда с ресурсом.
5. Станция погрузки/разгрузки жидкости
В Factorio 2.0 установили вместимость вагона-цистерны 50к, как мне кажется это не особо удачный выбор, т.к. размер стационарной цистерны оставили прежним в 25к. И для работы поезда 1-2 с лимитом на станцию в 3 поезда на станции получается многовато цистерн. После некоторых раздумий я решил для перевозки жидкостей использовать поезд 1-1. Если вы хотите использовать поезда для жидкостей 1-2, то необходимо в параметрах станций для жидкостей заменить в формулах 50к (вместимость поезда) на 100к и добавить пару насосов.

Рис. 7: Станции погрузки жидкости

Рис. 8: Станции разгрузки жидкости

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

Работа логики станций по погрузке/разгрузке жидкостей ничем не отличается от логики станции для работы с сыпучими грузами, кроме разницы в формулах. Формулы расчёта лимита поездов для станции погрузки/разгрузки жидкости рассчитайте самостоятельно (задание так сказать с двумя звездочками для ценителей).
6. Депо, прерыватель и расписание поездов
Депо содержит 64 поезда из которых 20 перевозят жидкость. В депо организовано пространство для разгона и торможения поездов (чтобы максимально быстро убирать поезда с перегонов.

Каждое депо увеличивает сигнал D на единицу.

Рис. 9: Общий вид депо

Прерыватель представляет из себя счётчик, который постоянно перебирает сигнал А с 1 до 25*D (количество депо в сети). Запуск прерывателя, а значит и обработка запросов грузов сетью управления группами поездов производится включением постоянного комбинатора прерывателя с иконками RUN. Общее число комбинаторов в последовательности тракта назначения поездов на задачи в депо не превышает длины 20 тактов, поэтому взято 26 тактов с запасом, чтобы по истечению 25 тактов все поезда в депо были уже назначены на запросы к началу следующей итерации раздачи запросов.

Рис. 10: Прерыватель

Запросы на грузы подаются в депо для назначения поездов только в моменты времени А=В (для каждого депо В свое, кратное 25).

Далее запросы грузов равномерно делятся между всеми депо. Остатки от деления числа запросов грузов на количество депо рассчитываются и обрабатываются в текущем депо.

Для лучшего понимания рассмотрим пример с тремя депо и запросом на пять поездов угля. В момент времени А=В1 из депо номер один за углем поедет три поезда, один будет результатом деления 5 на 3, а два других остаток от деления 5 на 3. Через 25 тактов уже из второго депо поедет уже два поезда, остаток от деления 2 на 3. Ещё через 25 тактов из третьего депо никто не поедет, т.к. все запросы на уголь выполнены. Вот примерно как-то так это все и работает.

Продолжим, в такт А=В сигналы запроса грузов проходят дальше и разделяются на две ветки, одна ветка для сухих грузов, другая для жидкостей. Из ветки для сухих грузов вычитаются сигналы жидкости и сигналы А и D. После чего подаются на станции депо для сухих грузов. Вычитаемое число жидкостей подаётся на станции депо для жидких грузов. Для каждой ветки производится случайный перебор по типу сигнала и уже дальше выбранный единственный тип сигнала подается на первую станцию депо в поезд.

Рис. 11: депо начало логики

Cо станции считывается ID поезда равное Т. Если на станции депо находится поезд (Т больше 0), то из сигнала груза вычитается единица (считаем, что поезд стоящий на этой станции выехал исполнять один запрос), обнуляем Т и сигнал груза подаем дальше на следующую станцию депо.

Рис. 12: логика станции депо

Поезда на станциях депо разбиты на две группы, одни для работы с сухими грузами, другие для жидкости. Отличия только в названии станций (депо, погрузки и разгрузки). У поезда установлена одна станция - депо с задачей бездействия 2 сек (для загрузки поездов топливом между поездками) и одно прерывание. В прерывании настроено следующее: только если все условия соблюдены, поезд поедет на станцию погрузка «сигнал», где полностью загрузится, после чего поедет для полной разгрузки на станции разгрузка «сигнал».

Условия срабатывания прерывания следующие: сигнал груза существует, поезд стоит на станции депо и полностью разгружен, станция погрузка «сигнал» существует и свободна, станция разгрузка «сигнал» существует и свободна, топлива в локомотиве больше 50.

Рис. 13: расписание поезда

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

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

Совет месяца: старайтесь ставить депо в местах с минимальной вероятностью появления затора.
Итого
Напоминаю, что перед запуском необходимо убедиться, что:
1. На всю сеть установлен один прерыватель.
2. В каждом депо установлено своё число B (кратное 25) .
3. Каждая станция погрузки и разгрузки подключена к сети.


В общем как-то так всё это и работает, поезда крутятся, ресурсы мутятся. На этом всё, берегите себя, свою фабрику, надеюсь Вам понравилось, до новых встреч, пока!

Скачать шаблон железнодорожной сети[factorioprints.com].
2 Comments
rom1ror May 28 @ 11:01am 
паровозик тф2
Ya312 May 17 @ 3:20pm 
мге паровозики