Factorio

Factorio

34 ratings
Логистическая сеть поездов на основе прерываний
By Poldnik999
Приветствую. В данном руководстве я постараюсь рассказать о своей логистической системе поездов на основе прерываний и логических сигналов запроса.


Книга чертежей: https://factorioprints.com/view/-OBohahKeCm-VvhBlK59
  • (16.11)Было уменьшено число комбинаторов на станциях.
  • (16.11)Исправлен косяк с названием жидкостной станции запроса.
  • (18.11) Исправлен баг, когда на станцию разгрузки вызывался на 1 поезд больше чем нужно и долго стоял на полной станции
  • (19.11) Обновил жидкостную станцию запроса, теперь есть защита от дурака, на станцию не приедет больше поездов, чем влезает в систему + используется меньше комбинаторов.
  • (29.11) Добавил экспериментальную радарную станцию, которая равномерно распределяет запросы между несколькими депо
  • (15.01) Добавил больше параметров чертежам к станциям погрузки и разгрузки. Также были изменены станции депо и радарные станции в попытке пофиксить баг с отправкой большого кол-ва поездов чем требовалось


Если вам все понравилось и все понятно, вы можете поддержать автора
2
2
   
Award
Favorite
Favorited
Unfavorite
Вступление
Начнем с состава нашей сети:
  • Станции погрузки
  • Станции разгрузки
  • Депо для твердого груза
  • Депо для жидкого груза
  • N ко-во поездов
В данном руководстве будет обзор на создание ванильной сети поездов, по типу мода LTN

База
Базовая Логика LTN:

У нас есть поезда, которые находятся в депо и ждут своего часа и при получении запроса необходимое количество поездов выезжают по динамически собранному расписанию: погрузка -> разгрузка -> депо


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



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


У нас тут ванильная игра, а не LTN, соответственно поезда не знают какого типа груз они перевозят и какой длины являются.
И депо не расчитано на настройки длины поезда и тип груза.

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

Ниже представлены настройки прерываний для поезда

По условиям прерывания:
  • Поезд должен стоять в депо для получения запроса
  • На станцию, где располагается поезд (ДЕПО) должен поступить сигнал с запросом
  • Поезд должен быть пустой, иначе он не поедет
  • Запрошенная станция погрузки может принять к себе поезд
  • Запрошенная станция разгрузки может принять к себе поезд

Если все условия выполняются, поезду назначается временное расписание и он выезжает на запрошенные станции.

Для справки:
Этот сигнал называется "Параметр сигнала" и принимает значение, которое игрок может подавать на станцию извне (например с комбинатора)

Для нас он создает название запрашиваемой станции в расписании поезда.

Подробнее про сигналы и прерывание вы можете почитать в других руководствах. Например тут: https://steamcommunity.com/sharedfiles/filedetails/?id=3362592267
Станции запроса
Станция Разгрузки генерирует сигнал запроса в зависимости от вместимости сундуков или лимита поездов. А также уменьшает сигнал запроса, если на станцию едет поезд. Для чего это было сделано можно почитать в разделе работа с сигналами запроса


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

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


По умолчанию в данном чертеже 6 стальных сундуков, но на лимит поездов тут влияет заполненность сундуков, а не их количество. Так что ставьте сколько хотите, соедините проводом только.
Лимит поездов выставляется в зависимости от количества груза в сундуках и пользовательского лимита.

Данная станция является универсальной для любой длины поезда. Чертеж параметризированный
Депо
В депо, как вы уже знаете, стоят поезда и ждут когда к ним придет запрос.
На каждое депо выделяется одна радарная установка, которая обрабатывает и фильтрует запросы.
Важное уточнение: запросы на твердые грузы хранятся в зеленой сети, а запросы на жидкость хранятся в красной. Соответственно чертежи радарных станций отличаются в зависимости от того, какие поезда сидят в депо.
Отправка запроса в депо
Фильтрация запросов нужна на тот случай, если вы решили раскидать несколько депо одного типа по всей фабрике на планете. А сама фильтрация заключается распределении запросов между радарными установками и в запрете пропускать один и тот же запрос в несколько депо одновременно.
Радарная установка:
  • На каждый радар мы отправляем 1 сигнал "D", чтобы система понимала сколько депо раскидано по фабрике
  • Сигналы из общей сети делятся на количество депо и отправляются на поезда через выбирающий комбинатор
  • Далее мы считаем остаток от деления на количество депо и одновременно:
    • Отправляем этот сигнал на поезда через выбирающий комбинатор
    • Запрещаем использовать остаток от деления на других депо
