Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

Аватара пользователя
Света
 
Сообщения: 489
Зарегистрирован: 18.06.2016, 19:38
Играю в: Train Simulator 2018
Роль: Разработчик
Блог: Просмотр блога (7)
Архивы
Поиск в блогах

1 из 52 из 53 из 54 из 55 из 5

Заградительный светофор

Постоянная ссылка Света 27.10.2018, 22:47

Изображение

Представляю вашему вниманию заградительный светофор.
Версия - 1.0

Светофор умеет:
- Находить общий язык с другими объектами инфраструктуры;
- Читать программу, заданную сценаристом, в заданное время закрывать/открывать путь, отчитываться о проделанной работе через лог-файл;
- Взаимодействовать с локомотивом игрока.

Изображение

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

Линковка светофора. Особенность работы заградительного светофора заключается в том, что при необходимости закрыть ограждаемый участок закрываются все обслуживающие его светофоры. Поэтому светофор оснащен двумя линками, один из которых (0) является рабочим и устанавливается традиционно, другой (1) - связным и используется для связи с другими светофорами группы.
При установке линка 1 необходимо придерживаться одного принципа - этот линк должен быть после линка 0 другого светофора группы и направлен в ту же сторону. Линк 1 последнего светофора должен быть после линка 0 первого, закольцовывая таким образом обмен. Количество светофоров при этом не ограничено.
Изображение

Если ограждение осуществляет всего один светофор, то его линк 1 располагается после собственного линка 0.

Обозначение светофора на литерной табличке. Вводится в левое поле Identity (на вкладке свойств светофора). Доступны литеры "П", "З" (верхний регистр) и цифры 0-9. Принцип ввода обозначения уже привычный по сигналке Игоря (ака I2GR). Единственное отличие - отсутствие в конце обозначения служебных символов (~ и т.п.) - их вписывать не нужно.

Настройка внешнего вида светофора. По умолчанию светофор оборудован расположенной по центру головой, низко заканчивающуюся характерную окраску мачты (наклонные черно-белые полосы). Если необходимо изменить вид светофора, впишите в правое поле Identity (на вкладке свойств светофора) дополнительные атрибуты:
-h (окраска мачты будет заканчиваться выше);
-l (голова светофора будет смещена влево);
-r (голова светофора будет смещена вправо);
-b (светофор будет оборудован дополнительной большой соединительной коробкой).
Атрибутом является сочетание дефиса и командного символа. Можно вписывать несколько атрибутов.
Пример:
-h-b - высокая окраска, распределительная коробка;
-l-b - левое смещение головы, распределительная коробка;
-h-b-r - высокая окраска, распределительная коробка, правое смещение головы

Порядок и регистр написания атрибутов не имеют значения.
Настройки вступят в силу после рестарта сценария.
Изображение

Задействование светофора в сценарии
Так как в симуляторе не происходят события, при которых мог бы сработать заградительный светофор, единственный способ его использования - сценарный. Для решения этой задачи предназначен маркер, передающий команду светофору. Его необходимо устанавливать перед светофором, которым этот маркер должен управлять.
Передаваемая команда вписывается в окошко вкладки, всплывающей при двойном клике по маркеру. Структура сценарной команды: "тип_команды-начало-конец-[атрибуты (опционально)]".

Тип сценарной команды. В данной версии есть 2 типа сценарных команд - время и приближение. Для обозначения используются символы "t" и "a". "t" предписывает светофору закрыться/открыться в указанное время, "a" - закрыться при приближении состава в заданный промежуток времени и открыться, когда этот промежуток закончится.

Начало/конец. Это время, когда светофор должен закрыться/открыться. Можно использовать два формата указания времени - задать конкретно время срабатывания, либо указать отсчет времени до срабатывания. Для того, чтобы указать время срабатывания, используется традиционный формат написания времени: "hh:mm:ss" (короткий вид - "mm:ss"). Прочитав такой формат написания, светофор будет ожидать наступления этого времени в игре, после чего отреагирует. Если же указать просто число (без разделителей), то светофор запустит обратный отсчет, по истечении которого сработает.
Пример:
10:15:35 - светофор сработает в 10 часов 15 минут 35 секунд игрового времени
5749 - светофор сработает спустя 5749 секунд (1 час 35 минут 49 секунд) с момента активации команды.
25 - светофор сработает спустя 25 секунд с момента активации команды.


