Найти в Дзене
Формат АА

Виртуальные сигналы в прерываниях. Параметр сигнала в Factorio

Статья про тонкости игрового процесса в игре Factorio. В этой статье поговорим о виртуальном сигнале в игре Factorio — о параметре сигнала. Это третья статья из трёх о виртуальных сигналах. В этой статье говорится о параметре сигнала. (Первая статья о параметре предмета и параметре жидкости. Вторая статья о параметре топлива) Для всего цикла статей о виртуальных сигналах используется вот такая железная дорога с 1 поездом: Во второй статье мы рассматривали левую часть этой железной дороги, связанную со станциями заправки. В первой статье нас интересовала, а здесь теперь снова интересует, правая сторона железной дороги: В текущей статье поезд будет забирать груз на станции погрузки и увозить его на любую станцию разгрузки. Сами станции разгрузки мы здесь не рассматриваем, всё внимание будет уделено работе поезда и станции на погрузке. Параметр сигнала используется для подмены любых сигналов, которые являются логическими и могут нести любое значение совпадающее с заданным условием. Параме
Оглавление

Статья про тонкости игрового процесса в игре Factorio.

В этой статье поговорим о виртуальном сигнале в игре Factorio — о параметре сигнала.

Предисловие

Это третья статья из трёх о виртуальных сигналах. В этой статье говорится о параметре сигнала. (Первая статья о параметре предмета и параметре жидкости. Вторая статья о параметре топлива)

Вводные данные

Для всего цикла статей о виртуальных сигналах используется вот такая железная дорога с 1 поездом:

1. Имитация железной дороги для статьи с 1 поездом.
1. Имитация железной дороги для статьи с 1 поездом.

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

2. Рабочая часть железной дороги, используемая в статье.
2. Рабочая часть железной дороги, используемая в статье.

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

Параметр сигнала

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

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

Как это работает

Для текущего примера модернизируем станцию погрузки боеприпасов добавив в неё простейшую логику:

3. Добавлена логика в станцию погрузки.
3. Добавлена логика в станцию погрузки.

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

В настройках светофора оставляем включённой галочку «Считать сигнал». В настройках сравнивающего комбинатора устанавливаем проверку входящего зелёного сигнала на значение больше нуля. Когда светофор горит зелёным, то есть, путь свободен, тогда в комбинатор приходит зелёный сигнал размером в единицу, что больше нуля. На выход устанавливаем сигнал с галочкой, который будет отображаться пока светофор транслирует зелёный сигнал. Но чтобы не было путаницы в разных сигналах на станции (об этом позже) — обязательно придумываем нестандартное значение сигналу с галочкой. Например, я установил значение галочки 1961, в честь полёта первого человека в космос. Теперь «галочка» со значением 1961 будет транслироваться с комбинатора в станцию. В самой ж/д станции этот сигнал нигде не отображается, он транзитом передаётся в поезд, прибывший на эту станцию. Но чтобы сигнал смог от станции передаться в поезд, необходимо, как я писал ранее, включить галочку «Отослать в поезд»:

4. Включена галочка «Отослать в поезд».
4. Включена галочка «Отослать в поезд».

Ловим наш поезд, редактируем прерывание на разгрузку:

5. Изменение в прерывании разгрузки.
5. Изменение в прерывании разгрузки.

Добавляем к уже имеющемуся условию с проверкой незанятости станции на аванпосте И количеству груза в поезде >13 ещё одно условие через логический оператор И, а именно проверку виртуального сигнала «параметр сигнала» на равенство значению 1961. Теперь, чтобы поезд тронулся со станции погрузки на станцию разгрузки, ему необходимо убедиться, что станция разгрузки на аванпосте свободна И любых предметов в поезде больше 13 И логический сигнал пришёл со значением 1961. Не придёт сигнал с этим значением — поезд не поедет. Придёт сигнал с другим значением — поезд не поедет.

Итак, поезд прибыл на станцию погрузки. Логический сигнал «галочка» со значением 1961 пришёл в поезд напрямую через станцию из комбинатора и совпал с выставленным значением из условия расписания. Затем предметов было погружено больше 13, что тоже совпало с условием из расписания. Затем поезд убедился, что станция разгрузки на одном из аванпостов свободна и ожидает. Все условия совпали, поезд тронулся на разгрузку.

Ошибки и случайные недочёты

Первое, что сразу бросается в глаза: зачем использовать комбинатор? Зелёный сигнальный провод можно было кинуть напрямую от светофора на станцию. Выставить в условии прерывания значение параметра сигнала =1 или >0. Когда светофор горит зелёным — через станцию в поезд напрямую транслируется значение зелёного 1. Условие выполнено! Ну, ведь правильно же?