Пример:
  • Два депо на фабрике и сигнал запроса на доставку 3 медной руды
  • По схеме делим 3 медной руды на 2 депо и получаем по 1 сигналу медной руды на каждое депо в системе.
  • Нам надо как-то распределить оставшийся 1 сигнал медной руды между депо. На этот случай мы и используем остаток от деления, который по схеме будет попадать на случайное депо и не будет дублироваться.
ВАЖНО На левом нижнем выбирающем комбинаторе необходимо ставить разный уровень интервала обновления во избежании ошибок в работе


Пример распределения запросов между двумя депо:

ВАЖНО Запрос не будет равномерно делиться, если уровень сигнала меньше чем количество депо. За место этого он просто не будет дублироваться. На скрине таким примером будет запрос на уголь


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

Принцип работы распределения сигналов между поездами в депо:
  • Арифметический комбинатор отнимает единицу от сигнала запроса, если на станции стоит поезд
  • Сигнал из арифметического комбинатора поступает на выбирающий и сравнивающий комбинаторы
  • Выбирающий комбинатор играет роль таймера, для того чтобы все поезда в депо не брали лишний запрос. Это предотвращает ошибку, если на запрос выехало больше поездов, чем требуется
  • Сравнивающий комбинатор позволяет быстрее обновлять сигнал запроса, так как выбирающий комбинатор убирает сигнал выхода с задержкой. Выход сравнивающего комбинатора идет на станцию с поездом.
Пример: у нас есть запрос на доставку 2 медной руды, то есть нам нужно отправить в путь максимум два поезда;
  • На первую станцию депо подается чистый запрос -> 2 руды;
  • Проверяем по светофору, стоит ли сейчас на этой станции поезд, если стоит, то на следующую станцию депо мы отправим -> 2 - 1 руды = 1 руды;
  • Если на след. станции нет поезда, то пропускаем сигнал дальше -> 1 руды;
  • Таким образом два поезда получат свой сигнал запроса и покинут станцию вне зависимости от их расположения в депо.
  • Следующие поезда сигнал запроса не получают, так как он равен 0, соответственно лишние поезда стоят на месте.
Когда поезд покидает станцию депо, из общей сети отнимается 1 сигнал запроса, так как уже назначен поезд на его выполнение. А как он отнимается из общей сети мы узнаем позже.


В моем варианте в депо поезда еще и заправляются. Если у вас отдельная заправочная станция, то смотрите руководства по прерываниям.
https://steamcommunity.com/sharedfiles/filedetails/?id=3353212873
Работа с сигналами запросов
Уровень сигнала запроса показывает, сколько поездов нужно для его выполнения. Он изменяется следующим образом:
На станциях погрузки и разгрузки мы устанавливаем настройку, которая считывает количество поездов, которые направляются на станцию.
Также на каждой станции стоит арифметический комбинатор, который умножает сигнал С на -1 и отправляет на выходе ресурс нашего запроса с отрицательным знаком.
Выходной сигнал арифметического комбинатора отправляем в сеть для того, чтобы сигнал нашего запроса уменьшился на то количество поездов, которые этот запрос выполняют.



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

В совокупности с обработкой сигналов в депо это устраняет проблему, когда на 1 запрос могло приехать 2 или более поездов на станцию погрузки.
Прочее
Хочу поделиться
Хочу поделиться своими наработками. Я использую поезда с 4 грузовыми вагонами и у меня иногда возникает проблема на станциях погрузки и разгрузки, которые не всегда могут равномерно загружать или разгружать поезд, и поезда могут долго стоять на станции и ничего не делать. Можно подключить логику к манипуляторам и контролировать равномерную разгрузку/загрузку, но мне так не нравится потому что не уверен в хорошем влиянии на производительность в этом методе. (Поправьте, если я дурак)