Атрибуты предназначены для дополнительных настроек команды, к которой они приписаны. В данной версии возможны 2 атрибута: "-tab" и "-d(число)".
-tab - атрибут, разрешающий игроку самостоятельно открыть закрытый светофор. Если снабдить команду этим атрибутом, игрок сможет открыть закрытый светофор в любое время. В противном случае запрос "TAB" будет передан дальше по маршруту.
-d(число) - атрибут, позволяющий указать расстояние, на котором светофор отреагирует на приближающийся состав. Работает совместно с типом команды "a". Значение расстояния указывается после символа d. Диапазон значений - от 1 до 1250.
Примеры команд:
t-00:00:05-10-tab - закрыться по времени в 5 секунд после полуночи, через 10 секунд открыться, игрок может открыть "ТАВ"-ом;
a-15:45:00-600-d56-tab - начиная с 15:45 в течении 10 минут (600 сек) отслеживать приближение состава к светофору. Если состав приблизился менее, чем за 56 метров (d56), закрыться. По истечении 10 минут от начала отслеживания открыться. Или раньше, если игрок сделает запрос "ТАВ".
a-15-16:00:00 - через 15 сек после активации команды начать отслеживать приближение состава. Если состав замечен, закрыться (максимальное расстояние 1250 м), открыться (или прекратить отслеживание, если состава не было) в 4 часа вечера игрового времени. На запросы от игрока не реагировать.


Кроме сценарных команд есть служебная команда "log". Приняв такую команду, светофор начнет писать лог-файл. Место расположения логов - папка Log в корневой папке игры. Название лог-файла - "Zagr_Signal - 'имя_светофора'". Если папки Log нет, её нужно создать. Лог начинает писаться с момента активации команды "log", поэтому рекомендую вписывать эту команду самой первой в окне управляющего маркера.
Пример:
log,t-00:00:05-10-tab
log,a-15-16:00:00


Команды (как уже видно с предыдущего примера) пишутся через запятую, без пробелов. Количество команд не ограничено. Регистр не имеет значения. Каждая команда активируется после выполнения предыдущей.
Пример:
log,t-00:00:05-10-tab,a-15-16:00:00,t-01:25:05-01:45:00

Изображение

Примечание: Из-за некоторой погрешности в отсчете сценарного времени возможно незначительное запаздывание/опережение в работе светофора.

Воздействие светофора на ПС
Согласно моим исследованиям, участие заградительных светофоров в работе АЛСН заключается в прерывании передачи кодовых посылок от светофора к локомотиву. Окончательного решения как именно это происходит (замыканием или разрывом рельсовой цепи) мне найти не удалось, но технически в любом случае результатом является потеря локомотивным дешифратором кодов. Кроме того, так как данный светофор не является частью основной сигналки, а лишь дополняет её, было принято решение делать его совершенно независимым, следовательно на сообщения АЛСН от сигналки он не воздействует.
Поэтому светофор отслеживает перемещение ПС в своей зоне обслуживания и дает знать локомотиву, в какие моменты коды надо принимать, а в какие - нет. Сами же сообщения на локомотив поступают по прежнему. Исходя из этого, в обработчике кодов АЛСН локомотива была введена переменная, блокирующая поступающие сообщения непосредственно в дешифраторе.
Для тех, кто пожелает воспользоваться этим решением и научить свой локомотив взаимодействовать с данными светофорами, даю написанные мной функции:
Initialise(). Объявляются переменные. CodeBlock - это именно та переменная, которая получает значение true, когда заградительный светофор закрыт и коды принимать не нужно.
Код: Выделить всё
function Initialise()

   CodeBlock = false
   CodeBlockTab = {count = 0, status = "none", prevdist = 0}
   
end

Update (time). Вызывается функция сброса блокировки. Это для того, чтобы разрешить прием кодов АЛСН без специального разрешения от светофора, на случай, что светофор откроется.
Код: Выделить всё
function Update (time)

   CodeEnableControl (time)
   
end

function CodeEnableControl (argument)
   if CodeBlock then
      if Timer ("CodeBlock") then
         CodeBlock = false
         CodeBlockTab = {count = 0, status = "none", prevdist = 0}
      end
   end
end

OnCustomSignalMessage (ConsistMessage). Приняв сообщение от светофора, декодирует его, складывает в таблицу и отправляет эту таблицу в ZagradSign (data_message) на обработку.
Код: Выделить всё
function OnCustomSignalMessage (ConsistMessage)

   if string.sub(ConsistMessage, 1, 15) == "FSA-Controllers" then
      local data_message = string.split(ConsistMessage, ":")
      if data_message[2] == "Zagrad" then
         ZagradSign (data_message)
      end
   else
      -- Обработчик АЛСН
      
   end
end