Нет. Это неправильно. Комбинатор здесь не ради украшения. Давайте без комбинатора подадим зелёный сигнал со светофора. Будет единица по условию и поезд сможет поехать. А давайте, вдруг окажется, что путь занят (чего мы, вероятно боялись, когда всё это придумывали). И тут бац, и красный сигнал равный единице! Он напрямую транслируется через станцию в поезд, а там... а там без разницы какой сигнал — главное, чтобы условие выполнялось. И всё, поезд уже навострил свои ушки, хвостик поджал и готов лететь что есть сил на станцию разгрузки. А нам так нельзя было...

Простейшее понимание ситуации: любой сигнал, который подойдёт под условие — будет принят поездом как правильный. Хоть это «галочка», хоть «зелёный», хоть «красный», хоть «N».

Теперь о единице или больше нуля. Хорошо, напрямую от светофора не будем кидать провод, но почему нельзя в комбинаторе выставить единицу, ведь там по умолчанию уже есть 1 в параметрах выхода, зачем было менять на 1961 (смотри рисунок 3)? А всё потому, что, как выше уже было сказано — любой сигнал поездом будет принят как правильный, если совпадёт. Если у нас будет логический сигнал «L» для станции, который указывает количество разрешённых поездов? Или у нас будет сигнал приоритета «P», указывающий приоритет станции в иерархии всех железнодорожных станций? Все эти сигналы могут случайно совпасть с тем, который был установлен как эталонный в условиях прерывания поезда.

Простейшее понимание этой ситуации: в условии прерывания виртуальный сигнал «параметр сигнала» должен быть равен или не равен/больше/меньше/как-то ещё иначе такому значению, которое будет совершенно не совпадать со случайными значениями, приходящими на станцию. Значение 1961 было выбрано для примера как раз по этой причине. Ни один из сигналов на этих станциях не имеет подобного значения и не сможет иметь, поэтому совпадения исключены.

А теперь о таком простом недочёте, который произойдёт у всех, решивших повторить пример из статьи. Поезд-то погрузился, узнал логический сигнал и сравнил его, проверил станцию и она свободна. Он прибыл на аванпост, разгрузился, и уже собрался ехать на другой аванпост. Проходит проверка на разгрузку: станция другого аванпоста свободна, груз >13, казалось бы, можно ехать, но... нет логического сигнала со значением 1961. Как ехать? Никак. Следующее прерывание — на погрузку. Оно проверяется, но не подходит. И поезд остановился навсегда.

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

Например, чтобы поезд мог ездить по всем станциям на испытательной железной дороге из статьи, просто устанавливаем такие же комбинаторы от всех светофоров к станциям, и везде передаём поезду: галочка=1961, если горит зелёный.

6. На всех станциях установлены комбинаторы для подачи одинакового сигнала.
6. На всех станциях установлены комбинаторы для подачи одинакового сигнала.

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

Здесь нужно напомнить, что в цикле статей про виртуальные сигналы с параметрами используются только прерывания. Нет постоянного расписания. Все условия прерываний формируют временное расписание. Любые ошибки в создании прерываний приводят к ошибкам в создаваемом расписании.

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

И ведь, казалось бы да, правильное решение. Но нет. То есть, с жёстким прописыванием конкретного логического сигнала всё будет работать. Ну, например, если прописать, что сигнал «галочка» должен быть равен 1961, то после погрузки, это будет проверено и дальше поезд будет проверять прерывание разгрузки чтобы уехать. Но такое не работает с виртуальным сигналом «параметр сигнала».

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

7. Поезд прибывает по сработавшему прерыванию погрузки с неправильным логическим сигналом в условии.
7. Поезд прибывает по сработавшему прерыванию погрузки с неправильным логическим сигналом в условии.

Смотрим рисунок 7. В целях прерывания на погрузку вместо жёстко прописанного конкретного логического сигнала вписан виртуальный сигнал параметра сигнала. В момент срабатывания прерывания поезд «знает» только логические сигналы ж/д станции, которые ему часто приходится обрабатывать. Туда, в том числе входит лимит количества поездов «L», а ещё идентификатор IDпоезда «T», или, например, приоритет станции «P». Поезд регулярно пользуется этими сигналами чтобы выбирать нужную станцию и контактировать с нею. Поэтому он возьмёт список сигналов, выберет из них первый — на рисунке видно, что это сигнал «L». Затем он создаст условие для погрузки поезда L=1961. И на станции будет стоять и ждать, когда придёт такой сигнал с таким значением.

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

Выводы

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

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

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

Чертежи

К этой статье нет чертежей. Чертежи публикуемые игроками можно скачать в текстовых файлах в моём канале Telegram в чате с чертежами.

-----------------------------------------

Прямая ссылка на мой канал Telegram: https://t.me/format_aa

☕️ Если вы хотите угостить меня кофе или вкусняшкой за старания, сделать это можно с помощью доната: https://boosty.to/format_aa/donate

-----------------------------------------

Подпишись на канал и узнавай больше +

#Формат_АА
#Factorio
#схема
#чертежи
#прерывание
#расписание
#виртуальный_сигнал
#параметр_сигнала