Вот мое решение выдуманной проблемы: Станция погрузки и разгрузки


Тут 4 сегмента по 12 сундуков
  • На станции погрузки высчитывается минимальный заполненный сегмент сундуков и я разрешаю отправить поезд только тогда, когда во всех 4 сегментах есть ресурсы хотя бы на 1 поезд
  • На станции разгрузки высчитывается максимально заполненный сегмент сундуков и я разрешаю отправить поезд только тогда, когда во всех 4 сегментах есть место для разгрузки хотя бы для 1 поезда
Чертежи
Все чертежи будут по ссылке:



  • У меня тут кастомные параметризированные станции для сухих и жидких грузов и отдельные станции для разной длины поезда с подчетом кол-во предметов по сегментам.
  • Чертежи поездов, депо и радарных установок для разных типов грузов.
Конец
Вот и все. Нет не все! Вот еще небольшая информация: все комбинаторы в чертежах подписаны, и если вам трудно разобраться, обращайтесь к описанию комбинаторов.
ТЕПЕРЬ КОНЕЦ. Это было мое первое руководство, поэтому если вам что то не понятно или чертежи работают неправильно, то пишите в комментарии, постараюсь помочь.

Спасибо ребятам, которые помогли с поиском багов и улучшением чертежей:






Скинуть на пиво: Бусти[boosty.to]
37 Comments
Poldnik999  [author] Jan 4 @ 4:02am 
Guarantee, в индекс нужно вставлять сигнал-переменную с определенным значением, поставишь сигнал с пластинами 3, на выходе будет четвертый по очереди сигнал и не важно какой, пластины или руда. Отсчет индексов идет от 0. Туда лучше ставить буквы или что то похожее, а не предметы, чтобы самому не запутаться
Guarantee Jan 4 @ 3:54am 
Poldnik999, а как работает выбор сигнала по индексу? Я думал если я вставлю в индекс скажем предмет, то он будет выбирать только сигналы с этим предметом, но нет
Poldnik999  [author] Jan 3 @ 11:26pm 
У старой радарной станции много лишней логики, лучше использовать EXP версию, она хорошо работает, если на заводе небольшое количество депо.
Poldnik999  [author] Jan 3 @ 11:17pm 
У это комбинатора есть одна фишка которую я использую: Если у комбинатора интервал обновления, например, 120 тиков, то, чтобы сигнал был выбран и пошел на выход он должен существовать как минимум 120 тиков. В обратную сторону, если выбирающий комбинатор выдает какой то сигнал на выходе, то в независимости от того что на входе, сигнал будет жить 120 тиков
Poldnik999  [author] Jan 3 @ 11:17pm 
Guarantee, выбирающие комбинаторы из общего списка запросов выбирают один через настроенное количество тиков, и выбранный сигнал удаляется из общей сети, чтобы другие депо его не забрали. У выбирающего комбинатора много применений: сортировка, выбор одного сигнала по индексу, случайный перебор сигналов по тикам(как у меня).
Guarantee Jan 3 @ 12:02pm 
да как вообще работает этот выбирающий комбинатор. Что он выбирает и зачем
Guarantee Jan 3 @ 12:01pm 
"Проводится проверка на тот случай, если в двух депо выбирающие комбинаторы выбрали одинаковый запрос."
не понимаю каким образом проводится проверка(
Poldnik999  [author] Dec 24, 2024 @ 11:48pm 
Lomikk rus, В поезд нельзя отправить сразу несколько сигналов чтобы он ставил себе в расписание станцию с несколькими типами ресурса. Потенциально мультиресурсную станцию сделать можно, но простыми способами невозможно.
Lomikk rus Dec 24, 2024 @ 6:41am 
Существует ли возможность создания станции, которая будет запрашивать несколько типов ресурсов из нескольких станций снабжения?
Poldnik999  [author] Dec 7, 2024 @ 11:00am 
M1A1, ну я попробовал протестировать, у меня вообще не получается воспроизвести баг. Реально дай мне видео/стрим или скрины. Или можно даже сейв