Представляю вашему вниманию пару путевых объектов, назначение которых - заставить составы под управлением АI подавать сигнал в нужные моменты.
Дополнение состоит из 2 объектов - "RU-UA Сигналы. Встречное движение" и "RU-UA Сигналы. Сигнал "Свисток" Авто".
Спойлер
Для уменьшения затрат времени процессора на обслуживание ПО, применен метод таймеризации работы. В отключенном состоянии ПО опрашивается с интервалом 12 сек, во включенном - интервал опроса зависит от расстояния между составом и точкой срабатывания, уменьшаясь до 0,5 сек перед этой точкой. Сразу после срабатывания ПО интервал опроса снова устанавливается в 12 сек. Когда состав покидает зону работы ПО, происходит отключение.
Срабатывание ПО имеет 2 этапа. В первом этапе (предупредительном) ПО устанавливает код, куда входит зафиксированное расстояние передней части состава. Во втором этапе ПО устанавливает код, инициирующий запуск функции "Signal" в составе.
Таймеризация ПО представлена в логе:
Код: Выделить всё
00:00:00 Пуск
00:00:12 Расстояние до м. 0 - -1123, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:12 Расстояние до м. 0 - -1123, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:24 Расстояние до м. 0 - -995, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:24 Расстояние до м. 0 - -995, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:36 Расстояние до м. 0 - -782, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:36 Расстояние до м. 0 - -781, расстояние до м. 1 - 0, дистанция - 1200, модуль отключен, тайминг - 12
00:00:48 Расстояние до м. 0 - -781, расстояние до м. 1 - -1182, дистанция - 1200, модуль отключен, тайминг - 12
00:00:48 Расстояние до м. 0 - -504, расстояние до м. 1 - -1182, дистанция - 1200, модуль отключен, тайминг - 12
00:01:00 Расстояние до м. 0 - -504, расстояние до м. 1 - -1033, дистанция - 1200, модуль отключен, тайминг - 12
00:01:00 Расстояние до м. 0 - -222, расстояние до м. 1 - -1033, дистанция - 1200, модуль отключен, тайминг - 12
00:01:12 Расстояние до м. 0 - -222, расстояние до м. 1 - -883, дистанция - 1200, модуль отключен, тайминг - 12
00:01:12 Расстояние до м. 0 - 60, расстояние до м. 1 - -883, дистанция - 1200, модуль включен, тайминг - 8
00:01:20 Расстояние до м. 0 - 60, расстояние до м. 1 - -783, дистанция - 723, модуль включен, тайминг - 7
00:01:20 Расстояние до м. 0 - 249, расстояние до м. 1 - -783, дистанция - 534, модуль включен, тайминг - 5
00:01:25 Расстояние до м. 0 - 249, расстояние до м. 1 - -721, дистанция - 472, модуль включен, тайминг - 4
00:01:25 Расстояние до м. 0 - 366, расстояние до м. 1 - -721, дистанция - 355, модуль включен, тайминг - 3
00:01:28 Расстояние до м. 0 - 366, расстояние до м. 1 - -684, дистанция - 318, модуль включен, тайминг - 3
00:01:28 Расстояние до м. 0 - 437, расстояние до м. 1 - -684, дистанция - 247, модуль включен, тайминг - 2
00:01:30 Расстояние до м. 0 - 437, расстояние до м. 1 - -659, дистанция - 222, модуль включен, тайминг - 2
00:01:30 Расстояние до м. 0 - 484, расстояние до м. 1 - -659, дистанция - 175, модуль включен, тайминг - 1
00:01:31 Расстояние до м. 0 - 484, расстояние до м. 1 - -646, дистанция - 162, модуль включен, тайминг - 1
00:01:31 Расстояние до м. 0 - 508, расстояние до м. 1 - -646, дистанция - 138, модуль включен, тайминг - 1
00:01:32 Расстояние до м. 0 - 508, расстояние до м. 1 - -633, дистанция - 125, модуль включен, тайминг - 1
00:01:32 Расстояние до м. 0 - 532, расстояние до м. 1 - -633, дистанция - 101, модуль включен, тайминг - 1
00:01:33 Расстояние до м. 0 - 532, расстояние до м. 1 - -621, дистанция - 89, модуль включен, тайминг - 0.5
00:01:33 Расстояние до м. 0 - 556, расстояние до м. 1 - -621, дистанция - 65, модуль включен, тайминг - 0.5
00:01:33 Расстояние до м. 0 - 556, расстояние до м. 1 - -614, дистанция - 58, модуль включен, тайминг - 0.5
00:01:33 Расстояние до м. 0 - 568, расстояние до м. 1 - -614, дистанция - 46, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 568, расстояние до м. 1 - -608, дистанция - 40, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 580, расстояние до м. 1 - -608, дистанция - 28, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 580, расстояние до м. 1 - -602, дистанция - 22, модуль включен, тайминг - 0.5
00:01:34 Расстояние до м. 0 - 592, расстояние до м. 1 - -602, дистанция - 10, модуль включен, тайминг - 0.5
00:01:35 Расстояние до м. 0 - 592, расстояние до м. 1 - -595, дистанция - 3, модуль включен, тайминг - 0.5
00:01:35 Расстояние до м. 0 - 604, расстояние до м. 1 - -595, дистанция - 1200, модуль включен, тайминг - 12
00:01:47 Расстояние до м. 0 - 604, расстояние до м. 1 - -446, дистанция - 1200, модуль включен, тайминг - 12
00:01:47 Расстояние до м. 0 - 886, расстояние до м. 1 - -446, дистанция - 1200, модуль включен, тайминг - 12
00:01:59 Расстояние до м. 0 - 886, расстояние до м. 1 - -297, дистанция - 1200, модуль включен, тайминг - 12
00:01:59 Расстояние до м. 0 - 1167, расстояние до м. 1 - -297, дистанция - 1200, модуль включен, тайминг - 12
00:02:11 Расстояние до м. 0 - 1167, расстояние до м. 1 - -147, дистанция - 1200, модуль включен, тайминг - 12
00:02:11 Расстояние до м. 0 - 1407, расстояние до м. 1 - -147, дистанция - 1200, модуль включен, тайминг - 12
00:02:23 Расстояние до м. 0 - 1407, расстояние до м. 1 - 2, дистанция - 1200, модуль включен, тайминг - 12
00:02:23 Расстояние до м. 0 - 1407, расстояние до м. 1 - 3, дистанция - 1200, модуль включен, тайминг - 12
00:02:35 Расстояние до м. 0 - 1407, расстояние до м. 1 - 152, дистанция - 1200, модуль отключен, тайминг - 12
00:02:35 Расстояние до м. 0 - 1407, расстояние до м. 1 - 152, дистанция - 1200, модуль отключен, тайминг - 12
Спойлер
С целью снижения потерь времени на обработку этой функции, применен метод динамической таймеризации, немного сходный с примененным в ПО. Единственное различие - интервалы опроса зависят от скорости движения состава.
Когда функция "обнаруживает" установленный на треке предупредительный код, происходит проверка местонахождения локомотива относительно ПО, и если разница между значением расстояний, присланного ПО и измеренном локомотивом, в допустимых пределах, включается разрешение на продолжение работы, иначе происходит блокировка. Цель всего этого - подготовить локомотив к приему команды и разрешить работу только первому локомотиву, если их несколько. Во время испытаний из 3 составов по 3 DMU, сцепленных вместе, свисток подавал только первый из них.
Спойлер
Путевой объект "RU-UA Сигналы. Встречное движение" устанавливается на 2-путных участках, при этом линки должны быть противонаправлены, а линк 0 направлен против направления движения!. Действие ПО будет распространяться на тот трек, на котором расположен линк 0.
Данный ПО действует только на участке 1200м за линком 0. Но в связи с наличием "мертвой зоны" в пределах 100м от линка (время реакции локомотивного дешифратора), следующий ПО желательно устанавливать на расстоянии не больше 1100 м.
Также, если трек под линком 0 предназначен для двухстороннего движения и оборудован светофорной сигнализацией в обоих направлениях, желательно линк 0 устанавливать перед линком 0 светофора как можно поближе к нему*.
При установке ПО в зоне действия другого ПО никаких конфликтов на этот момент не обнаружено. Локомотив мониторит ближайший к нему.
Модельки ПО видимы только в режиме редактора.
Также предусмотрена возможность использования ПО в режиме редактора сценариев.
*Вообще я пока не рекомендую применять ПО этой версии в таком режиме, так как пока не изучено их влияние на поведение трафика в таких условиях. Как вариант, можно линк 0 ПО ставить за линком 0 светофора, но тогда любой сигнал светофора (кроме зеленого) будет блокировать ПО
Спойлер
Код: Выделить всё
function MonitorRoute ()
if (Call ( "GetIsEngineWithKey" )) == 0 then
if ( MonitorTM + MonitorFr ) < Call( "*:GetSimulationTime") then
type, state, distance, aspect = Call("*:GetNextRestrictiveSignal", 1, 0, 1250)
type = type or 0
state = state or 0
distance = distance or 0
aspect = aspect or 0
MonitorTM = Call( "*:GetSimulationTime")
if MonitorAk == false then
if type == 1 and state == 1 and (aspect > 199 and aspect < 321) then
MonitorAk = true
end
elseif type == 1 and state == 1 and (aspect > 199 and aspect < 321) then
if SurveyCom == false then
local DistCtrl = ((aspect - 200) * 10)
if DistCtrl > (distance + 25) then
OperationEn = false
MonitorFr = 15
else
OperationEn = true
end
SurveyCom = true
end
elseif OperationEn == true and type == 1 and state == 1 and (aspect == 71 or aspect == 70) then
Signal (111)
if aspect == 70 then
MonitorFr = 3
OperationEn = false
else
-- MonitorFr = 0.5
end
else
MonitorFr = 2
MonitorAk = false
SurveyCom = false
OperationEn = false
end
end
end
end
function Signal (value)
value = value or 0
if ( HornAktiv == 4 ) or ( value ~= 0 ) then
if value ~= 0 and value >= 111 then
Property = tonumber(string.sub(value,1,1));
if Property < 3 then
SignMode= Property;
QuaSign = tonumber(string.sub(value,2,2));
DurSign = tonumber(string.sub(value,3,3));
else
SignMode = 1;
QuaSign = ( math.random (1, 3) );
DurSign = 1;
end
HornAktiv, Timer = 4, math.random (0.1, 1.5);
end
if ( Timer + DurSign ) <= Call( "*:GetSimulationTime") then
if HornAktiv == 4 then
Timer = Call( "*:GetSimulationTime");
if Call( "*:GetControlValue", Mode[SignMode], 0 ) == 1 then
Call( "*:SetControlValue", Mode[SignMode], 0, 0 );
if QuaSign > 0 then
else
HornAktiv = 0
SignMode, DurSign = 0, 0;
end
else
QuaSign = QuaSign - 1
if Property == 3 then
SignMode = ( math.random (1, 2) );
DurSign = ( math.random (1, 3) );
end
Call( "*:SetControlValue", Mode[SignMode], 0, 1 );
end
end
end
end
Mode = {"Horn", "Whistle"}
end
Код: Выделить всё
function Initialise ()
Timer = 0
HornAktiv = 0
MonitorFr = 2
MonitorTM = 0
MonitorAk = false
SurveyCom = false
OperationEn = false
Call( "BeginUpdate" );
end
Код: Выделить всё
function Update ( time )
Signal ()
MonitorRoute ()
end
Кроме того, в функции Signal () применена задержка перед включением тифона. Время задержки - случайное, от 0,1 до 1,5 сек, чтобы 2 одинаковых локомотива не начали гудеть одновременно .
Скриптом для Class166 можно заменить дефолтный, но бэкап обязателен, так как этот скрипт отрабатывался на Class166 времен Railworks 2.
Тестирование дополнений производилось на 2 маршрутах. ПС - Class166, BR294 (оба дефолтные), ТЭМ2. Сигнализация - британская, из маршрута "Экатеринбург - Глазго" и наша, на тестовом отрезке. Влияния ПО на работу сигнализации, поведение трафика и работу АЛСН не обнаружено.
ПРИМЕЧАНИЯ
1. Из-за того, что локомотив мониторит путь "позади себя", срабатывание ПО возможно только после проследования локомотивом линка 0! Также я не знаю, что считается "передом" при работе функции GetNextRestrictiveSignal - то, что впереди при движении, или то, что заложено как "перед" при создании модели. Поэтому я не гарантирую срабатывание ЛД при движении локомотива "хвостом" вперед.
2. ПО, кроме установки кода на треке, передает пользовательское сообщение с кодом "0619010301"
За предоставленную 3D-модельку искренне благодарю Артёма ака dison202. Выражаю благодарность с занесением в карму
Ну вот, как-то так. Надеюсь, этот труд будет полезен не только мне