ZagradSign (data_message). Обрабатывает раскодированные данные от светофора, принимает решение, блокировать прием кодов АЛСН или нет.
Код: Выделить всё
function ZagradSign (data_message)
   if math.abs (tonumber (data_message[5]) - Call("GetConsistLength")) < 5 then
      if data_message[3] == "transfer" then
         local distance_zagrad = tonumber (data_message[6])
         if gDistSig.Res > distance_zagrad then
            if distance_zagrad < CodeBlockTab.prevdist - 0.001 then
               if CodeBlockTab.status ~= "+" then
                  if CodeBlockTab.count > 2 then
                     CodeBlockTab.status = "+"
                     CodeBlockTab.count = 0
                  else
                     CodeBlockTab.count = CodeBlockTab.count + 1
                  end
               end
            elseif distance_zagrad > CodeBlockTab.prevdist + 0.001 then
               if CodeBlockTab.status ~= "-" then
                  if CodeBlockTab.count > 2 then
                     CodeBlockTab.status = "-"
                     CodeBlockTab.count = 0
                  else
                     CodeBlockTab.count = CodeBlockTab.count + 1
                  end
               end
            end
            CodeBlockTab.prevdist = distance_zagrad
            if CodeBlockTab.status == "+" then
               Timer ("CodeBlock", 2, "restart")
               CodeBlock = true
            end
         end
      elseif data_message[3] == "exit" then
         if CodeBlock then
            Timer ("CodeBlock", "clear")
            CodeBlockTab = {count = 0, status = "none", prevdist = 0}
            CodeBlock = false
         end
      end
   end
end

В предоставленном коде использованы функции string.split() и Timer (), опубликованные мной ранее.

Если у кого-нибудь возникнет желание написать собственный обработчик, то вот сообщения, передаваемые светофором:
"FSA-Controllers:Zagrad:transfer:имя_светофора:длина_ПС:расстояние_к_ПС:состояние_светофора (2-закрыт)" - передается посекундно при закрытом светофоре.
"FSA-Controllers:Zagrad:exit:имя_светофора:длина_ПС" - отсылается разово ПС, покинувшему отключенный блок-участок.

Установка
Пакет устанавливается традиционным способом, через менеджер пакетов, для отображения в редакторе необходимо подключить пакет FSA/Addon в фильтре активов. Светофор и маркер будут доступно во вкладке "Инфраструктура линии" под названиями "RU-UA Светофор заградительный вариант 1 2L" и "RU-UA Светофор заградительный. Управление." соответственно.


Светофор в игре. Скриншоты
Изображение Изображение
Данное дополнение разработано совместно с Андреем (ака BooYa), за что Андрею от меня огромная благодарность!
Также выражаю благодарность:
- Неизвестному (к сожалению) автору исходной модели с форума trainzup.com (если Вы автор, отпишитесь, пожалуйста);
- Косте (ака радиомастер) (модель маркера);
- Артёму (ака dison202,) (консультационная и не только помощь);
- Александру (ака Sanek_KRSK) (ссылка на исходную модель).
ИзображениеИзображение
Дополнения оттестированы в свободном и стандартном сценариях. Если всё-же обнаружится какой-нибудь недостаток в работе, прошу сразу же сообщать для его устранения. Конфликтов с инфраструктурой не выявлено. Лог чист.
Принимаются пожелания по добавлению новых команд/возможностей.
Последний раз редактировалось Света 28.10.2018, 13:21, всего редактировалось 2 раз(а).

Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
3 комментариев 424 просмотров
Комментарии

RE: Заградительный светофор

Постоянная ссылка semash 06.11.2018, 13:28

Света, что-то пошло не так :(
http://lostpix.com/?v=2018-11-06_r6dc7a ... 4ydlf4.jpg
Последний раз редактировалось semash 06.11.2018, 13:31, всего редактировалось 3 раз(а).
semash
 
Сообщения: 90
Зарегистрирован: 22.05.2018, 03:09
Имя: Sema
Блог: Просмотр блога (0)

Re: Заградительный светофор

Постоянная ссылка Света 07.11.2018, 08:55

Всё в порядке :).
После запуска игры останется только одна голова, в зависимости от выбранной настройки.
Никогда не опускай руки, ведь впереди тебя ждет еще так много поводов опустить руки, а ты уже опустил руки.
Аватара пользователя
Света
 
Сообщения: 489
Зарегистрирован: 18.06.2016, 19:38
Играю в: Train Simulator 2018
Роль: Разработчик
Блог: Просмотр блога (7)

Re: Заградительный светофор

Постоянная ссылка semash 08.11.2018, 20:03

Спасибо!
А то я испугался.
semash
 
Сообщения: 90
Зарегистрирован: 22.05.2018, 03:09
Имя: Sema
Блог: Просмотр блога (0)

Кто сейчас на конференции

Зарегистрированные пользователи: Bing [Bot], Google [Bot]