PDA

Просмотр полной версии : Сигнализация: конфигурация и скрипты


Страницы : 1 2 [3] 4

КЕ
02.05.2020, 18:41
РТС-ную можно, да только ничего там работать не будет, поедем по монитору пути. ))

vicente
02.05.2020, 20:00
Как он работает?
Логика маневрового:
Если блок не свободен, - аспект 0;
В остальных случаях при свободном блоке - дублирование аспекта маркера РЦ. Также учитываются линки.
Я выше выкладывал его полный скрипт.

Входной сигнал:
Если блок не свободен, а также если блок свободен, но следующий (маневровый) - 0 или 2 - аспект 0;
В остальных случаях - логика исходит из следующего сигнала. Если маневровый 1, входной будет 3 или 4 исходя из линка, далее при аспектах выше 2 маневровый дублирует выходной, так что там - обычная конвенциональная логика.

Добавлено через 1 час 8 минут
Такая логика маневрового позволяет ставить их несколько один за другим. Также у меня есть маневровые с логикой как в маркере РЦ как самостоятельного сигнала - вначале именно такие стояли на маршруте, а маркеров не было, пока, как я уже говорил, разработчик сигнализации Open Rails не "ослепил" сигналы, ограждающие точки. Маршрут огромный, так что, где-то они у меня ещё валяются на каких-то станциях. Там ставил оба типа маневровых. Последним был тот,,который с логикой маркера, остальные - те, что я описал.
Также есть станции "классические" - входной и выходной. Там другие светофоры, почти не отличающиеся от оригинала от Timas.

SNCA маневрового и РЦ в Open Rails - "-1". Это позволяет не завышать параметр у остальных светофоров. В MSTS эта логика тоже работает. Но, там, как известно, SNCA берется самый высокий в конфигурации. У меня в MSTS-овском варианте стоит "7", но это зависит от маршрута. В смысле, сколько маневровых на больших станциях стоят один за другим, а также - от устройства станций с маневровыми и маршрутными светофорами.

КЕ
02.05.2020, 20:26
пока, как я уже говорил, разработчик сигнализации Open Rails не "ослепил" сигналы, ограждающие точки
Это когда сигнал в STOP - он не читает, что за ним дальше?

vicente
02.05.2020, 21:49
Не когда STOP, a когда он !enabled. Не определяет route_set (). И состояние блока - возвращает всегда BLOCK_JN_OBSTRUCTED. Насчет сигналов - надо потестить. Я не использую это

Добавлено через 11 минут
В смысле, нет такой ситуации, когда мне маневровым !enabled нужно знать состояние следующего сигнала.

Добавлено через 37 минут
Тем более, в Open Rails, где enabled () работает отлично от MSTS

vicente
03.05.2020, 15:47
Эх, где бы я ещё так славно, долго, а главное - качественно потрахался, как не с сигналкой в симуляторе!
Короче, долбился я, долбился с этим маневровым показанием - со временем даже то, что, вроде, работало из функций, начало "глючить". Маневровый перестал "видеть" оппозит и т.п. Думаю, я "нагромоздил" там условий и есть какие-то взаимоисключающие. В общем, переписываю "с нуля" скрипт проходного. :D

Добавлено через 2 минуты
Дал ему
if (block_state ==# BLOCK_JN_OBSTRUCTED...
А ниже:
if (block_state !=# BLOCK_CLEAR...
И он первое не выполняет

КЕ
03.05.2020, 17:50
То есть даже без else перед if (block_state !=# BLOCK_CLEAR... не проверяет?

vicente
03.05.2020, 23:57
Да, там сам черт ногу сломит - разбираться почему не сработало. У меня первый проходной (ну, в смысле, вообще все проходные) - довольно ёмкий сигнал. Первым проходным он становится через флаг. Если этот флаг включен и светофор !enabled - он 1 (на однопутках первый проходной - 2 - не суть - на оба этих аспекта выходные были запрограммированы давать маневровый сигнал (сейчас я изменил условие с новой функцией - я показывал). Ну, и под этим - целый блок с показаниями при аспекте 1, согласно занятости перегона. Плюс учтена возможность давать ЖМ и ЗМ, потому что первый проходной может быть и предвходным одновременно.
Затем идёт блок для обычного движения, когда светофор enabled. Но само условие enabled я, в своё время, не вписывал - не нужно было. И весь блок идёт просто под else if (....
Подозреваю, что этот store_lvar не в любое место скрипта можно запихнуть.
Ну, и условия эти...
if (block_state ==# BLOCK_JN_OBSTRUCTED... стоит в первом блоке, под !enabled, a if (block_state !=# BLOCK_CLEAR... - в блоке под else if (...
Может, в этом проблема, я хз.
Так как скрипт всё равно переписывать, копать дальше не вижу смысла

Добавлено через 1 час 4 минуты
Упс... прошу прощения. Там было не else if (..., a просто else (..., a уже внутри, отдельно , было if (...
Короче, многоэтажка, родившаяся в тестах и не приведенная в "товарный вид" потому что... ну, работало и так... :D

Добавлено через 4 минуты
Потихоньку начинаю стороить проходной. Вот "тело":
next_state = next_sig_lr (SIGFN_NORMAL);

state = SIGASP_CLEAR_2;
direction = this_sig_lvar (1);

if (block_state() ==# BLOCK_OCCUPIED)
{
state = SIGASP_STOP;
}
else if ((next_state ==# SIGASP_STOP) || (next_state ==# SIGASP_STOP_AND_PROCEED) || (next_state ==# SIGASP_RESTRICTING))
{
state = SIGASP_APPROACH_1;
}
draw_state = def_draw_state (state);
if (next_state ==# SIGASP_APPROACH_2)
{
draw_state = 4;
}
else if ((next_state ==# SIGASP_APPROACH_3) || (next_state ==# SIGASP_CLEAR_1))
{
draw_state = 5;
}
else if ( direction ==# 1)
{
draw_state = 6;
}
if (!enabled && has_number_plate)
{
if (block_state ==# BLOCK_JN_OBSTRUCTED)
{
state = SIGASP_RESTRICTING;
store_lvar (1,1);
}
else
{
store_lvar (1,0);
}
}

draw_state = 6 - не горит. Потом можно будет через функцию "гасить" весь перегон.

Скрипт полностью рабочий. Забирай :drinks:

Добавлено через 2 минуты
Пока оставлю его так. Пойду к маневровому, "ловить" этот самый direction :crazy:

КЕ
04.05.2020, 10:52
Думаю все-таки точнее потестить с нулевыми стрелками границы станции и обратной головой на входном.
Нет, не буду, это только путаницу создаст в горловине...

vicente
04.05.2020, 15:22
Перед тестами на маршруте (неизвестно когда :cool: )

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

1uSa7pqN0_w

Табло со стороны перегона показывает когда запоминается переменная, отвечающая за направление:

{
state = SIGASP_RESTRICTING;
store_lvar (1,1);
}

Добавлено через 47 минут

Костя, ты говорил о 3d кабинах...
Нашёл у себя на канале старое видео. Сигнализации тоже касается, я там барабан "ковырял руками" - в конце видео обрати внимание: что показывает АЛСН на красный :p

QbZjfQ1UmqE
Ха-ха.. сам лок - попробуй найди ещё.. в моём-то бардаке :crazy:

КЕ
04.05.2020, 16:36
Идеально сработано! ))

{
state = SIGASP_RESTRICTING;
store_lvar (1,1);
}
Есть еще примеры использования этих новых переменных? Смысл чисел в скобках?..
что показывает АЛСН на красный
Хорошо показывает!:drinks:
Но всё остальное горит жёлтым...

vicente
04.05.2020, 17:47
Это первый раз, когда я использовал их. Потому и много времени взяло. Пришлось посовокупляться - я не мог быть уверен: когда данные передаются, когда по каким-то причинам нет, а когда я "лажаю" с условиями в программе. Самое трудное было сбросить условия , когда лок проехал сигнал. Я там долго "крутил". Три головы, одна сбрасывает, две остальные тут же ставят эти переменные опять. Я ещё думал оставить белый маневровый гореть пока поезд не "коснется" маркера РЦ... мечтатель, блин.


Первая циферь в скобках - "разряд", вторая - само значение. Можно запоминать их сколько угодно! Под каждым "разрядом" - своя переменная. В смысле, под (1,Х) - одни переменные, (2,Х) - другие и т.д.

Добавлено через 2 минуты
Идеально сработано! ))

Надо ещё "доработать напильником", чтобы белый не зажигался. Поезд в этот момент за 2 блок-участка и не видит этого, конечно. Но, остальные - видят.

Добавлено через 1 минуту

Но всё остальное горит жёлтым...
Неее...
Там все аспекты работают. Просто на видео он на 2Ж и Ж едет только.

КЕ
04.05.2020, 17:51
Олег, из твоего проходного:
direction = this_sig_lvar (1);
- почему здесь одна цифра?
И сами числа - как в аспектах, от 0 до 7, или неважно?
...оставить белый маневровый гореть...
Это только с маневровыми К-Б:
if (enabled && block_state() != BLOCK_JN_OBSTRUCTED ) state = 2; // белый маневровый
else state = 0;
Белый сменяется на красный, когда сервис уходит за узел.

vicente
04.05.2020, 19:20
Когда "обращаешься к хранилищу" - вносишь только разряд - одна цифра. А, функция уже достаёт из этого "разряда" переменную - вторую цифру

Добавлено через 1 час 11 минут

Это только с маневровыми К-Б:
if (enabled && block_state() != BLOCK_JN_OBSTRUCTED ) state = 2; // белый маневровый
else state = 0;
Белый сменяется на красный, когда сервис уходит за узел.
Ты в Open Rails это давно пробовал?
ИМХО, работать не будет. В смысле, сигнал перекроется сразу, если он NORMAL

КЕ
04.05.2020, 19:25
Да, это давно было. Я такими маневриками давно не занимался...
Хрена се... перекрывается и гаснет вообще на оба глаза, гад...
А, все, исправил. В конфиге вместо STOP - S.A.P. был.

vicente
04.05.2020, 20:36
По определению, в Open Rails светофор позади сервиса - !enabled , и если он ограждает узлы, функция block_state не проверяется. У такой сигнальной головы она всегда будет возвращать BLOCK_JN_OBSTRUCTED

vicente
04.05.2020, 23:57
Вот упрощённый скрипт маневрового.

next_state = next_sig_lr (SIGFN_NORMAL);
interval = opp_sig_id (SIGFN_NORMAL);
main = id_sig_lvar(interval, 1);
shunt = this_sig_lvar (1);

if (!enabled || block_state() !=# BLOCK_CLEAR || !route_set () )
{
state = 0;
if (!enabled && (this_sig_lr (SIGFN_NORMAL) <# 1))
{
store_lvar (1,0);
}
}
else
{
state = next_state;
if (main ==#1)
{
store_lvar (1,1);
}
}
draw_state = def_draw_state (state);
if ((state ==# 1) && (shunt ==# 0))
{
draw_state = 1;
}
else if ((state ==# 2) && (shunt ==# 1))
{
draw_state = 0;
}
else if ((state ==# 0) && (this_sig_lr (SIGFN_NORMAL) ># 0))
{
draw_state = 2;
}

Это одна линкованная сигнальная голова. На все линки - тот же скрипт. Один-в-один.

Надеюсь, это поможет сообществу. Для меня это не окончательный вариант. Я уже говорил о "напильнике". Кроме того, эта разработка для однопутного перегона, оборудованного двусторонней автоблокировкой. На многопутных будет по-другому. Кроме того, со временем в планах - маршрутные и сложные по строению станции... это вообще будет жесть.
(Если честно, я даже боюсь взглянуть на скрипт маршрутного :D). Но, сначала - Timetable Mode.
Посему, на том откланиваюсь... пока... и возвращаюсь к сценариям.
До новых встреч! :drinks:

КЕ
05.05.2020, 00:20
Но для чего маневровому линки? Прямой или боковой путь - показание одинаковое. Я что-то пропустил??

vicente
05.05.2020, 00:41
Показания одинаковые. Скорости - разные :)

Добавлено через 9 минут
В принципе, на сегодняшний момент в Open Rails есть сигнальные головы SPEED, но, они несовместимы с MSTS. На новых маршрутах их можно расставить. Я не буду перерасставлять сигналы на своём маршруте, длина которого, что-то в районе 800 км только главного хода. Всё, что я делаю -всегда подразумевает то, что маршрут свой я не трогаю. Манёвры можно было и по-другому оформить. И ещё много чего поменять. Но, для меня это - "топтаться на месте".

vicente
07.05.2020, 04:17
Прошу прощения. В скрипт проходного (http://www.trainsim.ru/forum/showpost.php?p=593055&postcount=507) закралась ошибка.
Исправленный вариант под спойлером.

next_state = next_sig_lr (SIGFN_NORMAL);

state = SIGASP_CLEAR_2;
direction = this_sig_lvar (1);

if (block_state() ==# BLOCK_OCCUPIED)
{
state = SIGASP_STOP;
}
else if ((next_state ==# SIGASP_STOP) || (next_state ==# SIGASP_STOP_AND_PROCEED) || (next_state ==# SIGASP_RESTRICTING))
{
state = SIGASP_APPROACH_1;
}
draw_state = def_draw_state (state);
if ((block_state() ==# BLOCK_CLEAR) && (next_state ==# SIGASP_APPROACH_2) )
{
draw_state = 4;
}
else if (((block_state() ==# BLOCK_CLEAR) && (next_state ==# SIGASP_APPROACH_3))
|| ((block_state() ==# BLOCK_CLEAR) && (next_state ==# SIGASP_CLEAR_1)) )
{
draw_state = 5;
}
else if ( direction ==# 1)
{
draw_state = 6;
}
if (!enabled && has_number_plate)
{
if (block_state ==# BLOCK_JN_OBSTRUCTED)
{
store_lvar (1,1);
}
else
{
store_lvar (1,0);
}
}

Поправка выделена. Без неё Жм и Зм будут открываться на занятый блок-участок.
Ещё раз, прошу прощения.

Как бы изловчиться и сделать вот так:
vQlHcR7TFHs
:cool:
?

Добавлено через 45 минут
xkAD23p6xmY

КЕ
07.05.2020, 09:28
А про Жм и Зм я тоже тогда подумал, но потом забыл спросить...
Первое видео - это МСТС?
Мне бы тоже хотелось, чтобы попутные проходные сзади горели...

vicente
07.05.2020, 13:30
Оба видео - ОР.
У в старой версии горят впереди поезда по SNCA, ререкрываемый после проезда поезда горит красным по не свободному блоку, потом он "желтеет" , а уже затем - гаснет. Но, что-то там начало "глючить" и, нет-нет, предвходные горели желтым даже против движения.

Блин, "затягивает" сигналка... :confused:
Хотел сценарий в Timetable "продвигать" , а "увяз" здесь.

Я поставил на маршруте новые светофоры, которые разоаботал , пришлось "полетать" в редакторе и добавить на двухпутной односторонней АБ обратно-глядящие головы на проходных , чтобы маневровые работали, потому что я манёвры всегда в сторону перегона на правильный путь строю. Потом подумал про однопутку, да и на двухпутном, в случае , когда сервис по неправильному пути, я так понял, правильное направление надо гасить.

Добавлено через 6 минут
Кроме "глюка" с желтым предвходным на двухсторонней АБ и того, что всё направление не горит (хотя, в принципе, длинных перегонов таких у меня нет), меня не устраивает, что, когда на перегоне никого нет и никто не расчищает себе маршрут, проходные не горят ни в одном из направлений.
Вот я и подумал: раз теперь есть функция запоминания, поправить саму работу светофоров и даже запомнить последнее рабочее направление

Добавлено через 1 час 10 минут
Короче...
Направление запоминать я их "научил" (чуть позже будет ролик). В смысле, остаётся гореть то направление, по которому прошел последний сервис. Но, проблем осталось - вагон и маленькая тележка!
Во-первых, "изначально" , то есть, в начале сцены, пока ни один поезд не прошел, горят оба направления.
Во-вторых, когда происходит смена направления, от открытия выходного и пока сервис не заходит за обратный маневровый, также горят оба направления - тоже не айс.
Но, если эти два пункта ещё можно решить, то с третьим - ума не приложу: что делать. Дело в том, что...
В-третьих, чертов Open Rails учитывает пути сервисов и длину поездов. Таким образом, скажем, при выезде локомотива в маневровом режиме и смене направления его движения между входным и маневровым, симулятор может вполне выпустить встречный сервис до входного. Я тестил этот момент когда SNCA проходных был 4 - скрипт "ловил" направление выезжающей ЧМЭ-ухи и гасил направление и перед встречным горели только 4 светофора. Ночью я "добил" запоминание, в частности, изменив параметр SNCA на "-1" . Что сейчас со встроенным направлением происходит в этом случае, пока не тестил. Возможно, придётся на этот случай разрабатывать блокировку.
Костя, ты работал с функцией dist_multi_sig ()? Знаешь как она точно работает в конце участка проверки? Если я буду проверять весь перегон до маневрового, "повесив" ограничитель на него, проверка будет включать сам маневровый?

КЕ
07.05.2020, 13:46
...Костя, ты работал с функцией dist_multi_sig ()? Знаешь как она точно работает в конце участка проверки? Если я буду проверять весь перегон до маневрового, "повесив" ограничитель на него, проверка будет включать сам маневровый?
Что-то пробовал давно; но сейчас не помню ничего...
А что за ограничитель?

vicente
07.05.2020, 14:09
В эту функцию вводится два параметра SigFn_Type
Классическим вариантом по докумнтаци Kuju MSTS является dist_multi_sig_Xr*(SigFn_NORMAL, SigFn_DISTANCE) . Дословно это работает, как "ищи наиболее/наименее ограничивающий аспект сигнальных голов первого указанного типа , пока не встретится сигнальная голова второго типа". Это и есть ограничитель. Функция возвращает соответствующий аспект на заданном участке пути.

КЕ
07.05.2020, 14:15
Вспоминаю... я так понял, что если, например, я эту проверку сделаю в первом проходном, то она вернет аспект входного светофора (стоящего перед узлом) в конце всей цепочки проходных. Так?

vicente
07.05.2020, 15:46
Если проверять _mr и перегон свободен - то да. Но, я запутался. Нельзя так делать. Нельзя вмешиваться в уже готовый маршрут скриптом. Вообще, там бред какой-то происходит. Сигнал должен блокироваться симулятором! Я там в мини сцене своей начудил и свёл сим с ума :crazy:
Сервис игрока стартует на пути трафика "лоб в лоб". Из-за того, что у игрока - точка разворота за маневровым, сим пытается "разрулить" патовую ситуацию и "протолкнуть" манёвры перед идущим навстречу поездом. А, бред заключается в том, что вместо того, чтобы остановить маневровый на выходном, а поезд на входном на "вечный красный", сим выпускает игрока при любом раскладе. В последних ночных тестах маневровому вообще горел красный 0. Я включал автопилот и ЧМЭ-уха преспокойно этот красный проезжала.

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

Добавлено через 7 минут
Через пол-часа расчехлю ноут и попробую.

Добавлено через 51 минуту
http://i.piccy.info/i9/a10e0acc87381ebfaf57aa08997ed1d8/1588852096/92888/1373151/RunActivityLAA_2020_05_07_14_27_04_54_800.jpg (http://piccy.info/view3/13793512/317d6e77046f1cf7c085f3f7b01ea5ce/orig/)http://i.piccy.info/a3/2020-05-07-11-48/i9-13793512/763x559-r/i.gif (http://i.piccy.info/a3c/2020-05-07-11-48/i9-13793512/763x559-r)
Да, с блокировкой нормально всё. Неправильный старт сервиса. Я уже писал об этом. Правильно стартовав,описанных мной прежде ситуаций можно и нужно избегать.

КЕ
07.05.2020, 15:54
Если проверять _mr и перегон свободен - то да.
Именно _mr? А _lr не работает?

vicente
07.05.2020, 15:56
Обратите внимание, откуда встречный заблокировал игрока. он сейчас находится на соседней станции и не проследовал выходной там. Короче, с симулятором всё в порядке.. При правильном обращении...

Добавлено через 1 минуту
Именно _mr? А _lr не работает?
Работает. Но, ты же именно наиболее запрещающий хочешь "через перегон" искать, не так ли?

КЕ
07.05.2020, 16:01
Я или забыл или не понял еще, как этой функцией правильно пользоваться...

vicente
07.05.2020, 16:02
Если верхний ловишь - lr, нижний - mr.

КЕ
07.05.2020, 16:03
Кажется, понимаю - проходные открыты, входной закрыт, вот он по _mr и определится, так?
А в видео второй раз все было правильно - правый путь трафику был альтернативный?

vicente
07.05.2020, 16:12
B3yYT1V-RuY

Добавлено через 4 минуты
Кажется, понимаю - проходные открыты, входной закрыт, вот он по _mr и определится, так?
Так. Но, это из раздела "спрашивали - отвечаем". Я её юзать не буду. Блокировки работают, я только что об этом писать. Дополнителльную блокировку скриптом ставить смысла не вижу.
А в видео второй раз все было правильно - правый путь трафику был альтернативный?
Конечно правильно. Я "диспетчером" встречному один из проходных перекрыл - вот и "было". Я другое хотел показать в том видео.

КЕ
07.05.2020, 16:19
После прохода сервиса проходные остаются зелеными - не !enabled?
Запоминание не теряется при прокладке маршрута другому сервису?

vicente
07.05.2020, 16:58
В смысле - зелёными??? Когда блок занят, они красные, когда следуюший красный и блок свободен - желтые... Скрипт посмотри.
Они !enabled, естественно. В этом-то и фишка :D
Да, по аспектам проходные по возможности к enabled () не привязаны.

Добавлено через 12 минут
Насчет запоминания. В данном варианте (он промежуточный и будет дорабатываться) "запоминает" входной. Проходные тупо проверяют переменную входного по next_sid_lvar (X). Когда там "единица" , они не горят по draw_state и "помнят" эту "единицу" даже если на входном её уже нет. Перестают они её помнить, когда проходной становится enabled.

Добавлено через 1 минуту
Из-за того, что SNCA проходных "-1", enabled они получают все сразу - вне зависимости от того, сколько их.

КЕ
07.05.2020, 17:21
Ну в общем-то логично.
В смысле - зелёными???
После желтого, при удалении сервиса.

vicente
07.05.2020, 18:03
Ну, так, так и должно быть, нет?
На двухпутных односторонних АБ они у меня тоже к enabled () не привязаны. Автоблокировку можно реализовать либо так, либо повесив сигнальный флаг ABS, как в американском дефолтном Marias Pass. Я давно его не вешаю, а просто не привязываю его показания к этой функции. Поэтому и светофоры зеленые. В противоположном направлении они тоже должны были быть зелёными, но я гашу их через зависимость draw_state "не горит" от переменной, которую цепочка светофоров запомнила когда есть встречное движение.

КЕ
07.05.2020, 18:21
Как они определяют встречное движение?

vicente
07.05.2020, 19:41
Так же, как первый проходной определят его для противостоящего маневрового. Через BLOCK_JN_OBSTRUCTED. Только, на этот раз, направление ловит противостоящий входной, стоящий перед ним предвходной ловит "единичку" функцией next_sig_lvar () и запоминает значение в своём скрипте посредством store_lvar (). Все остальные проходные на перегоне также запоминают переменные: каждый "снимает" показания той же функцией с последующего (скрипт-то один). Проходные хранят информацию пока они не получают TRUE в enabled ().

vicente
07.05.2020, 23:06
Самое гадкое в этом механизме - это то, как в Open Rails перекрывается сигнал! Это просто какая-то жопа! И, я не могу поймать точную закономерность. Но, очень часто он перекрывается с разрешающего на запрещающее показание именно через BLOCK_JN_OBSTRUCTED !
Когда я разрабатывал маневровый, в тестах было видно по табло аспектов, что с 7 сначала на долю секунды аспект загорался белым 2, и только затем опускался на красный 0. В большинстве случаев это ничего не меняет, даже в случае с маневровым тем - покуда это происходит, когда поезд - по ходу сигнала. Тот же маневровый ловил этот BLOCK_JN_OBSTRUCTED по оппозиту, то есть , он должен быть enabled , чтобы ловить оппозит. В том, чем я сейчас занимаюсь - совсем другое дело. Никакого оппозита - проходные снимают данные со следующего сигнала, когда все сигналы - !enabled! Так что, приходится это всё учитывать. Я думаю, что по-любому входным определять направление я не буду в конце-концов. Перенесу это дело на маркер РЦ. Он будет ловить встречное направление. А, вот со сбросом надо думать. Проходные работают по переменной входного. Нужно найти такую совокупность условий входного, маневрового за ним и маркера РЦ, чтобы это BLOCK_JN_OBSTRUCTED и близко в этой части скрипта не было

vicente
10.05.2020, 13:31
Очевидно, нужно уточнить.
Сигнал со значением SNCA = -1 с этой функцией работает отлично от остальных. Я говорил о том, что, по определению, такой сигнал "не учитывается" в расчете сигналов впереди поезда, к которым тот "обращается". Количество таких сигналов зависит напрямую от SNCA . Прописать в такой сигнал что-то, зависящее от enabled () - дело хлопотное. Не то, что это невозможно вообще, просто нужно быть внимательными и всегда помнить о том, где оно может сработать, а где - нет. С другой стороны, верно и утверждение, что если SNCA "перескакивает" сигналы с -1, то все запрограммированые зависимости автоматически "передаются" первому сигналу с "положительным" (или "нулевым") SNCA .
Вот как это объясняет разработчик логики сигнализации Роб Ротердинк:
Значение SignalNumClearAhead не имеет ничего общего с enabled (). Оно лишь указывает, должен ли быть распространен запрос на очистку сигнала, то есть если он должен распространяться до следующего сигнала. Она [функция] применима только для сигнальных голов типа NORMAL, а значение «-1» указывает, что запрос должен всегда распространяться независимо от значения SignalNumClearAhead для исходного сигнала и количества уже распространенных сигналов.
Другими словами, если сигнал NORMAL со значением SignalNumClearAhead, равным -1, запрашивается для очистки, и сигнал действительно может очищаться, то он всегда будет распространять этот запрос на следующий сигнал.

Когда сигнал enabled - это означает, что поезд «приближается» к данному сигналу, для этого поезда установлен правильный маршрут, ведущий к этому сигналу, и поезд запрашивает этот сигнал для очистки.
Но, это - идеология. На практике же есть вещи, которые всё же можно прописывать. К чему это я? Я раннее писал:
Проходные хранят информацию пока они не получают TRUE в enabled ().
Я не знаю, насколько корректно утверждение "получают TRUE в enabled ()", Ротердинк, скорее всего, не согласился бы с таким утверждением и написал бы статью в опровержение. Но, факт остается фактом. Такая логика протестирована мной и работает.

КЕ
10.05.2020, 13:37
Что понимается под очисткой? Сброс аспектов?

vicente
10.05.2020, 15:16
Под очисткой понимается возможность сигнала "открыться". Повторюсь, его терминология немного отличается от нашего понимания. У нас на пустом перегоне проходные сигналы в обоих направлениях "открыты" по умолчанию. Он пишет что они "не очищены"? Ну, так... пусть. Что для нас важно в вопросе enabled ()? Что эта функция работает отлично от того, как она работает в MSTS! Что бы он не писал, я на тестовом своём отрезке поставил семи проходным SNCA = 4, сам сигнал прописал "горит", коглда он enabled и у меня было ровно 4 горящих сигнала перед поездом. Отличие от MSTS по самой enabled () заключается в том, что в Open Rails функция распространяется только на сигналы впереди сервиса. В MSTS есть ещё два направления относительно сервиса, где светофоры enabled: позади сервиса и впереди сервиса сигналы в противоположном направлении . Я тестил это ещё 9 лет назад. Скрины, к сожалению, не сохранились, но почитать можно здесь (http://forum.zaborin.ru/topic.php?forum=20&topic=3&postid=1313577347#1313577347).

Добавлено через 5 минут
Демонстрация работы выходного сигнала в зависимости от пути сервиса с использованием функции train_requires_next_signal ()
0M5j9LMtjoM

КЕ
10.05.2020, 17:26
train_requires_next_signal () - какие есть примеры использования в скрипте?

vicente
10.05.2020, 19:20
Здесь (http://www.trainsim.ru/forum/showpost.php?p=592736&postcount=435) под спойлером.

vicente
18.05.2020, 01:28
4jZKQkQiMEQ
:cool:

Forsayth
08.10.2020, 12:30
Подскажите пожалуйста! Как правильно прописать в скрипте сигнализации, строчки: BACK_FACING и SignalFlags ( OPTIONAL BACK_FACING ), чтобы можно было развернуть маркер дополнительной повторительной головы выходного светофора? Чтобы дополнительная голова сигнализировала против направления движения.

http://scbist.com/photoplog/images/4574/small/1_4086.jpg

vicente
09.10.2020, 02:46
Ну, я в ЛС ответил. Здесь, правда для меня удобнее.
Единственное дополнение - когда развернёшь шейп и будешь устанавливать - маркер должен стоять перед маркером выходного. А потом уже двигать голову, чтобы она "села" на мачту.

Добавлено через 1 минуту
Мачта повторитеотного убирается в опциях в редакторе маршрутов.

Добавлено через 12 минут
Спасибо огромное)
Только маленький глюк произошел и линза зеленого огня не развернулась(
Линзу надо "подгонять" в конфигурации.
В блоке
SignalLights ( 2
SignalLight ( 0 "Green Light"
Position ( 0 7.475 0.01 )
Radius ( 0.28 )
)
SignalLight ( 1 "No Light"
Position ( 0 -1 0 )
Radius ( 0.01 )
)
)
поиграй с координатами

Добавлено через 4 минуты
А, вот, как сделать, чтобы оно в другую сторону светило... надо подумать :confused:

Forsayth
09.10.2020, 02:49
поиграй с координатами

Добавлено через 4 минуты
А, вот, как сделать, чтобы оно в другую сторону светило... надо подумать :confused:

Линза по координатам правильно расположена. Но, она светит в противоположную сторону. Сейчас сам голову ломаю. :confused:

vicente
09.10.2020, 03:13
А, если так попробовать?
Замени блок шейпа в sigcfg.dat на вот это:
SignalShape (
"T_Signal_Head_G.s"
"Repeater Signal G"
SignalSubObjs ( 5
SignalSubObj ( 0
"SIGNAL" "Default Main Track Signal"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "T_Head_G" )
)
SignalSubObj ( 1
"Footing_metal" "Metal footing"
SigSubType ( DECOR )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 2
"Footing_concrete" "Concrete footing"
SigSubType ( DECOR )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 3
"Stairway" "Stairway"
SigSubType ( DECOR )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 4
"SIGNAL" "Optional Back Facing Signal"
SigSubType ( SIGNAL_HEAD )
SignalFlags ( OPTIONAL BACK_FACING )
SigSubSType ( "T_Head_G" )
)
)
)
Поставь сигнал (надо удалить старый и поставить его снова после редактирования конфигурации) и посмотри, появилась ли вторая линза

Forsayth
09.10.2020, 03:19
Поставь сигнал (надо удалить старый и поставить его снова после редактирования конфигурации) и посмотри, появилась ли вторая линза

Линза вторая появилась. Только в ту же сторону. Не меняет направление. Видимо нужно менять координаты в самом шейп-файле. :confused:

vicente
09.10.2020, 03:20
Да, похоже, надо в шейпе ковыряться. Старый блок сохранил? Бэк фэйсин не нужен тогда

Forsayth
09.10.2020, 03:23
Да, похоже, надо в шейпе ковыряться. Старый блок сохранил? Бэк фэйсин не нужен тогда

Старый сохранил. Думаю, что проблема при компрессии. Так как выдает ошибку, но маркер разворачивает.

vicente
09.10.2020, 03:23
Вот оригинальный шейп:
SignalShape (
"T_Signal_Head_G.s"
"Repeater Signal G"
SignalSubObjs ( 4
SignalSubObj ( 0
"SIGNAL" "Default Main Track Signal"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "T_Head_G" )
)
SignalSubObj ( 1
"Footing_metal" "Metal footing"
SigSubType ( DECOR )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 2
"Footing_concrete" "Concrete footing"
SigSubType ( DECOR )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 3
"Stairway" "Stairway"
SigSubType ( DECOR )
SignalFlags ( OPTIONAL )
)
)
)

Forsayth
09.10.2020, 03:34
Вот оригинальный шейп:

Этот вариант пробовал. Безрезультатно. Сейчас попробую любой светофор конвертировать. Посмотрю на результат.

Добавлено через 4 минуты
Попробовал три светофора. Результат тот же. Возможно проблема в самой программе, так как она выдает ошибку.

vicente
09.10.2020, 03:44
Нет. У меня не выдаёт никакой ошибки, тем не менее, линза тоже не разворачивается
https://i.ibb.co/swcZ6Sf/train-2020-10-09-01-41-23-79.png

Forsayth
09.10.2020, 04:02
Возможно, нужно новую модель светофорной головки делать.:(

Добавлено через 10 минут
Скачал другую версию программы. Компрессия прошла без ошибок, но проблема не разворота линзы осталась. Думаю, что проблема в самом файле sigcfs.dat
Хотя не уверен.

vicente
09.10.2020, 04:13
Думаю, что проблема в самом файле sigcfs.dat
Хотя не уверен.
Думаю, sigcfs.dat ни при чем. Надо в шеёпе самом направление света править.

Forsayth
09.10.2020, 04:18
Естественно там ничего не понять. Смотрю сам шейп файл, там практически 0 и 1. Что и где поменять нужно, не понять. :confused:

vicente
09.10.2020, 04:27
Всё. Я - спать!

Кое что нашёл. Пока оставлю это здесь
В TSRE5 вы можете переворачивать (переворачивать) сигналы (размещая) вместе с формой, если вы установили крючок на «Отразить фигуру» слева в окне Object :, если нет, вы перевернете только красную пирамиду ...

Есть разница между MSTSRE и TSRE5 размещением сигналов:
MSTS: если вы повернете форму сигнала более чем на 180 градусов, красная пирамида автоматически перевернется в другом направлении дорожки.
TSRE5: вы можете вращать и перемещать форму сигнала в любом направлении, которое вам нравится (с помощью «R», затем Numpad или мыши), красная пирамида остается в направлении размещения.
Чтобы повернуть красную пирамиду, вы должны выбрать Shae или красную пирамиду и использовать функцию FLIP в меню «Объект» слева (с или без выбора формы отражения).

Forsayth
09.10.2020, 05:53
Проверил. Разворачивается только в TRSEE, когда заходишь снова в стандартный редактор, все возвращается к исходной проблемы.

Добавлено через 1 час 8 минут
Проблема в не развороте линзы, может быть, в том, что линза привязана к самому маркеру, а не к объекту. Поэтому, как ни крути объекты, а линза будет все равно на одном месте.

vicente
09.10.2020, 11:23
Странно , что здесь (http://www.trainsim.ru/forum/showpost.php?p=596061&postcount=548), ты говоришь, что вторая линза в ту же сторону смотрит. Линза - это конфиг - 100%. Как доберусь до компьютера - сам попробую back-facing "прикрутить". На USA2 они же смотрят в другую сторону. А там - по тому же принципу сделано.

Forsayth
09.10.2020, 19:26
Перебрал весь шейп. Разворачивал и возвращал в исходную позицию. Кроме изменения координат модели, больше ничего не меняется. Линза огня стоит мертво в одну сторону.

Добавлено через 1 час 19 минут
В файле шейп. Есть строчки:
sort_vectors ( 0 )
colours ( 0 )
matrices ( 1
matrix Signal ( 1 0 0 0 1 0 0 0 1 0 0 1 )
)
Где matrix Signal отвечает за положение линзы. Как не менял цифры, свет линзы будет растягиватся вдоль и в поперек, пропадать. Ни ни как не развернется.

Скорей всего нужно делать новую голову и подстраивать положение линзы под разворот маркера.

vicente
10.10.2020, 02:30
Единственное, что я нашёл у буржуев, это то, что чтобы линза повернулась, надо развернуть оси относительно объекта SIGNAL.
Честно говоря, я не очень себе это представляю. Сигнал с линзами "против шерсти" маркера я никогда не делал у себя.

Forsayth
10.10.2020, 02:40
В их сигнализации, открыв шейп. Увидел, что светофор сделан, как два объекта, которые с помощью опций делает его с сигнальной головой в разные стороны. Выбираешь одну опцию: Head1 - появляться одна голова, нажимаешь Head1 в другой вкладке - появляется голова противоположного направления. И эти все опции прописаный в файлах sigcfg и sigscr.
Так, что не получится ни как развернуть линзу. Нужно новый объект делать.

vicente
10.10.2020, 03:04
Да, похоже на то...
У меня множество двусторонних светофоров, но без огней. Поднял и увеличил линзу на одном из них, покрасил её красным - оказалось - то же самое: смотрит в ту же сторону.
https://i.ibb.co/tmzndkF/train-2020-10-10-00-54-11-11.png

Forsayth
23.10.2020, 22:31
В одном из заграничных маршрутов есть трех-крылый семафор.
https://a.radikal.ru/a13/2010/23/5fc6150f3069t.jpg
В сигнализации СССР подобные семафоры использовались для указания направления при многопутном участке: При наличии трёх и более направлений применяются трёхкрылые семафоры ... Третье крыло сигнализирует также, как и второе крыло, желтым огнем.
Есть ли возможность поднять одновременно три крыла семафора?

Используя, вот этот скрипт:
sigcfg.dat
SignalType ( "T_Semaphore_GR_X_X"
SignalFnType ( NORMAL )
SignalLightTex ( "ltex" )
SemaphoreInfo ( 1 )
SignalFlags ( SEMAPHORE )
SignalLights ( 2
SignalLight ( 0 "Red Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
SignalLight ( 1 "Green Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
)
SignalDrawStates ( 2
SignalDrawState ( 0
"Stop"
DrawLights ( 1
DrawLight ( 0 )
)
SemaphorePos ( 0 )
)
SignalDrawState ( 1
"Green"
DrawLights ( 1
DrawLight ( 1 )
)
SemaphorePos ( 2 )
)
)
SignalAspects ( 2
SignalAspect ( STOP_AND_PROCEED "Stop" SpeedKPH ( 0 ) )
SignalAspect ( CLEAR_1 "Green" )
)
SignalNumClearAhead ( 1 )
)
SignalType ( "T_Semaphore_GX_Y_X"
SignalFnType ( NORMAL )
SignalLightTex ( "ltex" )
SemaphoreInfo ( 1 )
SignalFlags ( SEMAPHORE )
SignalLights ( 3
SignalLight ( 0 "No Light"
Position ( 0 0 0 )
Radius ( 0.001 )
SignalFlags ( SEMAPHORE_CHANGE )
)
SignalLight ( 1 "AmberF Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
SignalLight ( 2 "Green Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
)
SignalDrawStates ( 2
SignalDrawState ( 0
"No Light"
DrawLights ( 1
DrawLight ( 0 )
)
SemaphorePos ( 0 )
)
SignalDrawState ( 1
"YellowGreen"
DrawLights ( 2
DrawLight ( 1 )
DrawLight ( 2 )
)
SemaphorePos ( 2 )
)
)
SignalAspects ( 2
SignalAspect ( STOP "No Light" )
SignalAspect ( APPROACH_1 "YellowGreen" SpeedKPH ( 40 ) )
)
SignalNumClearAhead ( 3 )
)
SignalType ( "T_Semaphore_GX_Y_Y"

SignalFnType ( INFO )
SignalLightTex ( "ltex" )
SemaphoreInfo ( 1 )
SignalFlags ( SEMAPHORE )
SignalLights ( 4
SignalLight ( 0 "No Light"
Position ( 0 0 0 )
Radius ( 0.001 )
SignalFlags ( SEMAPHORE_CHANGE )
)
SignalLight ( 1 "Amber Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
SignalLight ( 2 "AmberF Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
SignalLight ( 3 "Green Light"
Position ( -0.367 0 -0.04 )
Radius ( 0.1 )
SignalFlags ( SEMAPHORE_CHANGE )
)
)
SignalDrawStates ( 2
SignalDrawState ( 0
"No Light"
DrawLights ( 1
DrawLight ( 0 )
)
SemaphorePos ( 0 )
)
SignalDrawState ( 1
"YellowYellow"
DrawLights ( 3
DrawLight ( 3 )
DrawLight ( 2 )
DrawLight ( 1 )
)
SemaphorePos ( 2 )
)
)
SignalAspects ( 2
SignalAspect ( STOP "No Light" )
SignalAspect ( APPROACH_1 "YellowYellow" SpeedKPH ( 40 ) )
)
SignalNumClearAhead ( 5 )
)

SignalShape (
"LHUQ3abs.s"
"Выходной Семафор 3 Крыла"
SignalSubObjs ( 3
SignalSubObj ( 0 "HEAD1" "Одно Крыло-Главный Путь"
SigSubType ( SIGNAL_HEAD )
SignalFlags ( JN_LINK )
SigSubSType ( "T_Semaphore_GR_X_X" )
)
SignalSubObj ( 1 "HEAD2" "Два Крыла-Ответление На Боковой Путь"
SigSubType ( SIGNAL_HEAD )
SignalFlags ( JN_LINK OPTIONAL DEFAULT )
SigSubSType ( "T_Semaphore_GX_Y_Y" )
)
SignalSubObj ( 2 "HEAD3" "Три Крыла-Ответление На Боковой Путь"
SigSubType ( SIGNAL_HEAD )
SignalFlags ( JN_LINK OPTIONAL DEFAULT )
SigSubSType ( "T_Semaphore_GX_Y_Y" )

)
)
)

sigscr.dat
SCRIPT T_Semaphore_GR_X_X

extern float block_state ();
extern float route_set ();
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float enabled;
extern float sig_feature ();
float next_state;

state = SIGASP_STOP_AND_PROCEED;
if (enabled && (block_state() ==# BLOCK_CLEAR))
{
next_state = next_sig_lr (SIGFN_NORMAL);
if ((next_state ==# SIGASP_STOP) || ((next_sig_mr (SIGFN_NORMAL) ==# SIGASP_STOP_AND_PROCEED) && (next_state ==# SIGASP_STOP_AND_PROCEED)))
{
state = SIGASP_CLEAR_1;
}
else
{
state = SIGASP_CLEAR_1;
}
}
draw_state = def_draw_state (state);

SCRIPT T_Semaphore_GX_Y_X

extern float block_state ();
extern float route_set ();
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float enabled;
extern float sig_feature ();
float next_state;

if (route_set())
{
state = SIGASP_STOP_AND_PROCEED;
if (enabled && (block_state() ==# BLOCK_CLEAR))
{
next_state = next_sig_lr (SIGFN_NORMAL);
if ((next_state ==# SIGASP_STOP_AND_PROCEED) || ((next_sig_mr (SIGFN_NORMAL) ==# SIGASP_STOP_AND_PROCEED) && (next_state ==# SIGASP_STOP_AND_PROCEED)))
{
state = SIGASP_STOP_AND_PROCEED;
}
else
{
state = SIGASP_APPROACH_1;
}
}
draw_state = def_draw_state (state);
if ((state >=# SIGASP_APPROACH_1) && (next_state ># SIGASP_STOP_AND_PROCEED))
{
draw_state = 1;
}
else if (next_state ==# SIGASP_STOP_AND_PROCEED)
{
draw_state = 1;
}
}
else
{
state = SIGASP_STOP_AND_PROCEED;
if (block_state() ==# BLOCK_JN_OBSTRUCTED)
{
state = SIGASP_STOP_AND_PROCEED;
}
draw_state = def_draw_state (state);
}


SCRIPT T_Semaphore_GX_Y_Y

extern float block_state ();
extern float route_set ();
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float enabled;
extern float sig_feature ();
float next_state;

if (route_set())
{
state = SIGASP_STOP_AND_PROCEED;
if (enabled && (block_state() ==# BLOCK_CLEAR))
{
next_state = next_sig_lr (SIGFN_NORMAL);
if ((next_state ==# SIGASP_STOP_AND_PROCEED) || ((next_sig_mr (SIGFN_NORMAL) ==# SIGASP_STOP_AND_PROCEED) && (next_state ==# SIGASP_STOP_AND_PROCEED)))
{
state = SIGASP_STOP_AND_PROCEED;
}
else
{
state = SIGASP_APPROACH_1;
}
}
draw_state = def_draw_state (state);
if ((state >=# SIGASP_APPROACH_1) && (next_state ># SIGASP_STOP_AND_PROCEED))
{
draw_state = 1;
}
else if (next_state ==# SIGASP_STOP_AND_PROCEED)
{
draw_state = 1;
}
}
else
{
state = SIGASP_STOP_AND_PROCEED;
if (block_state() ==# BLOCK_JN_OBSTRUCTED)
{
state = SIGASP_STOP_AND_PROCEED;
}
draw_state = def_draw_state (state);
}

У меня следующая ситуация:
При указании главного пути: Семафор сигнализирует правильно:
https://c.radikal.ru/c17/2010/67/c4953470c24ct.jpg
При указании бокового направления и два крыла. Семафор сигнализирует правильно.
https://d.radikal.ru/d14/2010/e2/ad0b96eb7ad8t.jpg
А при использовании третьего направления,почему-то не подымается, среднее крыло.
https://c.radikal.ru/c31/2010/0b/7ad859710382t.jpg
Возможно нужно прописать какой-то дополнительный параметр?

vicente
23.10.2020, 23:22
Маршрут не по линку - вот и не поднимается.

Forsayth
23.10.2020, 23:23
Там просто не видно третьего пути)
Получается, что скрипт полностью правильный?

vicente
24.10.2020, 00:21
Ну, если не работает так, как хочешь - значит нужно переделывать.

Добавлено через 39 минут
Логика мне видится примерно твк:
Верхнее крыло работает на "закрыто-открыто". Поэтому линковка там - ни к чему. Остальные подобъекты - линкованые. Причем, если одно из них работает по своему линку, другому нужно прописать ещё зависимость от показаний "подсобрата"

Forsayth
24.10.2020, 00:25
Причем, если одно из них работает по своему линку, другому нужно прописать ещё зависимость от показаний "подсобрата"

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

vicente
24.10.2020, 00:38
Открытое показание нижнего крыла сделай не APPROACH_1, a CLEAR_2 (с желтым показанием) и среднему крылу добавь, что если маршрут не по линку
if (!route_set && this_sig_lr ==# SIGASP_CLEAR_2) {state = APPROACH_1};

Добавлено через 4 минуты
Логика ясна? Если маршрут не по линку среднего, но по линку нижнего, средний через эту зависимость будет видеть, что нижний открыт и открываться

Forsayth
24.10.2020, 00:40
if (!route_set && this_sig_lr ==# SIGASP_CLEAR_2) {state = APPROACH_1};


В которую строчку именно это прописать?

Логику понял. Сейчас пробовать буду.

vicente
24.10.2020, 00:46
И ещё. Я не вдавался в твой скрипт, но я бы его "почистил". Почему на следующий закоытый сигнал семафор закрыт, например?

Forsayth
24.10.2020, 00:52
Разберусь с этим. Видимо допустил ошибку.

vicente
24.10.2020, 01:22
Вот это:
next_state = next_sig_lr (SIGFN_NORMAL);
if ((next_state ==# SIGASP_STOP) || ((next_sig_mr (SIGFN_NORMAL) ==# SIGASP_STOP_AND_PROCEED) && (next_state ==# SIGASP_STOP_AND_PROCEED)))
довольно громоздко. Я знаю, что это списано у Тимаса, но по моему мнению, здесь достаточно только первой части выражения.

Добавлено через 2 минуты
Кроме того, у семафора два положения, поэтому для него достаточно в дополнение к enabled() только очистки блока. Остальное - долой!

Timas
24.10.2020, 03:07
...Я знаю, что это списано у Тимаса, но по моему мнению, здесь достаточно только первой части выражения...

А это, по-моему, задел то ли на манёвры, то ли на потерю кодов на бок. Из не вышедшей третьей части. Суть такая: next_state даёт бОльшее из next_sig_mr и next_sig_lr. Если, конечно, я что-то за тринадцать лет ещё помнюю.

Знал бы я тогда, как сейчас, как всё интересно в реальности работает - ни за что бы не взялся писать скрипты, бо они и половины возможностей СЦБ не отражают!

vicente
24.10.2020, 10:07
Знал бы я тогда, как сейчас, как всё интересно в реальности работает - ни за что бы не взялся писать скрипты, бо они и половины возможностей СЦБ не отражают!
Значит, хорошо, что не знал :D

Понятно, что в игре мы пытаемся максимально приблизить работу сигнализации к реальности, насколько это позволяет то, что дал нам разработчик. А дал он - по минимуму. Проблема не только у нас, кстати, но и у большинства нерусскоязычных товарищей. В Open Rails они довольно серьёзно расширили возможности создания сигнализаций,.но изменили весь принцип их работы в коде. Как следствие - наше сообщество "застряло" на довольно ранней версии симулятора в мультиплеерах.

Timas
25.10.2020, 04:41
А я тебе по секрету скажу, какие моменты надо в симуляторе такого рода предусматривать, чтобы потом не пришлось страдать некрофилией:

0. Ввести понятие стыка - точки с событийно контролируемым проследованием каждой колёсной парой. Это даёт возможность учитывать занятость любой достаточно протяжённой секции пути, как сумму колёсных пар на её субсекциях (сплайнах).

1. Организовать трансляцию кодов только до первой ездючины на пути. Это сложно и кодоёмко, но иначе непрерывные системы никак не сделать. Точечные системы передачи информации вешаются на события из п. 0.

3. Организовать обратную связь объектов с логикой СЦБ (взрез стрелки, например).

4. Секционирование КС - по принципу секционирования путей.

5. Нужен мощный и быстрый скриптовой движок с поддержкой ООП для программирования самой СЦБ. Примерно как в Метрострое, но только лучше и вкуснее!

6. Если СЦБ прогать чисто событийно (и массово пренебречь временнЫми параметрами схем), то оно не отожрёт много ресурсов, бо события в СЦБ не так уж и часты, это не физику ездючины считать. Ресурсы отожрёт передача кодирования, но и это можно продумать.

7. Ну и, соот-но, на всё это прогать отдельную морду для управления. Считаться оно должно исключительно на стороне сервера.

ЗЫ. Потом ещё диких детей учить, как в этой морде работать!

vicente
25.10.2020, 14:18
Ну... ты "загнул" здесь, по-моему.
Как раз "в симуляторе такого рода" такие задачи, насколько я понимаю, не ставились. Достаточно вспомнить, что изначально сие детище KUJU было попыткой создать симулятор машиниста. Действительно, всё было привязано к стставу мгрока! Включая 4-й вид "стоящего" человека, мимо которого проходит поезд. И тот сменялся быстро после проследования передней части состава. Всё остальное: окружающий мир, сигнализация... были даны по минимуму. Единственное, игрушка была открыта на предмет создания дополнений. Но, опять же - по тому же принципу - более в плане в физики ПС, скажем, и менее в остальных аспектах по мере удаления от этого самого поезда игрока. Так как сигнализация в игре - это то, с чем взаимодействует игрок на уровне "я вижу", возможностей в создании дополнений к ней было немного побольше, но всё равно - далеко от того уровня идеала, который ты описал. Ведь даже диспетчерских функий в MSTS не было. Они оганичивались возможностью сделать тот или иной сигнал "неисправным" в редакторе, опять же, для того, чтобы машинисту организовать принудительный проезд этого самого светофора. Тут не до взреза стрелок. Какой там? Симулятор "увольнял" игрока при проезде запрещающего немедленно!

Timas
26.10.2020, 02:41
А это по той причине, что он однопользовательский был. Как только появилась задача организовать многопользовательский (сетевой) режим - наружу вылезли все костыли. Начиная от отсутствия разделения вычислений на клиентскую и серверную стороны и заканчивая отсутствием всего и вся. Собст-но, ровно по этой причине я и считаю нынешнюю околоМСТСную возню некрофилией. Я не имею ничего против этой возни, но втайне надеюсь, что где-то у кого-то появится мысль начать всё с нуля и заточить под нужды совместной игры. Тем более, что игровые движки и вычислительные мощности вполне себе это позволяют.

vicente
26.10.2020, 12:17
Для меня, весь этот околоМСТС - некий ностальгический момент. Я вышедший ЭП20 даже не качал, например. Он мне лично неинтересен. И РТС запустил пару раз. Вся эта суета с запусками локомотива и неисправностями, как в Симуляторе Усова - мне на работе этого добра хватает с головой. Я ещё в МСТС в своё время расставил на станциях на мостах-переходах невидимые рельсы, ставил невидимку составом игрока и нсблюдал за движением на станции. Потом открыл для себя Open Rails. Там с этим проще уже было, так как оказалось, что есть там разработчики, которые также любят понаблюдать. Они создали для такого способа игры все условия. Возможно, их проблема в том, что они декларируют полную совместимость с МСТС. То есть, одним из незыблимых правил там является, что то, что работает в МСТС,.должно работать и в OR. Где-то этот"момент" и "тормозит" этот симулятор.

Насчет "с нуля". Это нужна команда. Чтобы была команда, такой подход должен был интересен. И не на уровне "я бы в такое поиграл" , но на уровне "я бы такое сделал". Иначе, это займёт годы. Я ничего нового не создаю, моделированием не занимаюсь. Уже лет 15 "ковыряю" свою переделку маршрута и конца-края этому занятию не видно. Из почти 800 км главного хода "катаю" 65 где-то. Вот сейчас весной на карантине начал "оживлять" ещё один участок - так запал с сигнализацией (в который раз), потом решил перейти на Timetable Mode (совсем иной принцип создания сценария). А, вчера, вот, подумал о "стыках", о кторых ты писал - и вожжа мне в голову заселилась... А если у меня в голове крутится какая-то идейка... блин. :D Вместе с основной мыслю всегда идёт "а ещё неплохо бы..." Я понимаю, что это месяцы возни, но ничего с собой поделать не могу. Хорошо бы, чтобы получилось. Давно меня бесит, что как только поезд стрелку проезжает (даже за track pin полностью не заходит), она переводится и строится другой маршрут.

Timas
27.10.2020, 04:52
Сейчас мы тут уйдём в тёмные дебри и огребём!

Команда - это хорошо, но это и плохо. Начинаешь зависеть от кого-то другого, ждать, согласовывать и т.д. Трата времени и сил. Если в ковырятельном режиме - лучше уж одному, ну или на вспомогательные операции команду привлекать (тестирование, создание объектов, текстур...).

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

Если что - это оффтоп был.

Что касаемо стыков - штука очень нужная. МСТСы, как и ряд других симуляторов (zzZ всех видов, ZDSim...) привязывают ездючину к пути одной точкой - математическим центром. Соот-но, ездючина с секции на секцию перескакивает мгновенно. А для реализма должна сначала головой занимать, потом хвостом освобождать. Это я про состав из одной ПЕ. Поэтому стык и раздельный контроль занятия и освобождения - это уже половина СЦБ, по сути.

vicente
27.10.2020, 20:42
... огребём!..
Ну, огребём - так огребём :D
Все безумные идеи рождаются а оффтопе (ха-ха)

Команда - это хорошо, но это и плохо. Начинаешь зависеть от кого-то другого, ждать, согласовывать и т.д. Трата времени и сил. Если в ковырятельном режиме - лучше уж одному, ну или на вспомогательные операции команду привлекать (тестирование, создание объектов, текстур...).
Ну, если разраб сам осиливает - круто. Я поглядываю на команду Open Rails и, если честно, не представляю себе, как один или даже два-три программера поднимают такой проект в такие сроки.

А новый сим таки просится.
Кто будет делать? Тут недавно в одной из тем кто-то из команды этого сайта писал, что звукарей не осталось... и всё. Нужны люди молодые и голодные. А ещё ПС конвертить и объекты. Я тут не решаюсь попросить народ "подбить" кабины, чтобы АЛСНы, КЛУБы всякие в Open Rails работали... Ведь пошлют же... и будут правы :)

Что касаемо стыков - штука очень нужная. МСТСы, как и ряд других симуляторов (zzZ всех видов, ZDSim...) привязывают ездючину к пути одной точкой - математическим центром. Соот-но, ездючина с секции на секцию перескакивает мгновенно. А для реализма должна сначала головой занимать, потом хвостом освобождать. Это я про состав из одной ПЕ. Поэтому стык и раздельный контроль занятия и освобождения - это уже половина СЦБ, по сути.
Какое железо такое потянет? Или - ну их - нищебродов? :D
Состав из 60 вагонов это 120 тележек... Если не сказать 240 осей. Если каждую считать...

Добавлено через 1 час 55 минут
Теперь по существу того, на что меня натолкнул тыой разговор о стыках. Опишу здесь. Может, кто-то из пользователей или строителей маршрутов захочет воспользоваться.
Проблему я описал: стрелка переводится как только "коробка" хвостового ПС пересекает Track Pin этой стрелки (если другой поезд запрашивает маршрут) и открывается светофор в другом направлении. В MSTS или Activity Mode ORTS движение начнется соазу же. В Timetable Mode я установил задержку перед началом движения - ТС ждет вплоть до минуты пепед тем, как тронуться. Но, всё равно - выглядит - не очень. И, если честно, довольно серьёзно подбешивает мну.
Я пытался добавить задержку светофору, но, к сожалению, компилятор не учитывает счётчик когда игра загружается.
Идея заключается в том, чтобы поставить на уровне [прежде всего] выходных светофоров ложные кроссоверы - точки пути. Логика проста: если на пути сервиса есть общая точка с соседним путём, по которому движется другой сервис, сим будет видеть эту точку "занятой" и маршрут не будет построен пока хвост не зайдет за РЦ или счётчик осей у светофора .

Технология
Учимся устанавливать вручную ложные кроссоверы здесь (https://msts.steam4me.net/tutorials/make_xover.html#complex). Обязательно бэкапимся (в статье написано). Изменения такого рода необратимы! Обратите внимание на то, что нужно указывать верную секцию пути, а не те, что указаны в статье.

Добавлено через 22 минуты
Несмотря на то, что в первом тесте система показала мне большой кукиш, думаю - работать будет

vicente
28.10.2020, 05:21
Кроссоверы ставятся попарно. То есть, если на станции 3 пути, нужно ставить 3 пары кроссоверов, чтобы всё перекрывалось. На 4 пути нужно уже 6 пар, на 5 путей - 10 и т.д. в той же прогрессии. Если перегон от станции двухпутный - связывать главные пути я не буду. Чтобы обеспечить одновременную работу в оба направления по главному ходу. Обратите внимание, что "совместной" является вся секция пути, на которой установлена точка кроссовера. Поэтому секции, заходящие на пути станции не годятся. Именно это и явилось причиной "фака", который я получил в первом тесте. Я установил кроссовер на боковом на секции 250 м. Поезд стал под обгон, физически с точки съехал, но остановился на секции хвостом и больше ничего никому не открылось вообще.

Добавлено через 3 минуты
Второй тест. Сделал на другой станции (пути менять не хочу). Полёт нормальный. Всё сработало. Плюс бонус - в версии 77 OR NY MG есть "оттяжка" открытия светофора "от симулятора". Встречный заехал за "стык", а светофор открылся только через несколько секунд.

Timas
28.10.2020, 10:33
Ну, с точки зрения вычислений обработка стыков - не такая уж и сложная задача. Координата ведь всё равно считается относительно секции пути. Для СЦБ, по сути, нужна первая и последняя колёсные пары. Причём это же не на каждом стыке возникает событие, а только на том, коий является изолирующим стыком (т.е. стыком двух рельсовых цепей). У меня-то этот алгоритм работает прекрасно.

Про кроссоверы задачка интересная, но это пока до сортировки не дошло. Построит кто-нибудь Инскую или Орехово-Зуево, и сам же запутает себя в маршрутизации.

Если честно, я не сильно понимаю, почему алгоритм непрерывного поиска ездючин на пути (он что в МСТС, что в zzZ всех версий) проще событийного их отслеживания. Просто чтобы упростить жизнь пользователю что ли? Чтобы он не заморачивался со сборкой рельсовых цепей из отдельных секций пути?

Собст-но, с кодированием насквозь ездючины вопрос примерно тот же...

vicente
28.10.2020, 17:51
А, сколько таких стыков на каждой станции? ;)
И, это мы не дошли ещё до Орехово-Зуево или Инской :D

Но... Ты (я так понимаю) этим занимаешься в своём проекте - тебе видней. Мне кажется, это слишком замысловато для "просто игрушки". А все вышеупомянутые "симуляторы", включая Run 8, именно игрушками и являютя. Я тебе больше скажу. У меня на работе есть симулятор машиниста. Кабина в натуральную величину и всё такое. Так вот, там "положили" не только на графику ПС, объекты окружения и пр. Всё, тобой описаное, там отсутствует напрочь. Оператор на своем пульте задаёт участок, по которому едет кадет, есть определенный набор событий (кроме неисправностей самого локомотива) на трассе, никоим образом с движением поездов не связаных. В смысле, вообще никакой организации движения там нет. Трафик представляет собой "кривые" картинки, призванные, скорее всего, убедить кадета в том, что его не запустили одного в этой "коробке" в открытый космос :D Несомненно, у описываемого симулятора - другое предназачение, но я, выйдя из кабины тогда, сказал сослуживцам и начальчтву, что если бы мне дали половину от7 миллионов американских рублей (а утверждается, что именно столько сие чудо стоило) минус кабина, я бы им на базе любого симулятора (того же МСТС или ОР смоделил бы весь Израиль... с блэкджеком и шлюхами с сигнализацией и трафиком.... :D :D

А здесь, у меня лично, цель другая. Кайфануть. Причем сделать это, когда мне того хочется и столько, сколько мне хочется. Мультиплеер, например, меня вообще не возбуждает. У меня на работе каждый день Мультиплеер :D Если честно, я вообще не понимаю, как это дома может происходить. Ведь в любой момент в кабину могут ворваться жена, дети. Тёща может позвонить... Может потребоваться открыть банку или помочь с пультом от зомбоящика.... ну, в общем, мужская грубая сила :D :D :D. А есть ещё начальство у мультов... строгое ;) Я пару дней назад на их сайт зашёл и понял: как чувствовали себя простолюдины во времена Инквизиции! Вроде, ты не ведьма, а всё равно - ссыкотно :D

Что касается сигнализации и организации движения поездов, я ставлю себе задачи гораздо проще. Во-первых, чтобы оно работало!. С этими "нашими" МСТСами/Опэнрэйлсами - это желательно. Во-вторых, чтобы из кабины и со стороны наблюдателя оно было похоже на то, что происходит в реальной жизни. . Вопрос в том, насколько необходимо пользователям игрушки вдаваться в СЦБ. Стыки - это хорошо, но кому, кроме операторов пультов ДСП и СЦБистов есть дело до них? Объясню. Я работаю машинистом. Для меня, как ездуна, простейшая по своему строению станция делится на 5 зон: от входного (границы станции) до первого маневрового - область манёвров. Ну, или точнее - приёма на станцию маневровым порядком. Далее, от первого маневрового до выходного противоположного направления - область стрелок. Затем - путь станции и до границы станции - в том же порядке.

Конечно, по стыкам - оно по другому. Стрелки разделены, на ответвлениях тоже счётчики осей установлены. Но, в симуляции оно мне зачем? Мне важно, что если на стрелках находится, как ты выражаешься, "ездючина", сигнализация это видела, и никого туда не пускала. А на какой оно именно стрелке - дело пятое. Так ещё (неровен час) можно и до неисправностей СЦБ докатиться :crazy: .... ложные занятости всякие, прибытие не в полном составе... там...

vicente
29.10.2020, 00:33
В общем, по этому принципу я и переделывал твою делал свою сигнализацию.

И, вот что я думаю.
В симуляции, где поезд сам запрашивает себе маршрут, коей являются и MSTS и OpenRails - это оптимальный вариант. Есть в обоих этих движаах слабые стороны. Кстати, в OpenRails в большей мере, ИМХО, хотя казалось бы... Но, это то, что мы на сегодняшний день имеем. А "выкручиваться" под "наши" показания я учился, в частности, и у тебя. За что, по случаю, огромное спасибо. Ну, и за модели светофоров :) Тебе и Косте Елисееву (КЕ).

vicente
29.10.2020, 04:14
Нет. Что-то не то с этими кроссоверами. :D
Не на всех путях работает. Видно, напутал с секциями пути.

Timas
29.10.2020, 06:27
А сколько таких стыков на каждой станции? ;)
И, это мы не дошли ещё до Орехово-Зуево или Инской :D ...

Стыков раза в полтора больше, чем рельсовых цепей. На сотню РЦ будет примерно полторы сотни стыков. Я не беру во внимание внутренние стыки между остряками и крестовиной стрелочного перевода, которые нужны для организации чередования полярности в РЦ. Только те, которые разграничивают РЦ.

Я тоже совершенно не прочь иметь какую-нибудь залипательную фигню, где всё ездит само, а ты только глядишь. Но описать её достаточно проблематично, причём это гораздо сложнее, нежели описать СЦБ. Слишком много описаний, хотя при поверхностном взгляде оно кажется простым. В основном это связано с выбором вариатного маршрута и первоочерёдностью задания маршрутов.

Даже если это не совместная игра, моё видение СЦБ всё же стремится к реализму. , если выбор правильного варианта маршрута - задача в данной реальности неразрешимая, то, как минимум, работу с охранными стрелками делать надо. Едет ли поезд ИИ или игрок - стрелки должны вставать в охрану. ИИ можно запрограммировать не ехать, игрок может поехать, куда и когда захочет. Ну это, конечно, если не увольнять его. Да и есть ещё аспекты, где проявляется некорректность и негибкость работы СЦБ.

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

vicente
29.10.2020, 22:13
То есть, ты считаешь, что описать такое возможно и построить так маршрут длинной в сотни километров с десятками станций и запустить туда трафик в сотни поездов (Я сейчас гоняю 461 поезд, в час пик пригородные с интервалом в 15 минут, скрещения, обгоны, смены локомотивов)?

vicente
30.10.2020, 03:34
Интересная вещь. Читал когда-то на форуме elvastower.com о перепитиях организации движения в OpenRails. Как известно, этот симулятор задуман был для того, чтобы поставить MSTS на "новые рельсы" - дать ему второе дыхание. Чтобы не пропали созданые маршруты, сценарии, подвижной состав... Вначале пути организация движения была перенесена "как есть" из MSTS, но немного позднее небезизвестной версии Х1370 всё было переработано чуть более, чем полностью. Именно с этим нововведением наши сигнализации "остались не у дел" в OpenRails. Так вот, автор разработки писал на форуме о причинах, по которым всё это было переделано "с нуля". И, вот, одной из причин было названо "отсутствие автодиспетчера" в MSTS. А, вот, в технической документации к сигнализации MSTS об автодиспетчере говорится прямо и понятно. То есть, явно кто-то напутал с терминологией. Много лет назад долгими ночами мы сидели с Игорем Забориным каждый за своим компьютером и трахались с MSTS, чтобы выяснить: как оно на самом деле работает. Целью.было создание открытой сигнализации, чего в конце концов не случилось. Но, в процессе многое стало понятно (обидно, но те вещи, к которым я приходил, гоняя ездюяины по сотне раз туда-сюда, оказалось гораздо раньше были "разжеваны" буржуями на "Стиме" и trainsim.con). Но, с другой стороны, это и порадовало. В смысле, что я всё правильно понял тогда. Принцип MSTS очень прост и практичен. Каждый поезд имеет своё "задание" - path. Он появляется в начале path и исчезает в конце. Между этими событиями можно задать ему что-то из определённого набора команд, очень ограниченного... точки разворота, точки ожидания, остановки на станциях, альтернативные маршруты и т.д. Если на пути есть узлы - стрелки, поезд "запрашивает" их согласно строго определённому алгоритму, связанному с параметром. SignalNumClearAhead, заданному в файле конфигурации сигнализации маршрута. Если узел не зарезервирован другим поездом, он получает этот узел и через узел строится маршут дальше согласно заданию. Если узел ограждён светофором - светофор откроется в случае если соблюдены остальные условия его скрипта. Если узел зарезервирован другим поездом - светофор будет закрыт через функцию BLOCK_JN_OBSTRUCTED, которая должна быть, опять опять-же, в этом скрипте прописана. На этом - почти всё. Единственное, что, может, следует добавить - если участок однопутный и есть поезд навстречу, а маршрут через узел проложен - неважно: сколько проходных светофоров на участке - поезд зарезервирует себе и следующий узел, чтобы встречный не занял этот совместный участок!
Всё это, включая существование блокировки (deadlock), непонятно и лаконично описано в документе по сигнализации MSTS.
И тут на заре развития OpenRails встаёт себе Роб Ротердинк и заявляет : в MSTS нет автодиспетчера! А он нам нужен! Организация движения - не идеальна. Пользователи "плавают" в сценариях. Нам нужно делать более сложные сценарии. Второй главной причиной вмешательства в механизм MSTS было отсутствие (якобы) возможности делать то, что они называют Call On - проезд запрещающего сигнала на занятый путь. На самом деле красные светофоры в MSTS можно спокойно проезжать даже на дефолтной сигнализации Marias Pass , через условно-разрешающий и маневровый аспекты, заложеные изначально в симулятор разработчиками.
Что в этом всём интересного и как это связано с нашим разговором?
Конечный вариант (а Роб отходит от дел и никто (пока) не решается даже приблизится к этой части кода) сигнализации OpenRails концептуально выглядит с этой точки зрения... примерно так же. Поезд имеет задание и запрашивает себе путь! Да, нюансы там есть, deadlock "отделён от государства", но... стало ли легче делать сложные сценарии (в добавилось множество функций)? Вопрос. У меня были случаи, когда простыми точками разворота deadlock сбивался к чертям и у Роба не было решений, кроме как закончить сервис, и из него создать новый.
Но, по моим понятиям, автодиспетчера как такового как не было - так и нет.

То о чем пишешь ты требует описания диспетчера. В одиночной поездке этот диспетчер должен просчитывать десятки, если не сотни вариантов на каждой станции. А на маршруте? Но, как бы ты не пришел к тому же самому : различать поезда диспетчер-то должен всё равно - по заданию. Или как?

Добавлено через 54 минуты
Всё-таки выставлю ролик, который снимал для себя в рабочем порядке. Прошу прощения за съёмку на телефон. На ролике - открытие светофора с ложным кроссовером. На место установки кроссовера на пути электрички указываю мышкой.

JXkTX0egfPY

Timas
30.10.2020, 07:26
А куда оно денется, если работать не будет. Оно жеж событийное, никаких постоянных расчётов ему там делать не надо, чтобы какие-то сложные циклы крутились и перебирали всю кучу объектов. Друг делал в zzZ'19 СЦБ по моим принципам, но не в виде ООП, а в виде скриптов. Так он при правильном секционировании путей мелкие станции за вечер скриптом описывал. Крупные - да, дольше, но на крупных и я в своём проекте плаваю, бо нет пока автоматизации по их созданию.

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

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

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

Теперь, что касаемо поездной сигнализации. Все эти извращения с описыванием 1234567890 почти одинаковых скриптов, различающихся только разлинзовкой, это реально извращения. Для выбранного типа сигнализации необходимо составить трёхмерную таблицу, в которой упорядочиваются зависимости сигналов на попутных светофоров. Ест-но, с учётом стрелок и скоростей по ним. Одна таблица на всю карту (если неск. типов СЦБ применяется - будет неск. таблиц). Каждый аспект в таблице должен уметь отображаться тем или иным светофором. Собрал таблицу маршрутов - пошёл назначать каждому маршруту алгоритм из таблицы. На этом этапе светофор может сматериться, что у него нет способа отобразить такое-то показание. В этом случае светофор заменить (именно заменой, чтобы не обвалить таблицы маршрутов, которые ведут до или за этот светофор). И всё. Логика описывается один раз, а не таскается из скрипта в скрипт.

Я вот у себя тоже хочу от чисто МПСовской сигнализации уйтить в сторону вариантной. Но не сейчас.

TRam_
31.10.2020, 02:16
и то может стать затыком на перспективуОбход затыков можно внедрять в логику, или (как у меня в маршрутизации) делать два варианта маневровых маршрутов - на занятый путь или только на свободный (во втором случае "кто-то ещё", кому нужен этот же тупик, не поедет, пока данный лок не освободит тупик). Ну и + система разграничений, чтобы с маршрутами работал только тот локомотив, который ближайшим к изостыку стоит.. Выглядит это так - https://youtu.be/kK0-ocptUM4?t=9

составить трёхмерную таблицу, в которой упорядочиваются зависимости сигналов на попутных светофоровПочему на всю карту? У меня например одна таблица(код) на любые светофоры, с зависимостью кроме вышеперечисленного от наличествующих в светофорах линз... https://github.com/TRam1990/sU-core/blob/5ca06d3091a616117fe8c859dba0d2b7d67323ff/sU-core/zx_indication.gs#L853

Timas
31.10.2020, 07:29
Обход затыков можно внедрять в логику...

Можно. Но осторожно. Потому как иногда при поодиночном движении в тупик не хватает пропускной способности тупика. Если в тупике оборачивается два локомотива, то экономится время одной операции на смену кабины. И это ещё не учтены станции стыкования (Я надеюсь, что в МСТСах и проч. научатся секционировать контактную сеть).

...Почему на всю карту? У меня, например,...

Из расчётов, что на разных картах может применяется разная сигнализация (МПС СССР, ОСЖД и т.д.) или одна и та же, но в разных временнЫх исполнениях. Для каждого варианта своё исполнение таблицы.

TRam_
01.11.2020, 01:25
Timas, да, для разных "эпох" нужны разные исполнения, взять хотя бы эволюцию сигнала желтый-зелёный. Но опять же - тогда и семафоры с дисками нужно там же описывать. Просто имею в виду, что универсальный алгоритм определения показания светофора для современных нормативов сигнализации уже реализовывался.

Добавлено через 2 минуты
Если в тупике оборачивается два локомотиваВ смысле поочерёдно - тогда решение мной указано выше (проверка свободности тупика при попытках сбора маршрута). Если одновременно (т.е. в тупик загоняется по 2 локомотива) - тут уже сложнее.

vicente
01.11.2020, 14:06
В смысле поочерёдно - тогда решение мной указано выше (проверка свободности тупика при попытках сбора маршрута). Если одновременно (т.е. в тупик загоняется по 2 локомотива) - тут уже сложнее.
В принципе, в Timetable Mode Open Rails такое возможно. Вообще, многое из вышеизложенного возможно уже сегодня в OpenRails. Те же шаблоны скриптов, к примеру. Когда один скрипт можно применять хоть ко всем светофорам на маршруте.И симулятор развивается сразу в нескольких направлениях. Например сейчас анонсирован новый формат файлов составов. Кроме рэндомальной сборки будет ещё и инжикация состава по типу: пассажирский, грузовой и т.д. Надеюсь, что кагда-нибудь займутся и базой данных пути. Хотя, пока, создаётся впечатление, что она всех устраивает.

vicente
03.11.2020, 01:53
Вот такие функции:

Activate_Timing_Trigger() : Активирует таймер.
Check_Timing_Trigger(n) : Проверка триггера. Возвращает TRUE, если таймер "досчитал" до числа n
На видео я установил для выходного 45 секунд. Ещё раз прошу прощения за качество. Пока - только так


Hg5M-ETih_0

roman5
16.09.2021, 16:25
В этом Иванцево иногда даже на пустой путь не запускает виртуальный диспетчер...
А как по отлаживать сигналку ? Я нашел функцию в sigscr, а как ее отладить, интересно найти ошибку в сигналке.

КЕ
16.09.2021, 17:52
А как по отлаживать сигналку ? Я нашел функцию в sigscr, а как ее отладить, интересно найти ошибку в сигналке.
Какая функция?

roman5
16.09.2021, 18:59
Какая функция?
Например, входной Иванцево со стороны Драчеево. Вот этот сигнал задан этой функцией APK_4AB_YR_GY_I_Kv в sigcfg.dat - состоит из (APK_3AB_YGR_YW_DISTANCE, APK_INFO_CLEAR_2, APK_ALSN_KZ_0_B_0, APK_ALSN_KZ_20_B_20, APK_3AB_YGR_YW_ALSN_Z_40_B_40, APK_3AB_YGR_YW_ALSN_Z_60_B_60, APK_4AB_YRG_YW_ALSN_Zel_B_Z, APK_4AB_YR_GY_Kv ) - скрипты описаны в sigscr.dat в скобках перечисленные.
В одном из сценариев этот сигнал не пускает на главный путь пока на боковом стоит пригород. Какой надо смотреть из скриптов в скобках и есть ли возможность отладить скрипт в игре, то есть добавить в него логи или отладчиком как-нибудь туда залезть и найти ошибку.

КЕ
16.09.2021, 20:00
Возможно, надо попробовать переустановить этот светофор в RE. Или даже их все на станции.
Иногда это помогало с зависаниями сигналки.
А так только сам Алексей Фёдоров APK LVDZ сможет разобраться, в его сигнализации слишком много зависимостей.

roman5
16.09.2021, 20:13
в его сигнализации слишком много зависимостей.
А ее отлаживать как-то можно ? Есть в msts возможность запуска с консолью, чтобы добавить в скрипт логи - увидеть промежуточные результаты.

КЕ
16.09.2021, 20:21
Никогда не пользовался.
Что-то вроде было, но не помню уже. На сайте Игоря Заборина (http://forum.zaborin.ru/) говорили, но найти теперь, где - это надо страниц 200 в нескольких темах по сигнализации смотреть.
Я на "БМО" сам бы посмотрел, но вряд ли осилю сейчас вечером всё скачать через сотовую сеть... Хотя и попробую.

roman5
16.09.2021, 21:20
На сайте Игоря Заборина (http://forum.zaborin.ru/) говорили, но найти теперь, где - это надо страниц 200
Нашел тут http://forum.zaborin.ru/topic.php?forum=20&topic=4&p=2
функция debug_out, попробовал, пишет лог в корень. Теперь интересно какой из скриптов этого светофора надо смотреть, так как там светофор состоит из сигнальных голов и на каждую скрипт. Поэтому как понять в скрипт какой сигнальной головы смотреть надо, почему не пускает на главный путь Иванцево входной меня.

КЕ
16.09.2021, 21:26
Надо смотреть ту "голову" (SigSubSType (... в sigcfg.dat) типа NORMAL, которая выдаёт запрещающий сигнал поезду. От каких впередистоящих сигналов она зависит.
ЗЫ: мы с Игорем делали по-другому - добавляли в сигналку специальное табло, которое показывало коды, идущие в РЦ. Ставили дальше за проверяемым сигалом, исмотрели, что именно приходит к этому светофору по NORMAL, что - по DISTANCE и т.п.

roman5
16.09.2021, 21:38
Надо смотреть ту "голову"

SignalShape (
"APK_4AB_YR_GY_I_Kv.s"
"APK_4AB_YR_GY_I_Kv"
SignalSubObjs ( 15
SignalSubObj ( 0
"SIGNAL" "Nastrojki predidusego signala:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_YW_DISTANCE" )
)
SignalSubObj ( 1
"SIGNAL" " - Datj zelenij (inace 2 zeltih)"
SigSubType ( USER1 )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 2
"SIGNAL" "Dlja drugix ukazanij ispolzujte marker!"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_INFO_CLEAR_2" )
)
SignalSubObj ( 3
"SIGNAL" "Nastrojki etogo signala:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_ALSN_KZ_0_B_0" )
)
SignalSubObj ( 4
"SIGNAL" " - Videlitj, esli ALSN kodiruetsa"
SigSubType ( USER2 )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 5
"SIGNAL" " - Verhnij zeltij iz dvuh mozet migatj"
SigSubType ( USER3 )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 6
"SIGNAL" " - Zeltij ALSN na odin zeltij migajusij"
SigSubType ( USER4 )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 7
"SIGNAL" "Odnostoronnij propusk poezda:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_ALSN_KZ_20_B_20" )
)
SignalSubObj ( 8
"SIGNAL" " - Vhodnoj svetofor"
SigSubType ( GRADIENT_PLATE )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 9
"SIGNAL" " - Prohodnoj svetofor"
SigSubType ( NUMBER_PLATE )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 10
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_Priglasitelnij2" )
)
SignalSubObj ( 11
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_YW_ALSN_Z_40_B_40" )
)
SignalSubObj ( 12
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_YW_ALSN_Z_60_B_60" )
)
SignalSubObj ( 13
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_4AB_YRG_YW_ALSN_Zel_B_Z" )
)
SignalSubObj ( 14
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_4AB_YR_GY_Kv" )
)
)
)
Дело в том, что тут много SignalSubObj, и я не знаю, какой из них выдает запрещающий аспект. Можно ли как-то это узнать без просмотра всех SignalSubObj последовательно, изучая какие они дают показания в нужный момент.

КЕ
16.09.2021, 21:46
Скачал, посмотрел - там чёрт ногу сломит, запутано всё... зависимостей куча.
Видимый огонь горит красный, на АЛСН белый, выходной зелёный на АЛСН... не могу это понимать, Алексея надо звать!:)

roman5
16.09.2021, 23:40
добавляли в сигналку специальное табло, которое показывало коды, идущие в РЦ.
А можно подробнее, это интересно, что и как добавляли и где результат смотрели.

Добавлено через 3 минуты

Иногда это помогало с зависаниями сигналки.

Я правильно понимаю, что "зависанием" сигналки называют некорректные возвращаемые значения extern функций, к примеру, route_set, от результата которых зависит логика скрипта.

КЕ
17.09.2021, 00:10
Да.
https://i.ibb.co/N6LDdsC/Clipboard01.gif
Вот такое табло. В принципе - это плоский "светофор" типа INFO, работающий как повторитель, принимающий коды в РЦ и показывающий их значения. Как и у обычных светофоров, в конфиге заданы цвета и расположение огней.
В этом примере он показывает высшее и низшее значение кодов NORMAL и DISTANCE - соответственно NORMAL "0" и "5" (т.е. впередистоящий светофор имеет 2 субобъекта NORMAL, один из которых имеет аспект "5", а другой "0"), и коды "2" типа DISTANCE (в данном примере высший и низший коды DISTANCE одинаковы).
На тестовых маршрутах эти табло ставились по несколько штук между близкостоящими светофорами, чтобы видеть, как коды идут между ними.
___
ЗЫ: лютый оффтоп пошёл, нас пора перемещать в другую тему http://www.trainsim.ru/forum/showthread.php?p=596617#post596617

vicente
17.09.2021, 17:49
Скачал, посмотрел - там чёрт ногу сломит, запутано всё... зависимостей куча.
Гы...! Да, фиг ты там без пол-литры поймёшь! :D


Видимый огонь горит красный, на АЛСН белый, выходной зелёный на АЛСН... не могу это понимать, Алексея надо звать!:)
Видимые огни у АРК - DISTANCE . То, что заставляет поезд двигаться или останавливаться перед светофором - ALSN-головы. То есть, если на АЛСН у тебя белый, а на светофоре красный, с точки зрения симулятора, тебе RESTRICTING , попробуй проехать этот красный и посмотри: уволит тебя симулятор или нет. Подозреваю, что не уволит.
Дальше. Какая голова отвечает за тот путь, на который требуется приём поезда, можно узнать по линку в редакторе (с русификатором кнопка называется "связь", без русификатора - "Link"). Править ничего не советую, ни в sigcfg.dat, ни в sigscr.dat. Причина: вы правите ВСЕ сигнальные головы на всём маршруте. Сигналка может просто полететь в татары.

КЕ
17.09.2021, 22:39
Проехал, не увольняет, на локомотивном-то белый! Только на подходе к станции должен быть зелёный, а не красный. И на АЛСН, и на светофоре.
Линков нет, у Алексея в сигнализации маркеры на путях, как и у меня.

Добавлено через 5 минут
Что-то не то с маршрутом - ещё раз переустановил начисто, и то же самое...

roman5
18.09.2021, 01:52
Гы...! Да, фиг ты там без пол-литры поймёшь! :D

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

Добавлено через 12 минут
Какая голова отвечает за тот путь, на который требуется приём поезда, можно узнать по линку в редакторе
Я смотрю связи, но их много и там не указано какие за какой путь отвечают.
https://i.ibb.co/dLWrmLk/2021-09-18-005142.png

vicente
18.09.2021, 02:01
Что-то не то с маршрутом - ещё раз переустановил начисто, и то же самое...
ИМХО, есть два варианта здесь.
1. Менее вероятный.
Светофорные маркеры установлены с ошибкой.
2. Сергей1969 "сбивает" работу сигналки своими потрясающими стартами и исчезновениями трафиков и невидимок где попало. Есть в сигнализации АРК "механизмы", которые "взводятся" с продвижением сервиса от станции к станции. Я говорил об этом много лет назад в темах о сценариях на Зилупе 3.6 ("Помощь экспрессу", "Грузовой в Айзкраукле", кажется)

Добавлено через 5 минут
Проверить это дело не сложно. Уберите весь трафик и прогоните поезд игрока по его пути через эту станцию

КЕ
18.09.2021, 09:22
Олег, дело не в сценарии Сергея. Я проверял этот четный входной на своем простом тестовом сценарии, где только игрок, или игрок и один поезд трафика - светофор горит красным, АЛСН белый.
Там какой-то "затык" в расстановке маркеров сигналов.

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

vicente
18.09.2021, 09:33
Понятно. Значит, всё-таки, что-то со светофором.

Тогда непонятно: почему здесь (http://www.trainsim.ru/forum/showpost.php?p=597839&postcount=2) - "прохождение" и не было никаких жалоб на этот светофор? А, также, см.сообщения 10, 11, 13, 14 - все проходы без проблем....

КЕ
18.09.2021, 09:51
Может быть, дело в порядке инсталляции? Я ставил по порядку БМО-1.5, патч 1.5, патч 1.7, патч 1.8. Но с патчем 1.7 непонятно - обязательно он нужен, или нет?

vicente
18.09.2021, 10:05
То есть, это поытка прогона сценария "под 1.7" на 1.8?
СЦЕНАРИЙ: 133_ARHANGEL'SK-MINSK
МАРШРУТ: БМО 1.7 (BMO_1.5 + BMO_1.5_Patch + zdsRoute_BMO-Patch_v1_7)
Версия 1.8 - это не версия под мультиплееры Open Rails 1370, разве?
Короче, заинтриговали. Ищу: как глянуть светофор.
Нет, вряд ли получится. Это надо маршрут ставить. Хотя... Костя, можешь скинуть куда-нибудь sigcfg.dat и sigscr.dat? Порядок установки - я не вижу: как оно может повлиять. С установкой новой сигнализации изменяются все соответствующие файлы. Сценарий под 1.7 не пошел бы на 1.8 если бы пути были изменены в *.tdb

Добавлено через 1 минуту
На 1.7, вроде, сигнализация Тимаса Адамайтиса, не так ли?

КЕ
18.09.2021, 11:05
Да, она.
Скинуть не могу, сейчас далеко от компов...:D
Получается, патч 1.8 не надо устанавливать? Проверить смогу только завтра.

vicente
18.09.2021, 11:46
Судя по первому сообщению темы, сцена - под 1.7.
Костя, на надо файлы, спасибо. Я нашел эту сигналку на Зилупе 3.6. Вряд-ли Алексей там что-то координально менял. Настройки светофора я вижу в скрине в сообщении #31. Если одиночный сервис игрока без трафиков тоже не открывает светофор, значит, что-то с установкой именно этого светофора на маршрут. В смысле, проставлены ли все маркеры как надо. Решит только тот, кто устанавливал сигнализацию, то есть APK_LVDZ. По сцене - она делалась на 1.7 и проходить её надо на 1.7

КЕ
18.09.2021, 12:02
Понял.
А то Roman5 привел часть конфига, а там Лешина сигналка.

vicente
18.09.2021, 12:50
Ещё вопрос: когда на локомотивном белый, а на путевом - красный, какую скорость показывает монитор пути напротив сигнала?

Добавлено через 1 минуту

А то Roman5 привел часть конфига, а там Лешина сигналка.
Так, и у тебя - Лёшина :D

Добавлено через 9 минут
...если стоишь на красный, а аспект тебе - RES. Только у Лёши такая фича ;)

КЕ
18.09.2021, 13:51
Ещё вопрос: когда на локомотивном белый, а на путевом - красный, какую скорость показывает монитор пути напротив сигнала?
20 км/ч.

Так, и у тебя - Лёшина :D

Ведь я и решил, что надо ставить патч 1.8. А оказывается - не надо?

roman5
18.09.2021, 14:22
20 км/ч.

Ведь я и решил, что надо ставить патч 1.8. А оказывается - не надо?
Я рассказывал про сценарий Сергея http://www.trainsim.ru/forum/showthread.php?t=17729 Перегонка, где входной не пускает в Иванцево, там сцена как раз под 1.8 сделалана.

Добавлено через 18 минут

2. Сергей1969 "сбивает" работу сигналки своими потрясающими стартами и исчезновениями трафиков и невидимок где попало.
Я тут попробовал на 1.8 написать сцену, все старты и исчезновения на станциях, но ловлю забавные баги. Игрок следует по удалению из Дмитрова в Бубяково, по Костино и Драчеево попытка сделать скрещение - встречный должен на проход уйти. Так вот после прибытия встречного на Драчеево - всем красные хотя в редакторе появляются "зеленые кружки" при запуске с ключом -drawad.
Если запустить трафик с Желтиково до Костино встречный, то как только он освобождает горловину Костино - открывается выходной с Драчеево сначала трафику, за которым игрок по удалению, потом игроку. Прибывший в Драчеево трафик так и стоит на красном.

Belka777
18.09.2021, 15:11
Сценарий писался на версию 1.7 где используется сигнализация Тимаса. Версия 1.8 использует сигнализацию от APK. Эти две сигнализации абсолютно разные в плане работы и логики. На форуме было даже обсуждение ранней версии от APK, там логика работы светофоров другая.
Версия 1.8 - это не версия под мультиплееры Open Rails 1370, разве? Нет. Скрипты не будут работать и будет ошибка выскакивать при запуске маршрута.
Я тут попробовал на 1.8 написать сцену, все старты и исчезновения на станциях, но ловлю забавные баги
У этой сигнализации есть определенная логика как должны работать светофоры. Если не правильно что-то делаете получите такие баги
По сцене - она делалась на 1.7 и проходить её надо на 1.7
Абсолютно верно. И это указано в названии темы и шапке сообщения

roman5
18.09.2021, 15:39
У этой сигнализации есть определенная логика как должны работать светофоры. Если не правильно что-то делаете получите такие баги

А можете рассказать более подробно про логику. А что именно неправильно делаю: игрок старт с Демитрова до Бубяково, встречный трафик стартует с Костино до Иванцево. По Драчеево после прибытия встречного всем красный. Где ошибка то, что не учел интересно ведь.

Добавлено через 2 минуты
Похоже, там сигналку переустанавливать надо. Пересбор БД пути как проходит, ошибки есть?
Это мне вопрос ? У меня в мстс редакторе БМО 1.8 не хочет открывать почему-то - сбой ПС пишет ошибку. Поставил на чистую МСТС этот маршрут - открывается в редакторе.

vicente
19.09.2021, 02:26
А что именно неправильно делаю...

Дело в том, что в симуляторе нет (и не может быть) диспетчера. Понятие "автодиспетчер" в Мануале - тоже не более, чем метафора. Под этим термином разработчики подразумевали некий комплекс совокупностей по которым движущиеся по "дорожкам" поезда получали приоритеты в движении по секциям пути. Человеческим языком, каждый поезд "пытается прокладывать себе путь" сам. Поезд который запрашивает себе узел (то есть стрелку) первым - очевидно "получит" его. И никакой другой поезд не будет допущен к проследованию этого узла, пока поезд зарезервировавший его, не освободит узел. Причём симулятор понятия не имеет: где станция, а где перегон. Он работает с секциями пути и узлами. Это называется блокировкой (Deadlock).Теоретически, светофоры могут и не останавливать сервис перед заблокированным узлом. Я когда-то игрался с сигналкой и убрал запрещающий аспект со светофора. Узел в том случае всё равно остаётся заблокированным, а поезд останавливается перед Track Pin стрелки. Кстати, с этим многие сталкивались в Open Rails выше версии 137х на наших сигнализациях, когда наш запрещающий аспект перестал быть запрещающим.
Далее. Сигнализация.
В какой момент поезд "запрашивает " узел для себя. Оказывается, это напрямую зависит от параметра SignalNumClearAhead в файле sigcfg.dat . Узел блокируется для поезда, когда тот находится на расстоянии SignalNumClearAhead+1 светофор от светофора, ограждающего этот узел. Любой другой сервис, приближающийся к этому же узлу, в момент, когда он будет на том же расстоянии, будет учтён программой и "поставлен в очередь" на проследование этого узла.
Где зарыта собака?
Если кто помнит дефолтные сценарии, во многих из них при появлении игрока, игрок сразу же видел какой-то встречный трафик. Так вот, эти трафики не имели общих точек с путём игрока. Остальные трафики, особенно имевшие с игроком общие точки ("скрещения") стартуют задолго до встречи с игроком.
SignalNumClearAhead в MSTS , не знаю насчёт дефолта, но в пропатченых это точно есть, имеет баг - сколько не прописывай разных в сигнализации - в игре он один и равняется наибольшему значению, прописанному в sigcfg.dat файле. То есть, если в конфигурации всех светофоров, кроме одного он прописан 3, а в этом последнем - 20, симулятор будет резервировать узлы для сервиса когда он за 21 (!) светофор до узла!
Что происходит, если стартовать сервис (поезд) в пределах уже зарезервированного маршрута другого сервиса? На trainsim.com дают на это вполне определённый ответ: поведение обоих сервисов в этом случае непредсказуемо. Игорь Заборин на своём сайте очень давно написал статью о яалении, которое назвал "поезд-призрак". Мне это определение нравится, как по мне - оно довольно точно описывает ситуацию. Программа всё равно будет пытаться "разрулить" создавшееся положение. Но тогда счет может идти на секунды в сценарии. То есть, скажем в 9:11:27 приоритет получит игрок, а если он приедет раньше, скажем в 9:11:02 - трафик, или вообще все станут на запрещающие.
Понятно желание сэкономить на ресурсах. Но, представим себе ситуацию, когда поезд находится, например, за пять блок-участков до станции. Потому как SignalNumClearAhead огромен, выходные стрелки уже зарезервированы для него, возможно, что и светофор уже открыт... И тут на перегоне за выходным сценарист стартует какую-нибудь невидимку. Что происходит? Светофор, конечно, перекрывается, так как блок занят теперь, а узел остался зарезервирован... ммм... короче, веселуха.
Какое может быть решение, кроме старта в крайних точках маршрута? Я давно не играю в MSTS , и то, что я делал на своём маршруте тогда - точки старта в строго определённом местах и установка в этих местах нескольких светофоров подряд, то есть разделение на маленькие блоки - не вариант на официальных маршрутах. Но, я бы порекомендовал стартовать на станционных путях с реверсом. То есть развернуть состав, стартовать у выходного в противоположном направлении и установить точку разворота в пределах пути станции. Таким образом, светофор после точки разворота не будет "включен" в игру, а после смены направления Deadlock не должен ломаться. Кстати, такой старт в своё время, был опробован мной именно на сигнализации APK_LVDZ - не помню: на каком форуме и в какой теме было обсуждение.

roman5
19.09.2021, 03:47
вообще все станут на запрещающие.

Именно это и просходит, создал тест-сцену: 2 сервиса: Дмитров-Иванцево и Иванцево-Дмитров. По всем станциям разные пути приема, старт одновременно. По Костино оба на путях станции под запрещающие. Попытка загнать невидимку с Иванцево в Костино для подавления маршрутов обоих - еще хуже, попутный не отправляют из Иванцево. Про SignalNumClearAhead знаю, на 1.8 он равен 10 посмотрел.

Добавлено через 25 минут

стартовать у выходного в противоположном направлении и установить точку разворота в пределах пути станции

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


светофор после точки разворота не будет "включен" в игру
Как не будет, за ним появился сервис-невидимка ведь.

vicente
19.09.2021, 08:19
Путь станции "ограждён" двумя выходными сигналами, так? И точка старта, и точка разворота чтобы находились между ними.

roman5
19.09.2021, 09:00
И точка старта, и точка разворота чтобы находились между ними.
Так, но тогда игрока не примут на станцию, на входном будет стоять пока невидимка там. Я попробовал другой тест: игрок прибывает на станцию, а потом на этой станции трафик появляется встречный - его 1.8 не выпускает сигналка. После проезда в одну сторону по перегону, он почему-то ломается в другую сторону.

vicente
19.09.2021, 10:04
Кто-то кого-то явно не понимает здесь :confused:
Я говорю о старте любого трафика на пути станции. При чём здесь перегон? Выход на перегон осуществляется после разворота на станционном пути. Перегон трафик должен пройти полностью до встречи с игроком. Либо трафик стартует на станции скрещения, делает реверс и останавливается у выходного, потому что тот - заблокирован игроком. Смысл - не стартовать на перегоне, не делать точки разворота на перегоне - чревато - лёшина сигналка, насколько я её понимаю скриптом блокирует противоположное направление дополнительно переменными. Сервис может развернуться и даже исчезнуть, а направление остаться заблокированным (но это - не точно). По мне - так невидимки нужно использовать в крайних случаях, при обгонах и тоже - очень аккуратно. Например, станция из 3-х путей, 2 из которых заняты обгоняющим и обгоняемым сервисами, невидимка стартует как я описал на следующей станции и принимается на свободный путь. Сам обгон обыгрывается таким образом: невидимка сначала освобождает стрелку обгоняющего, а затем обгоняемого. Таким образом, обгоняющему сервису выходной светофор откроется раньше. Невидимка - тот же трафик. То, что игрок его не видит, не говорит о том, что её можно "впаривать" где попало: на перегоне, в горловине станций между стрелок и т.п. Все эти вещи - слабые места, которые могут привести к непредсказуемости сценария.

roman5
20.09.2021, 00:57
лёшина сигналка, насколько я её понимаю скриптом блокирует противоположное направление дополнительно переменными.
Тут даже без невидимок не работает на его сигналке. После прохода по перегону в одну сторону трафика, в обратную не выпускает. При чем встречный появляется уже после освобождения перегона, поэтому вмешательство в маршрут другого исключено. Как переключать это направление.

КЕ
20.09.2021, 01:00
А кто ее знает, как... МСТС очень непредсказуемо обрабатывает скрипты "встречных" сигналов.

vicente
20.09.2021, 01:31
После прохода по перегону в одну сторону трафика, в обратную не выпускает. При чем встречный появляется уже после освобождения перегона, поэтому вмешательство в маршрут другого исключено. Как переключать это направление.
Речь идёт о той же локации: Иванцево?

Добавлено через 21 минуту
А кто ее знает, как... МСТС очень непредсказуемо обрабатывает скрипты "встречных" сигналов.
Костя, нормально он обрабатывает их. Как написано - так и обрабатывает. Сигналы очень сложные и громоздкие. Тот же входной квадратный в Иванцево состоит из 15 подобъектов, из которых 9 - сигнальные головы, 4 из которых - типа NORMAL, и это при том, что светофор не линкованый, остальные - DISTANCE и INFO . Светофоры передают друг другу напрямую и через маркеры кучу информации. Настройки входного по скрину
- вроде, правильные. Входной настроен, как светофор "одностороннего пропуска", то есть "ловит" ситуацию, когда навстречу едет другой поезд. В принципе, входной (а он настроен как входной) не должен перекрываться, если поезда расходятся на станции. А он, судя по тому, что вы пишете, перекрыт, пока встречный не освобождает дальнюю горловину. Может, отсутствует какой-то маркер? Или в самом скрипте входного что-то не так. Я поэтому и спрашиваю насчет других станций: есть ли ещё такие входные и, если да, происходят ли там такие же аномалии.

roman5
20.09.2021, 01:52
Речь идёт о той же локации: Иванцево?

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

Добавлено через 8 минут
А кто ее знает, как... МСТС очень непредсказуемо обрабатывает скрипты "встречных" сигналов.
Попробовал логи записать, в конкретные скрипты добавил:

extern float debug_header();
extern float debug_out();
extern float enabled;

debug_header();
debug_out (enable);
debug_out2 (1009,enable);

Самая удобная debug_out2 можно в первом параметре уникальное число передавать.
Но тут сразу не сколько вопросов, дело в том, что один скрипт используется в множестве сигналов - как мне понять с какого из светофоров эта запись. Или в sigscr.log буду получать только записи сигнала, который перед моим поездом или с сигналов, перед которыми трафики тоже буду в лог ловить.

КЕ
20.09.2021, 01:54
... есть ли ещё такие входные и, если да, происходят ли там такие же аномалии.
Перепроверю. Я, похоже, тоже на те же грабли попадаю с точками старта...

roman5
20.09.2021, 04:12
светофор не линкованый, остальные - DISTANCE и INFO .
А можно еще пояснить мат часть: что такое линковка светофора не очень понял. И в чем принципиальная разница у DISTANCE и INFO, как я понял только NORMAL голова может остановить поезд, а все остальные чисто информационные.

КЕ
20.09.2021, 10:16
Линковка - это когда при установке светофора в Редакторе маршрутов открываем окно настроек, где устанавливаем связи со стрелками для зажигания нужных огней (З, 2Ж и др.). Это было в дефолтных сигнализациях и у Славы Усова и Тимаса. В сигнализации АРК и в моей почти не используется.
DISTANCE и INFO - служебные типы сигнальных аспектов, которые не влияют на движение сервисов и не видны на Мониторе пути, а нужны для передачи информации от светофора к светофору для расширения возможностей сигнализации. Хотя можно через них управлять видимыми огнями.

Добавлено через 1 час 33 минуты
Ещё раз создал тестовый сценарий - трафик стартует с бокового в Дмитрове, встречный трафик - с бокового Драчёво. в Иванцево "дмитровский" заходит набок на 2 путь к платформе, а "драчёвский" напроход по главному.
Я в роли НОД-а:cool: катаюсь взад-вперёд по 3 пути в Иванцево (точки старта и окончания на нём, не выходя за светофоры) и наблюдаю... что опять та же беда! Трафик с Драчёво встаёт на красный входной Иванцево.

Добавлено через 2 минуты
Сейчас в Драчёво такой же тест сделаю...

vicente
20.09.2021, 10:36
Костя, стариовал обоими поездами с реверса? Сколько блок-участков между станциями старта и Иванцево?

Добавлено через 14 минут
Спасибо за объяснение. Я уже думал "отписку" отправить - уж слишком "многАбукАФФ" на объяснение. А так - всё просто и понятно. Добавлю только ответ на вопрос "в чем "принципиальное" отличие DISTANCE от INFO ?" Это вопрос настолько же прикладной, насколько религиозный.:D
Каждая сигнализация - творчество Автора. Как он видит, так и пишет. Я сам тесты не делал, но Алексей мне разъяснял, что разница - в обновлении скриптов. Кроме NORMAL , по его словам, более менее приемлемо обновляется только DISTANCE . У меня нет никаких оснований оспаривать это, но сам я не собираюсь проверять. Моя "религия" не принимает таких финтов с сигнализацией. Она близка к тому, что сделал в своё время Timas. Я всегда обходился NORMAL -ами, как в MSTS , так и сейчас в Open Rails . DISTANCE использую исключительно "по назначению ": как предупредительные сигналы. Но, с другой стороны, ПАБ я так и не реализовал до конца с точки зрения движения по белым лоеомотивным. Также не реализованы как того хотелось бы потери кодов на боковых путях. Но, времени нет АБСОЛЮТНО сейчас заниматься симуляторами.

КЕ
20.09.2021, 11:30
Костя, стартовал обоими поездами с реверса? Сколько блок-участков между станциями старта и Иванцево?
От Иванцево до Дмитрова 4, до Драчево 9.
С реверсами то же самое. В Драчево скрещение 2-х трафиков, я на 3 пути не выходя за светофоры. Выходные закрыты, в чётном и нечётном направлениях проходные сигналы открыты (как бы если трафики ещё не пришли на станцию), входные закрыты; хотя за трафиками других поездов нет...
Добавлено через 25 минут
После пересбора БД на загрузке сценариев МСТС вылетает.

vicente
20.09.2021, 13:45
Скопирую сюда часть из личного сообщения APK_LVDZ. Когда-то он объяснял мне принцип работы его сигнализации на Зилкпе 3.6. Наслаждайтесь.
У входных светофоров ставится обычно два маркера на 3АБ и один маркер на ПАБ. На 3АБ это маркер АЛСН, который ты упоминал, и нужен только для имитации АЛСН при выезде со станции, и непосредственно маркер, не дающий сбить всю автоблокировку - Sluz_Peregon. Этот маркер выполняет лишь одну функцию - как можно раньше передаёт входному светофору переменную POEZD = 2, т.е. RESTR. Направление АБ держится, пока вы перед светофором, или ЗА ДРУГИМ СВЕТОФОРОМ. Но поскольку до следующего светофора далеко, то направление легко собьётся после перевода любой стрелки. Поэтому важно занять перегон сразу же за входным. Причём буквально за пару метров, чтобы даже дрезину перегон почувствовал.

Любой поездой сигнал с галочкой "проходной" может заменить этот маркер, но установка проходного рядом с входным - явление довольно редкое, и то - чаще на 4АБ. Маркер АЛСН ставить туда нельзя, потому что входной светофор будет давать уже своё указание, постоянное, поэтому его нужно узнавать непосредственно с путей станции, т.е. стоя за входным.

На ПАБ немного упрощается. Маркер АЛСН там нужен только в той ситуации, когда вам нужно сбросить установившееся ограничение. Например, как в Резекне 2 на 222 км при выезде с Резекне 1 на ПАБ. Там скорость 40, но по перегону-то установленная! Поэтому эти 40 надо убрать. Убирать скорость умеет только NORMAL, поэтому это работа АЛСН. А поскольку белый - он и есть белый - ему до фени на указания, и его можно легко заменить вместо Sluz_Peregon.

Надо сказать, что все маркеры отлично понимают, что могут находиться на односторонней АБ, и в случае поимки POEZD = 1 (ST_A_PR, встречное направление), они не покажут POEZD = 2, а оставят 1, потому что это всё равно красный. Тут система такая - при попутном движении используются значения 0 и 2, а при встречном - 0 и 1.


Добавлено через 35 минут
От себя хочу добавить, что по многим факторам и причинам - это лучшая реализация сигнализации (пост)СССР для MSTS. Алексей учел практически всё. В MSTS , например, есть ещё один очень неприятный баг - трафики не соблюдают ограничений скоростей всех аспектов в sigcfg.dat , кроме RESTRICTING . И это учтено в сигналке, а также потеря кодов АЛСН, белый АЛСН на ПАБ и многое другое. И, хотя, по "религиозным убеждениям" я во многом с ним не согласен (например, я считаю, что можно было выкрутиться и без DISTANCE), и не совсем понимаю: что именно там сбилось на БМО 1.8, воспоминания о поездках по Зилупе 3.6 у меня очень тёплые. Очень реалистично было ехать. И сценарии на нём Серёга делал, и я ездил эти сценарии, и даже довелось разбирать с ним те или иные моменты и помогать ему...
С этим маршрутом, к сожалению, ничем не могу помочь. MSTS для меня - давно в прошлом, у Open Rails - свои законы. Они координально отличаются от MSTS в вопросах сигнализации и организации движения поездов.

КЕ
20.09.2021, 13:53
В MSTS , например, есть ещё один очень неприятный баг - трафики не соблюдают ограничений скоростей всех аспектов в sigcfg.dat , кроме RESTRICTING .
Вот поэтому они иногда и "ползут" по перегонам, "поймав" где-то RES 20 км/ч.

roman5
20.09.2021, 16:54
Ещё раз создал тестовый сценарий
Можно даже 1 трафик пустить, запускаю с Иванцево до Драчеево и там реверсом обратно. Обратно выходной не выпускает, если проехать на красный выходной, то следующий служебный 120 res впереди меняется на зеленый, после этого выходной начинает открываться и направление перегона переключается.

КЕ
20.09.2021, 17:06
Все-таки там что-то не то с БД пути. Нужен еще один патч.))

roman5
20.09.2021, 18:00
Каждая сигнализация - творчество Автора. Как он видит, так и пишет.
Вопрос про головы Normal,Distance,Info был именно о сигналке 1.8 бмо. То есть, что в каких типах голов там. А также как ее правильно расставить на тестовом маршруте, то есть куда и как надо ставить служебные сигналы - маркеры.

vicente
20.09.2021, 20:33
Никто об этом не расскажет лучше автора (http://xn----btb0ae6ajy.xn--p1ai/index.php?/topic/78-signalizaciya-dlya-msts-rts-open-rails-versiya-apk-v7137015/)

В сообщение #9 описываются все типы сигнальных точек

Belka777
20.09.2021, 21:18
Версии v3 и v7 сильно отличаются друг от друга

vicente
20.09.2021, 23:50
Ну,, это кому - как ;)
Я не просто так к отослал девятому пункту

КЕ
21.09.2021, 00:10
https://i.ibb.co/dLRLkXQ/Clipboard02.gif (https://imgbb.com/)
Вот здесь табло слева показывает коды, идущие в РЦ от этого чётного входного светофора на Иванцево:

2 красных аспекта "1" Dn и Dv - коды DISTANCE, соответствующие видимому красному огню.
Nn и Nv - "0" и "2", аспекты NORMAL, и на мониторе пути будет виден более высший аспект "2" - RESTRICTING.

Табло справа - коды, приходящие по РЦ к этому входному от впередистоящего светофора (не виден за кривой).
Как видно по кодам, тот открыт - и NORMAL (в РЦ 2 значения - "0" и "7", сервисы едут по высшему, а низший передаёт доп. инфу), и по DISTANCE - "7". На Мониторе пути будет зелёный, видимый огонь тоже зеленый.

Станционный путь свободен. Ошибка работы входного очевидна.
Но в РТС он работает правильно.

roman5
21.09.2021, 00:27
Станционный путь свободен. Ошибка работы входного очевидна.

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

vicente
21.09.2021, 02:55
Ну, я ставлю на то, что там не хватает какого-нибудь служебного маркера. Между входным и выходным.
У меня нет этого маршрута и сигнализации этой версии, так что, если хотите - скрипты всех девяти подобъектов Signal_Head в этом шейпе- в студию.

Начать предлагаю с NORMAL -голов. Почему у нас RESTRICTING 20, а не CLEAR_2 без ограничения скорости. Поэтому для начала сократим количество скриптов до пяти. То есть, выложите всё, что имеет в названии ALSN.

roman5
21.09.2021, 03:05
скрипты всех девяти Signal_Head в этом шейпе- в студию.
SignalShape (
"APK_4AB_YR_GY_I_Kv.s"
"APK_4AB_YR_GY_I_Kv"
SignalSubObjs ( 15
SignalSubObj ( 0
"SIGNAL" "Nastrojki predidusego signala:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_YW_DISTANCE" )
)
SignalSubObj ( 1
"SIGNAL" " - Datj zelenij (inace 2 zeltih)"
SigSubType ( USER1 )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 2
"SIGNAL" "Dlja drugix ukazanij ispolzujte marker!"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_INFO_CLEAR_2" )
)
SignalSubObj ( 3
"SIGNAL" "Nastrojki etogo signala:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_ALSN_KZ_0_B_0" )
)
SignalSubObj ( 4
"SIGNAL" " - Videlitj, esli ALSN kodiruetsa"
SigSubType ( USER2 )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 5
"SIGNAL" " - Verhnij zeltij iz dvuh mozet migatj"
SigSubType ( USER3 )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 6
"SIGNAL" " - Zeltij ALSN na odin zeltij migajusij"
SigSubType ( USER4 )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 7
"SIGNAL" "Odnostoronnij propusk poezda:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_ALSN_KZ_20_B_20" )
)
SignalSubObj ( 8
"SIGNAL" " - Vhodnoj svetofor"
SigSubType ( GRADIENT_PLATE )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 9
"SIGNAL" " - Prohodnoj svetofor"
SigSubType ( NUMBER_PLATE )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 10
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_Priglasitelnij2" )
)
SignalSubObj ( 11
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_YW_ALSN_Z_40_B_40" )
)
SignalSubObj ( 12
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_YW_ALSN_Z_60_B_60" )
)
SignalSubObj ( 13
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_4AB_YRG_YW_ALSN_Zel_B_Z" )
)
SignalSubObj ( 14
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_4AB_YR_GY_Kv" )
)
)
)

SCRIPT APK_3AB_YGR_YW_DISTANCE

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;
if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 1 ) { state = SIGASP_APPROACH_3; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 3 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 4 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 5 ) { state = SIGASP_CLEAR_2; }
}
if ( next_INFO ==# 0 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) { state = SIGASP_APPROACH_1; }

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( ( block_state() ==# BLOCK_OCCUPIED || POEZD !=# 0 ) && opp_POEZD !=# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( opp_ONE_WAY ==# 1 || opp_POEZD ==# 2 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) {
state = SIGASP_STOP_AND_PROCEED;
}
draw_state = def_draw_state (state);



SCRIPT APK_INFO_CLEAR_2

extern float sig_feature ();
extern float def_draw_state ();
extern float state;
extern float draw_state;

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_USER1 ) ) { state = SIGASP_CLEAR_2; }
draw_state = def_draw_state (state);



SCRIPT APK_ALSN_KZ_0_B_0

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }


state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( POEZD !=# 0 || next_INFO ==# 7 ) {
state = SIGASP_STOP_AND_PROCEED;
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 && next_INFO ==# 7 ) { state = SIGASP_RESTRICTING; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_RESTRICTING; }
}
}
} else {
state = SIGASP_STOP_AND_PROCEED;
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) { state = SIGASP_RESTRICTING; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_RESTRICTING; }
}
}
if ( next_INFO ==# 3 ) { state = SIGASP_STOP; }
draw_state = def_draw_state (state);


SCRIPT APK_ALSN_KZ_20_B_20

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( next_INFO ==# 2 && POEZD ==# 0 ) {
state = SIGASP_STOP_AND_PROCEED;
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_RESTRICTING; }
}
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) && next_INFO !=# 7 && POEZD ==# 0 ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_RESTRICTING; }
}
}
if ( next_INFO ==# 3 ) {
state = SIGASP_STOP_AND_PROCEED;
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_RESTRICTING; }
}
}
draw_state = def_draw_state (state);


SCRIPT APK_Priglasitelnij2

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float sig_feature ();
float WORK1; float POEZD; float next_INFO;

POEZD = 0; next_INFO = 8;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING ) { next_INFO = 3; }
}

state = SIGASP_CLEAR_2;
if ( next_INFO ==# 2 && block_state() ==# BLOCK_CLEAR && POEZD ==# 0 ) { state = SIGASP_STOP; }
if ( next_INFO ==# 3 ) { state = SIGASP_STOP; }
draw_state = def_draw_state (state);


SCRIPT APK_3AB_YGR_YW_ALSN_Z_40_B_40

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( next_INFO ==# 0 && POEZD ==# 0 ) {
state = SIGASP_APPROACH_1;
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
}
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_STOP; }
}
draw_state = def_draw_state (state);


SCRIPT APK_3AB_YGR_YW_ALSN_Z_60_B_60

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 && next_INFO ==# 8 && POEZD ==# 0 ) {
state = SIGASP_APPROACH_1;
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
}
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_STOP; }
}
draw_state = def_draw_state (state);

roman5
21.09.2021, 03:06
SCRIPT APK_4AB_YRG_YW_ALSN_Zel_B_Z

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( SVET !=# 0 && next_INFO ==# 8 && POEZD ==# 0 ) {
state = SIGASP_CLEAR_2;
if ( sig_feature( SIGFEAT_USER4 ) && SVET ==# 1 ) { state = SIGASP_APPROACH_1; }
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
}
}

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_STOP; }
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 && block_state() ==# BLOCK_CLEAR ) { state = SIGASP_RESTRICTING; }
draw_state = def_draw_state (state);

SCRIPT APK_4AB_YR_GY_Kv

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;
if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( SVET ==# 1 ) { state = SIGASP_RESTRICTING; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 3 ) { state = SIGASP_APPROACH_1; }
if ( SVET ==# 4 ) { state = SIGASP_APPROACH_1; }
if ( SVET ==# 5 ) { state = SIGASP_APPROACH_2; }
}
if ( next_INFO ==# 0 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_2; }
if ( SVET !=# 0 ) { state = SIGASP_APPROACH_3; }
if ( !sig_feature( SIGFEAT_USER3 ) ) { state = SIGASP_CLEAR_2; }
}

if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) { state = SIGASP_STOP; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) &&
( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) ) { state = SIGASP_STOP; }
draw_state = def_draw_state (state);

vicente
21.09.2021, 04:22
Ну, давайте попробуем выяснить: какая из NORMAL голов выдаёт нам наш RESTRICTING . Это сложно, но возможно. В MSTS единственная информация, которую можно передать от одной сигнальной головы к другой - аспекты.

Первая голова типа NORMAL - APK_ALSN_KZ_0_B_0.
Так как sig_feature USER2 у нас выбрана в настройках светофора (скрин из TSRE5 от roman5) и блок, как вы утверждаете, своюоден, методом исключения, голова даст RESTRICTING только когда opp_POEZD 2, или opp_ONE_WAY 1..
opp_ONE_WAY будет 1 когда сигнал NORMAL "сзади" входного по ходу движения будет наиболее запрещающим аспектом (нижним) давать STOP_AND_PROCEED.
opp_POEZD будет 2 когда голова DISTANCE, расположенная так же, наиболее разрешающим аспектом (вехним) будет в RESTRICTING.

Добавлено через 5 минут
Так что, Костя, пожалуйста, поставь ещё одно табло так, чтобы оно смотрело "назад". И, да. Лёша использует и DISTANCE и INFO в своей сигнализации. Так что, сигнальные головы в табло не должны быть этих типов. Надо поменять их на что-нибудь другое. SHUNTING, REPEATER...

Добавлено через 18 минут
[Ушел спать]
Я в предыдущих постах говорил о "религии"... Так вот, эта "блуждающая" рабочая переменная WORK1 меня всегда настораживала. Это не С++ и даже не С. Буржуи называют эту программу "с натяжкой Quake C" - С очень ограниченный в функционале. Я всегда боялся даже присваивать переменным начальные значения в sigscr.dat считая эту программу статической...

roman5
21.09.2021, 06:41
Лёша использует и DISTANCE и INFO в своей сигнализации. Так что, сигнальные головы в табло не должны быть этих типов. Надо поменять их на что-нибудь другое. SHUNTING, REPEATER...

В табло головы REPEATER, так что вроде все нормально, мы не вмешиваемся в его логику.


Так вот, эта "блуждающая" рабочая переменная WORK1 меня всегда настораживала. Это не С++ и даже не С.
Хочешь сказать, что она может быть не локальной float WORK1;, а глобальной, то есть один скрипт будет писать в нее, другой прочитает из нее ( в С++ эта называется проблемой обращения с общей памятью - мьютексы ).

Добавлено через 21 минуту

opp_ONE_WAY будет 1 когда сигнал NORMAL "сзади" входного по ходу движения будет наиболее запрещающим аспектом (нижним) давать STOP_AND_PROCEED.

Похоже так.
https://i.ibb.co/PTjq4kT/image.png

Добавлено через 13 минут
методом исключения, голова даст RESTRICTING только когда opp_POEZD 2, или opp_ONE_WAY 1..

А там ведь еще условие
if ( POEZD !=# 0 || next_INFO ==# 7 )

POEZD будет не 0, если

WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }

Но DISTANCE next сигнала на табло SIGASP_CLEAR_2.

Потом:
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; }

На табло нет INFO, я добавил вывод в лог, поправив скрипт Табло:

SCRIPT N_DASP
extern float state;
extern float next_sig_mr();
extern float next_sig_lr();
extern float draw_state;
extern float def_draw_state;
extern float debug_header();
extern float debug_out();
extern float debug_out2();
float WORK1;

state = next_sig_mr (SIGFN_DISTANCE);
draw_state = def_draw_state (state);
debug_header();


WORK1 = next_sig_mr ( SIGFN_DISTANCE );
debug_out2 (2001, WORK1);

WORK1 = next_sig_lr(SIGFN_DISTANCE);
debug_out2(2002,WORK1);

WORK1 = next_sig_mr(SIGFN_NORMAL);
debug_out2(2003,WORK1);

WORK1 = next_sig_lr(SIGFN_NORMAL);
debug_out2(2004,WORK1);

WORK1 = next_sig_mr(SIGFN_INFO);
debug_out2(2005,WORK1);

WORK1 = next_sig_lr(SIGFN_INFO);
debug_out2(2006,WORK1);

Получил в логе:
2001.000000 7.000000
2002.000000 7.000000
2003.000000 0.000000
2004.000000 7.000000
2005.000000 7.000000
2006.000000 7.000000

То есть по INFO голове идет SIGASP_CLEAR_2, по обоим аспектам lr,mr.
То есть в это условие не попадаем.

КЕ
21.09.2021, 09:31
... Так вот, эта "блуждающая" рабочая переменная WORK1 меня всегда настораживала. Это не С++ и даже не С... Я всегда боялся даже присваивать переменным начальные значения в sigscr.dat считая эту программу статической...
Может быть, Леше это удалось.
Я, например, сколько ни пытался сохранять переменные (для манёвров) - бесполезно, они не работают. Или сбрасываются при опросе сигнальных точек, или вообще не реагируют.
https://i.ibb.co/S6kKx09/Clipboard03.gif (https://ibb.co/L0TCP62) Табло только показывает в левых столбцах коды DISTANCE, а само - REPEATER. Вот поставил обратносмотрящее - левое. Скинул Roman5 свой "БМО" c YardCam для удобства наблюдений.

vicente
21.09.2021, 12:54
В табло головы REPEATER, так что вроде все нормально, мы не вмешиваемся в его логику.
Я не помнил: какие типы голов на табло. Я с телефона всё это делаю.


Хочешь сказать, что она может быть не локальной (...), а глобальной, то есть один скрипт будет писать в нее, другой прочитает из нее ( в С++ эта называется проблемой обращения с общей памятью - мьютексы ).
В неё пишется 4 раза. 2 со следующего/их сигнала/ов (головы DISTANCE и NORMAL, теоретически, могут быть на разных сигналах, я не смотрел всю конфигурацию сигнализации на этот предмет). Я говорю о том, что в реальном времени, если несколько условий для WORK1 будут одинаковыми, соответствующие переменные получат соответствующие значения одновременно. Но, возможно, автор всё просчитал, и так и должно работать. Я бы сделал по-другому: WORK1, WORK2 и т.д. Но, я не Автор :D

Костя, я как раз пол-года назад задумался над новой сигнализацией с совершенно новой логикой и собирался запоминать переменные по принципу "условие - 1, условие - 0, не выполняется ни то, ни другое условие - переменная остаётся в последнем значении, т.е. запоминается". Не вижу причин, что не будет работать. Но, до сигнализации так и не добрался пока - жизнь закрутилась и пришлось отложить на неопределённый срок.

Похоже так.
"Оппозит" - светофор "сзади по ходу" в противоположном направлении. Но, я хотел бы знать: где стоит маркер табло слева у тебя на скрине?


А там ведь еще условие
if ( POEZD !=# 0 || next_INFO ==# 7 )

POEZD будет не 0, если

WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }

Но DISTANCE next сигнала на табло SIGASP_CLEAR_2.

Потом:
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; }

Мы ищем сейчас: какой из NORMAL -ов даёт этот наиболее разрешающий RESTRICTING. STOP_AND_PROCEED - более запрещающий и нас он сейчас не интересует.

То есть в это условие не попадаем.
Надо искать сигнальную голову, подпадающую под все условия и дающую аспект 2.

Добавлено через 28 минут
Повторяю/поясняю:
if ( block_state() ==# BLOCK_CLEAR ) { if ( POEZD !=# 0 || next_INFO ==# 7 ) { state = SIGASP_STOP_AND_PROCEED;
...даёт STOP_AND_PROCEED, а не требуемый RESTRICTING , поэтому это условие не выполняется. Данная сигнальная голова, когда блок впереди не занят и нет враждебной стрелки, даст RESTRICTING только в случае, который я описал в предыдущем посте.

Добавлено через 4 минуты
Судя по скрину (http://www.trainsim.ru/forum/showpost.php?p=602109&postcount=654), приведенному КЕ, эта сигнальная голова - "чиста". Попробуйте просчитать следующую голову с ALSN.

КЕ
21.09.2021, 12:58
запоминать переменные по принципу "условие - 1, условие - 0, не выполняется ни то, ни другое условие - переменная остаётся в последнем значении, т.е. запоминается".
Опять маневры?:)

roman5
21.09.2021, 13:25
"Оппозит" - светофор "сзади по ходу" в противоположном направлении. Но, я хотел бы знать: где стоит маркер табло слева у тебя на скрине?

Маркер стоит перед проходным светофором, конусом в сторону, в которую проходной светит. То есть снимает показания с проходного этого.
https://i.ibb.co/KWGBCjP/image.png

vicente
21.09.2021, 13:40
Да, всё правильно. Просто табло развёрнуто в другую сторону, поэтому не понял.
Кстати, насчёт POEZD !=# 0 || next_INFO ==# 7 ты тоже прав. Должно выполняться. Просмотрел, что нет фигурной скобки. В любом случае, это не эта голова даёт нам RESTRICTING

Добавлено через 2 минуты
Сложно всё. Нужно делать ещё одно табло (чтобы не крафтить новый шейп) для INFO. Скопироаать и переназвать шейп, прописать его в конфиге и написать ему скрипт

Добавлено через 1 минуту
Опять маневры?:)

Ахаха!
Ну, ты же маня знаешь! Они-самые.

roman5
21.09.2021, 13:52
Нужно делать ещё одно табло (чтобы не крафтить новый шейп) для INFO. Скопироаать и переназвать шейп, прописать его в конфиге
Править шейп, то есть *.s файл ? Не достаточно поправить *.ace и дописать скрипты ?

vicente
21.09.2021, 14:27
Нужно скопировать *.s, переименовав его (скажем, добавив "_INFO". Скопировать *.sd файл, переименовав его также, как и *.s. Не забыть открыть его в блокноте и изменить имя *.s файла на новое. Прописать новые сигнальные головы в sigcfg.dat, а также говый SignalShape, не забывая при этом уведичит на "1" общее количество шейпов и количество новый SignalHeads на сколько новых голов добавлено. Написать скрипты для новых голов по аналогии с существующими. Если уж совсем делать "как нужно" и, чтобы не путать табло между собой, можно подправить и *.асе

Добавлено через 20 минут
Но, для того, чтобы шейп обращался к другому *.асе, нужно править сам файл *.s. Если не ошибаюсь, это Костино табло. Так что, исходник у него должен быть. В крайнем случае, расконверт через SFM (если *.s сжат) и правка в блокноте ссылки на файл текстуры.

КЕ
21.09.2021, 15:30
Можно перерисовать текстуру, сделав не 4, а 6 или 8 столбцов, сам шейп растянуть в ширину, и в скриптах добавить субобъекты для других типов (INFO, SHUNTING).

vicente
21.09.2021, 18:19
Не понял. А почему у вас разные показания на табло?


https://i.ibb.co/PTjq4kT/image.png


https://i.ibb.co/S6kKx09/Clipboard03.gif (https://ibb.co/L0TCP62)

Добавлено через 2 минуты
Это ожно и то же место? Или это разные станции?

КЕ
21.09.2021, 18:41
Судя по кустам:) - одно и то же. Может, сами табло по-разному стоят впереди и сзади светофоров?...

vicente
21.09.2021, 19:01
Маркер стоит перед проходным светофором, конусом в сторону, в которую проходной светит. То есть снимает показания с проходного этого.
https://i.ibb.co/KWGBCjP/image.png
Костя, у тебя не так?

КЕ
21.09.2021, 19:07
У меня обратносмотрящее табло стоит самым левым на скрине, а у Романа "прямые".
Могло ли это как-то повлиять... да вроде нет, они же репитеры все. Если только где-то код "застревает" на одном табло.

Про такие "триггерные" случаи вроде мы у Игоря на форуме говорили... Только там речь была про опрос типов DISTANCE. Смысл был такой, что скрипты субобъектов NORMAL и DISTANCE в одном светофоре могут неодновременно опрашиваться и отрабатываться.

vicente
21.09.2021, 19:48
Может, "для чистоты эксперимента" вы оба засунете табло входного и проходного внутрь маркеров этих светофоров вершинами друг к другу? Хотя, если поездная ситуация одинаковая, не вижу причин на такую разницу в кодах входного. Но, самое интересное - на твоём скрине Dv - 7, тем не менее, входной горит красным. У Лёши голова DISTANCE - это видимый сигнал. В смысле, показание. Что там за DISTANCE такой, что он 7, но не светофор? Пипец

КЕ
21.09.2021, 19:57
табло входного и проходного внутрь маркеров этих светофоров вершинами друг к другу
Не понял, как ты хочешь их расположить?

vicente
21.09.2021, 20:33
Маркеры входного и первого проходного, стоящих друг напротив друга, "смотрят" друг на друга вершинами "пирамидок", так? Между ними есть промежуток. Вот, в этот промежуток впихнуть оба табло: считывающее с входного и с оппозита. Так же: вершинами внутрь.

roman5
21.09.2021, 21:49
Не понял. А почему у вас разные показания на табло?

У меня поезд перед входным, поэтому на скринах запрещающие аспекты на проходном.

КЕ
21.09.2021, 22:14
https://i.ibb.co/8570k4y/Clipboard01.gif (https://ibb.co/Ph6Nkz2)
Олег, вроде такого? Входной всё так же красный.
Это Роман5 мне прислал новые табло, там слева направо идут DISTANCE, NORMAL и INFO. Левое показывает аспекты с проходного.
Качество скринов плохое, у меня в ноуте МСТС ну никак не хочет на nVidia работать, только на встроенной.

roman5
21.09.2021, 22:23
Вот, в этот промежуток впихнуть оба табло: считывающее с входного и с оппозита. Так же: вершинами внутрь.

https://i.ibb.co/Y0DSWqg/image.png
https://i.ibb.co/m5ZC542/image.png

Добавлено через 6 минут
https://i.ibb.co/8570k4y/Clipboard01.gif (https://ibb.co/Ph6Nkz2)


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

КЕ
21.09.2021, 22:35
Тут маркер похоже перепутал, очень похоже, что острие смотрит на перегон и берет показание за входным попутного сигнала.
Не, у левого табло маркер "смотрит" на станцию, т.е. считывает именно с перегона.

roman5
21.09.2021, 23:05
Не, у левого табло маркер "смотрит" на станцию, т.е. считывает именно с перегона.
Похоже маркер стоит после маркера проходного первого, то есть берет показания 2-ого проходного, там то зеленый. А первый проходной должен запрещаюшие аспекты выдать, перегон ведь занят.

vicente
21.09.2021, 23:30
У меня поезд перед входным, поэтому на скринах запрещающие аспекты на проходном.
У Кости он не за 100 с чем-то метров до входного разве?

У вас разные показания на тех двух скринах как раз на табло, считывающем этот входной:(

Добавлено через 3 минуты
В этом (http://www.trainsim.ru/forum/showpost.php?p=602132&postcount=662) сообщении.

Добавлено через 1 минуту
У Романа оба D - 1, у Кости - один D -0, другой - 7. Я что-то упустил?

Добавлено через 2 минуты
https://i.ibb.co/8570k4y/Clipboard01.gif (https://ibb.co/Ph6Nkz2).
Вот здесь уже и у Кости оба D - единицы.

Классное табло получилось, кстати.

КЕ
21.09.2021, 23:49
Вот здесь уже и у Кости оба D - единицы.
Приходящие с входного. Вообще так или не так табло стоят? У Романа они по-другому.

vicente
22.09.2021, 00:42
Костя, я о входном и говорю. На прошлом скрине у тебя другие показатели были. Да, маркеры так. Я писал: "для очистки совести". Там "взадсмотрящих" голов нет, вроде. Но, чтобы не было каких-нибудь непредвиденных сюрпризов с DISTANCE , о которых ты писал, вплотную к нужному маркеру - самое то. Что по аспектам? Как тебе тогда удалось получить DISTANCE 0 и 7? Идеи?

Добавлено через 7 минут

WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { next_INFO = 3; }
if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; } }
Я вижу на табло все коды INFO -7. То есть, WORK1 не "хватает" никакой код по скрипту, который я разбирал. Поэтому next_INFO в том скрипте остаётся 0 (изначально заданный)

Добавлено через 3 минуты
Следующие скрипты, которые предлагаю "прозвонить" - это эти два. ИМХО, один из них должен давать тот самый зелёный, который мы не получаем.

SCRIPT APK_4AB_YRG_YW_ALSN_Zel_B_Z

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( SVET !=# 0 && next_INFO ==# 8 && POEZD ==# 0 ) {
state = SIGASP_CLEAR_2;
if ( sig_feature( SIGFEAT_USER4 ) && SVET ==# 1 ) { state = SIGASP_APPROACH_1; }
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; }
}
}

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_STOP; }
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 && block_state() ==# BLOCK_CLEAR ) { state = SIGASP_RESTRICTING; }
draw_state = def_draw_state (state);

SCRIPT APK_4AB_YR_GY_Kv

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;
if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( SVET ==# 1 ) { state = SIGASP_RESTRICTING; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 3 ) { state = SIGASP_APPROACH_1; }
if ( SVET ==# 4 ) { state = SIGASP_APPROACH_1; }
if ( SVET ==# 5 ) { state = SIGASP_APPROACH_2; }
}
if ( next_INFO ==# 0 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_2; }
if ( SVET !=# 0 ) { state = SIGASP_APPROACH_3; }
if ( !sig_feature( SIGFEAT_USER3 ) ) { state = SIGASP_CLEAR_2; }
}

if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) { state = SIGASP_STOP; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) &&
( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) ) { state = SIGASP_STOP; }
draw_state = def_draw_state (state);

roman5
22.09.2021, 01:54
Я вижу на табло все коды INFO -7. То есть, WORK1 не "хватает" никакой код по скрипту, который я разбирал. Поэтому next_INFO в том скрипте остаётся 0 (изначально заданный)



next_INFO = 8 при объявлении и таким и остается, если INFO = 7, как у нас.

Немного комментов добавил в скрипт APK_3AB_YGR_YW_DISTANCE.

SCRIPT APK_3AB_YGR_YW_DISTANCE

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {

WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; } +++++++++++
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }

if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }

// либо SVET больше 0 - если разрещающий поездной сигнал DISTANCE впереди нижний - либо POEZD на белый или красный_1

WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }

// у нас флаг SIGASP_CLEAR_2 у следующего - показывать зеленый опция
// next_INFO = 8 для SIGASP_CLEAR_2, для остальных меньше


}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; } // в случае включенного перегона в обратную сторону SIGASP_STOP_AND_PROCEED ++++++++
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; } // в случае если перегон не включен в обратную, то SIGASP_STOP_AND_PROCEED
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;

// POEZD=0 если next_sig_lr distance выдает аспект разрещающий поездной


if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 1 ) { state = SIGASP_APPROACH_3; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 3 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 4 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 5 ) { state = SIGASP_CLEAR_2; }
}
if ( next_INFO ==# 0 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) { state = SIGASP_APPROACH_1; } //если STOP info следующая голова - не выбрана обычно опция зеленый огонь и им подобное

// если входной сигнал
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( ( block_state() ==# BLOCK_OCCUPIED || POEZD !=# 0 ) && opp_POEZD !=# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( opp_ONE_WAY ==# 1 || opp_POEZD ==# 2 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) {
state = SIGASP_STOP_AND_PROCEED;
}
draw_state = def_draw_state (state);



Добавлено через 14 минут

Следующие скрипты, которые предлагаю "прозвонить"

APK_4AB_YRG_YW_ALSN_Zel_B_Z выдает STOP.

SCRIPT APK_4AB_YRG_YW_ALSN_Zel_B_Z

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; } // normal mr = stop тут не попадаем
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; } // SVET=5 так как SIGASP_CLEAR_2 Distance впереди
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; } // POEZD = 0 будет
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
// next_INFO = 8 так как опция "зеленый" в настройках следующего сигнала отмечена

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) { // если входной
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; } // перегон включен в обратную opp_ONE_WAY = 1
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; } // opp_POEZD = 0 встречный проходной горит по SIGASP_STOP Distance
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) ) { next_INFO = 8; }

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) { //если проходной - мимо
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( block_state() ==# BLOCK_CLEAR ) {
if ( SVET !=# 0 && next_INFO ==# 8 && POEZD ==# 0 ) { // SVET = 5, next_INFO = 8, POEZD = 0
state = SIGASP_CLEAR_2;
if ( sig_feature( SIGFEAT_USER4 ) && SVET ==# 1 ) { state = SIGASP_APPROACH_1; } // Zeltij ALSN na odin zeltij migajusij - мимо
if ( !sig_feature( SIGFEAT_USER2 ) ) { state = SIGASP_RESTRICTING; } // если снята галка кодируемый сигнал - мимо
}
}

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) { // если входной
if ( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) { state = SIGASP_STOP; } // тут opp_ONE_WAY = 1 получаем SIGASP_STOP в состояние
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 && block_state() ==# BLOCK_CLEAR ) { state = SIGASP_RESTRICTING; }
draw_state = def_draw_state (state);


Добавлено через 5 минут
APK_4AB_YR_GY_Kv тоже STOP выдает.

SCRIPT APK_4AB_YR_GY_Kv

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; } // SVET = 5 distance следующего SIGASP_CLEAR_2 оба
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }

// next_INFO флаг 8 тут остается,
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; } // opp_ONE_WAY = 1 перегон в обратную включен
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; } // opp_POEZD = 0, встречный проходной зажигается по SIGASP_STOP
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;
if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( SVET ==# 1 ) { state = SIGASP_RESTRICTING; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 3 ) { state = SIGASP_APPROACH_1; }
if ( SVET ==# 4 ) { state = SIGASP_APPROACH_1; }
if ( SVET ==# 5 ) { state = SIGASP_APPROACH_2; } // сюда попадаем
}
if ( next_INFO ==# 0 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_2; }
if ( SVET !=# 0 ) { state = SIGASP_APPROACH_3; }
if ( !sig_feature( SIGFEAT_USER3 ) ) { state = SIGASP_CLEAR_2; }
}

if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) { state = SIGASP_STOP; }
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) &&
( opp_POEZD ==# 2 || opp_ONE_WAY ==# 1 ) ) { state = SIGASP_STOP; } // сюда попадаем
draw_state = def_draw_state (state);

КЕ
22.09.2021, 02:08
Как тебе тогда удалось получить DISTANCE 0 и 7?
Не знаем - поезда ехал, моя смотрел.:confused::rofl:
Ничего не менялось - поезд был на подходе к входному светофору, трафиков в сцене нет, только табло стояли немного по-другому, на скрине - вся разница. Самому непонятно.

vicente
23.09.2021, 18:27
Да, описался. 8, конечно.

WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; }
if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; } if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; } // либо SVET больше 0 - если разрещающий поездной сигнал DISTANCE впереди нижний - либо POEZD на белый или красный_1

Почему нижний?

Вообще не рекомендую ловить состояние блока головами типа DISTANCE и делать на этом основании сигнальные выводы. "Козлёночком станешь" (ц)

КЕ
23.09.2021, 18:33
Точно-точно! Дистансы могут и соврать.

vicente
23.09.2021, 18:52
SignalSubObj ( 2
"SIGNAL" "Dlja drugix ukazanij ispolzujte marker!"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_INFO_CLEAR_2" )
)


SCRIPT APK_INFO_CLEAR_2 extern float sig_feature (); extern float def_draw_state (); extern float state; extern float draw_state; state = SIGASP_STOP; if ( sig_feature( SIGFEAT_USER1 ) ) { state = SIGASP_CLEAR_2; } draw_state = def_draw_state (state);

Не даёт выбрать опцию "Dlja drugix ukazanij ispolzujte marker!", потому как не стоит опциональный флаг, ни флаг Default . Поэтому и птичка в настройках не кликабельна. Я так понимаю, шина INFO по умолчанию - CLEAR_2 , если не тыкаем между двумя светофорами маркер.

Добавлено через 7 минут
Поэтому, в нашем случае, например, предыдущему такому же светофору, будь он так установлен, информация по INFO - вообще фиолетова. Он его игнорит программой, причём сделано это явно с умыслом. А что там за выходной с главного пути стоит? Сколько там голов с INFO в названии?

КЕ
23.09.2021, 19:16
А что там за выходной с главного пути стоит? Сколько там голов с INFO в названии?
Вот светофор:

SignalShape (
"APK_4AB_YR_GW_Kr.s"
"APK_4AB_YR_GW_Kr"
SignalSubObjs ( 12
SignalSubObj ( 0
"SIGNAL" "Nastrojki predidusego signala:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_DISTANCE" )
)
SignalSubObj ( 1
"SIGNAL" " - Datj zelenij (inace 2 zeltih)"
SigSubType ( USER1 )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 2
"SIGNAL" "Dlja drugix ukazanij ispolzujte marker!"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_INFO_CLEAR_2" ) /// INFO
)
SignalSubObj ( 3
"SIGNAL" "Nastrojki etogo signala:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_ALSN_KZ_0_B_0" )
)
SignalSubObj ( 4
"SIGNAL" " - Videlitj, esli ALSN kodiruetsa"
SigSubType ( USER2 )
SignalFlags ( OPTIONAL DEFAULT )
)
SignalSubObj ( 5
"SIGNAL" " - Zeltij ALSN na odin zeltij migajusij"
SigSubType ( USER4 )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 6
"SIGNAL" "Odnostoronnij propusk poezda:"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_ALSN_KZ_20_B_20" )
)
SignalSubObj ( 7
"SIGNAL" " - Vhodnoj svetofor"
SigSubType ( GRADIENT_PLATE )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 8
"SIGNAL" " - Prohodnoj svetofor"
SigSubType ( NUMBER_PLATE )
SignalFlags ( OPTIONAL )
)
SignalSubObj ( 9
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_4AB_YR_GW_Kr" )
)
SignalSubObj ( 10
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_3AB_YGR_ALSN_Z_60_B_60" )
)
SignalSubObj ( 11
"SIGNAL" " "
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_4AB_YRG_ALSN_Zel_B_Z" )
)
)
)

vicente
23.09.2021, 19:19
Спасибо. Я так и думал. По INFO - постоянный CLEAR_2. То есть в скрипте next_INFO = 8. Зря табло делали. Мог бы и догадаться я. Прошу прощения

roman5
23.09.2021, 19:39
Вообще не рекомендую ловить состояние блока головами типа DISTANCE и делать на этом основании сигнальные выводы.(ц)
А можно подробнее, для меня эти distance,info,normal как набор равнозначных объектов для хранения состояний. Я как раз и спрашивал выше про особенности.



Почему нижний?

Ну да, наиболее разрешающий аспект там.

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

Проходные зажигаются по stop, а по stop_and_proceed гаснут distance.
Входные Иванцево и Драчеево имеют один скрипт для обработки: APK_3AB_YGR_YW_DISTANCE

Если входной выдаст distance stop_and_proceed, то проходные попутные его подхватят, на другом конце в Драчеево это как-то перекинется на встречное направление - пока не понял где и как, но видимо в логике distance входного Драчеево.

Добавлено через 2 минуты
шина INFO по умолчанию - CLEAR_2
Именно так, на все пути, по умолчанию, выдавать 2 желтых. А ниже этой головы в этих служебных APK_Sluz_INFO_Link_Marker, для настройки путей, на которые зеленый давать.

КЕ
23.09.2021, 20:00
next_INFO = 8
А разве сим может правильно работать при значениях аспектов больше 7?

Добавлено через 5 минут
А можно подробнее, для меня эти distance,info,normal как набор равнозначных объектов для хранения состояний.
Они не равнозначны! (хотя хотелось бы!)
Грубо говоря, NORMAL опрашивается постоянно, DISTANCE немного реже, остальные ещё реже.

Закодировать все необходимые данные для обмена между сигнальными точками только 8 "поездными" кодами невозможно, особенно учитывая, что они созданы для управления движением, а не для передачи служебной информации СЦБ.

DISTANCE выбран как наиболее стабильный и достаточно часто обновляемый, после NORMAL. Далее по тексту канал "D".
Взято отсюда (http://forum.zaborin.ru/topic.php?forum=33&topic=3).

vicente
23.09.2021, 21:03
А разве сим может правильно работать при значениях аспектов больше 7?

Там хитро сделано. 8 задаётся изначально. Передаются обычные аспекты 0-7, в случае если ни одно из условий не соблюдается, остаётся 8, а также - часть из того, что передаётся, позже приравнивается тоже к 8-ми.

КЕ
23.09.2021, 21:17
Помнится, мы с Игорем пробовали со state = 8;, но разные симы по-разному воспринимали такой аспект.

vicente
23.09.2021, 21:27
Костя, нет там аспекта 8. next_INFO - просто переменная внутри скрипта

roman5
23.09.2021, 21:27
Помнится, мы с Игорем пробовали со state = 8;, но разные симы по-разному воспринимали такой аспект.
Там не аспект 8, а локальная переменная.

КЕ
23.09.2021, 21:28
А, да, действительно!

vicente
23.09.2021, 21:31
roman5 по DISTANCE , функция block_state () в тестах показала, что ей нельзя доверять. При фактической занятости безмоторными единицами возвращала BLOCK_CLEAR.

vicente
24.09.2021, 01:15
Вообще есть некоторые отличия между сигнальными головами NORMAL и остальными. Я не разбирал все из них, мне достаточно было что-то прочесть на форумах, у других, что-то протестировать самому или с коллегами, так сказать, по цеху, чтобы отмести не NORMAL сигналы от определённых функций в сигнализации. Конечно, самое главное отличие сигналов NORMAL от всех остальных - только сигнальные головы этого типа останавливают составы AI - трафики. Об этом пишет и Мануал KUJU по сигнализациям MSTS. Тот же Мануал даёт определение "блока", или, как мы привыкли выражаться, блок-участка: от сигнальной точки до следующей сигнальной точки, ИМЕЮЩЕЙ СИГНАЛЬНУЮ ГОЛОВУ ТИПА NORMAL. Это важно понять. Понять и простить. Сигнальными головами типа DISTANCE мы обязаны европейским дефолтным маршрутам (также, как 8 аспектам мы обязаны двум американским). Само название DISTANCE взято из европейских сигнализаций, где есть MAIN - светофоры (по MSTS-овски - NORMAL), DISTANCE - предупредительные, а с этим разработчики впихнули и остальные, "перспективные" типы голов: SHUNTING - маневровые, INFO - всё понятно здесь, REPEATER - повторительные etc. DISTANCE, однако, единственный тип, который используется в дефолте. Я не вижу никакой причины использовать DISTANCE не по своему назначению, как предупредительный сигнал. В любом случае, повторюсь, снимать состояние блока этим типом сигнальной головы - не достоверно. С другой стороны, передача информации, как выражается Костя,, "по шине", думаю, вполне возможна.

Добавлено через 42 минуты

Самое интересное это distance там. Проходные это состояние спрашивают друг у друга по цепи. Состоянием stop_and_proceed идет переключение перегона. Самое интересное - это функциональная голова входных distance.

Проходные зажигаются по stop, а по stop_and_proceed гаснут distance.

Вот, за это - спасибо. Я тогда, когда сигналка эта вышла, так и не понял: как он гасит противоположгое направление. :drinks:

КЕ
24.09.2021, 01:18
То есть в SAP переходят головы "ненужных" светофоров?

roman5
24.09.2021, 01:33
так и не понял: как он гасит противоположгое направление. :drinks:
Я вот его скрипт distance входного смотрю:
SCRIPT APK_3AB_YGR_YW_DISTANCE

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }



}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) { //для входного
WORK1 = opp_sig_mr ( SIGFN_NORMAL ); // опрашиваем проходной встречный рядом со входным вроде ? APK_4AB_YRG_Kv - проходной
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; } // у отключенных проходных APK_ALSN_KZ_20_B_20 выдает stop - не выполняеся это условие
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
//проходной не выдает distance res - тут только opp_POEZD = 1
}

if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;
if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 1 ) { state = SIGASP_APPROACH_3; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 3 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 4 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 5 ) { state = SIGASP_CLEAR_2; }
}
if ( next_INFO ==# 0 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) { state = SIGASP_APPROACH_1; }

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {


if ( ( block_state() ==# BLOCK_OCCUPIED || POEZD !=# 0 ) && opp_POEZD !=# 1 ) { state = SIGASP_STOP_AND_PROCEED; } //вроде должно сработать, когда за входной заедет прибывающий
// и начать переключать перегон, но opp_POEZD = 1 - мимо пройдет
if ( opp_ONE_WAY ==# 1 || opp_POEZD ==# 2 ) { state = SIGASP_STOP_AND_PROCEED; } // тоже не сработает
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) { // не проходной - мимо
state = SIGASP_STOP_AND_PROCEED;
}
draw_state = def_draw_state (state);

Если opp_POEZD !=# 1 поменять на opp_POEZD ==# 1, то гаснут попутные в момент пересечения входного трафиком, но обратное направление не зажигается. Не понятно, в скрипте ошибка или упускаю что-то ?

Добавлено через 1 минуту
То есть в SAP переходят головы "ненужных" светофоров?
Именно и если sap на входном поставить, то все проходные его подхватят и погаснут. Надо теперь понять, чего с другой стороны перегона входной не прокинул "не sap".

vicente
24.09.2021, 01:34
SAP дают головы, если поезд движется "на них" в противоположном направлении. Заманчиво конечно. Проблема в том, что у меня не получалось так "снимать" "оппозиты" - если поезд не движется на светофор, тот в упор не видел светофор за ним...

roman5
24.09.2021, 01:52
"оппозиты"
Кстати в доке не очень понятно opp_sig_mr - функция берет сигнал, который в обратную сторону светит и стоит до текущего сигнала или за ним ?

vicente
24.09.2021, 02:04
Хорошо. Допустим, у меня в "чердаке" перепутались уже MSTS и Open Rails. В последнем светофоры "не видят" "через стрелки" во всех случаях, кроме того, что поезд идёт на этот светофор. В MSTS, понятное дело, всё по-другому и функция block_state () не "убивает" скрипт. Я не вижу в скриптах входных и выходных (один скрипт иногда) того места, где передача STOP_AND_PROCEED прерывается, а она должна прерываться на станциях - скрещения, старты-стопы сервисов и т.п.

Добавлено через 5 минут
Opp_sig_lr/opp_sig_mr - снимают показания сигнала перед светофором по ходу движения поезда на этот светофор в противоположном направлении. То есть, в нашем случае со выходным в Иванцево - речь идёт о первом проходном. Ну, тем, что рядом с входным стоит. Они вершинами маркеров друг на друга смотрят. Да, мануал здесь зажал информацию. На всех форумах её уточняют

Добавлено через 5 минут
И ещё по поводу opp_sig_lr/opp_sig_mr. Когда я завопил на elvastower.com , что меня ограбили и в Open Rails эти функции косячат, один буржуй-сигнализатор "отрезал мне а ответ, что "функции протестированы и работают как в MSTS.

КЕ
24.09.2021, 02:08
Эти функции и в МСТС ненадёжны.

vicente
24.09.2021, 02:12
Я могу допустить, что разница в симуляторах - функция enabled () работает совершенно по-другому и оппозиты снимаются только enabled-головами. В этом случае скрипт АРК работает так как светофоры обратного направления перед сервисом - enabled (в количестве 2-х штук) и если они снимают эти данные - по совокупности того, что я писал раньше, ТЕОРЕТИЧЕСКИ, поезд движущийся по станционному пути в сторону входного обратного направления "включает" этот входной и тот снимает нужный RES с первого проходного, чтобы дать opp_poezd 2

roman5
24.09.2021, 02:43
Я не вижу в скриптах входных и выходных (один скрипт иногда) того места, где передача STOP_AND_PROCEED прерывается, а она должна прерываться на станциях - скрещения, старты-стопы сервисов и т.п.

Вот скрипт distance выходного. Выходной не хватает sap.

SCRIPT APK_3AB_YGR_DISTANCE // прогон для выходных

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
extern float next_sig_mr ();
extern float opp_sig_lr ();
extern float opp_sig_mr ();
extern float sig_feature ();
float WORK1; float ONE_WAY; float SVET; float POEZD; float next_INFO; float opp_ONE_WAY; float opp_POEZD;

ONE_WAY = 0; SVET = 0; POEZD = 0; next_INFO = 8; opp_POEZD = 0; opp_ONE_WAY = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_CLEAR_2 ) { SVET = 5; } if ( WORK1 ==# SIGASP_CLEAR_1 ) { SVET = 4; }
if ( WORK1 ==# SIGASP_APPROACH_3 ) { SVET = 3; } if ( WORK1 ==# SIGASP_APPROACH_2 ) { SVET = 2; }
if ( WORK1 ==# SIGASP_APPROACH_1 ) { SVET = 1; }
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
WORK1 = next_sig_mr ( SIGFN_INFO );
if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; } if ( WORK1 ==# SIGASP_APPROACH_3 ) { next_INFO = 6; }
if ( WORK1 ==# SIGASP_APPROACH_2 ) { next_INFO = 5; } if ( WORK1 ==# SIGASP_APPROACH_1 ) { next_INFO = 4; }
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { next_INFO = 2; } if ( WORK1 ==# SIGASP_RESTRICTING )
{ next_INFO = 3; } if ( WORK1 ==# SIGASP_STOP ) { next_INFO = 0; }
}
if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) { // для входного - мимо
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( next_INFO ==# 0 ) { next_INFO = 8; }
if ( next_INFO ==# 4 ) { next_INFO = 8; }
if ( next_INFO ==# 5 ) { next_INFO = 8; }
if ( next_INFO ==# 6 ) { next_INFO = 8; }
if ( next_INFO ==# 3 && sig_feature( SIGFEAT_NUMBER_PLATE ) )
{ next_INFO = 8; }

state = SIGASP_STOP;
if ( next_INFO ==# 8 && POEZD ==# 0 && block_state() ==# BLOCK_CLEAR ) {
if ( SVET ==# 0 ) { state = SIGASP_CLEAR_1; }
if ( SVET ==# 1 ) { state = SIGASP_APPROACH_3; }
if ( SVET ==# 2 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 3 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 4 ) { state = SIGASP_CLEAR_2; }
if ( SVET ==# 5 ) { state = SIGASP_CLEAR_2; }
}

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) { // для входного - мимо
if ( ( block_state() ==# BLOCK_OCCUPIED || POEZD !=# 0 ) && opp_POEZD !=# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( opp_ONE_WAY ==# 1 || opp_POEZD ==# 2 ) { state = SIGASP_STOP_AND_PROCEED; }
}
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD ==# 1 ) { // для проходных SIGFEAT_NUMBER_PLATE - мимо
state = SIGASP_STOP_AND_PROCEED;
}
draw_state = def_draw_state (state);

Между входным и выходными обычно стоят служебные сигналы скрытые, у них так обычно: копируют состояние distance у последнего проходного.
SCRIPT APK_Copy_DISTANCE

extern float block_state ();
extern float def_draw_state ();
extern float state;
extern float draw_state;
extern float next_sig_lr ();
float WORK1; float POEZD;

POEZD = 0;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) {
WORK1 = next_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }
}

state = SIGASP_STOP;
if ( block_state() !=# BLOCK_JN_OBSTRUCTED ) { state = next_sig_lr ( SIGFN_DISTANCE ); }
if ( block_state() ==# BLOCK_OCCUPIED && POEZD !=# 1 ) { state = SIGASP_RESTRICTING; }
draw_state = def_draw_state (state);

vicente
24.09.2021, 02:43
Эти функции и в МСТС ненадёжны.
В MSTS я точно это деол пробовал. Задумка была немного другая: светофор противоположного направления должен был ловить оппозит светофора перед поездом (скажем, поезд приближается к первому проходному перегона, а входной должен был "ловить" opp_sig_lr (SigFn_NORMAL), что тот - открыт, давть STOP без огней, а уже этот STOP остальные проходные того же (обратного) направления ловят через обычную next_sig_lr (SigFn_NORMAL). Так вот, не фига не работало.

КЕ
24.09.2021, 11:52
Примерно так же пытался делать для манёвров - тоже "фиг вам"! ::wall::

roman5
24.09.2021, 13:08
А как правильно редактировать shape в файле sigcfg.dat, захотел во входном светофоре заменить имя скрипта distance головы на свой, так как родной скрипт используется еще в куче сигналов других и в лог идет еще и с них, хотел отсеять.
Заметил, что в tdb и tit файлах по координатам имена этих скриптов стоят. То есть редактирование sigcfg.dat не дает эффекта.

Правильно ли я понял, что можно в tdb и tit поправить имя скрипта, зная координаты нужного сигнала ?

КЕ
24.09.2021, 13:33
Прежде чем что-то менять в sigcfg - надо удалить изменяемые светофоры, и только потом их установить заново.

vicente
24.09.2021, 13:44
Если сигнальная голова используется ещё где-то, надо не заменять, а добавлять. Я описывал несколько страниц назад процедуру. Добавить Signal_Head, написать её скрипт, добавить его в sigscr.dat , затем заменить в нужном SignalShape нужный саб-объект. Обязательно иметь в виду, что в редакторе сценариев светофор нужно как минимум "подвигать", а лучше - удалить и установить заново. Даже если просто поменят тип Signal_Head , скажем с NORMAL на DISTANCE.

КЕ
24.09.2021, 13:48
Лучше переустановить, ведь все субобъекты в БД записываюся. И зная глючность МСТС-редактора в этом деле - лучше перестраховаться.

vicente
24.09.2021, 15:06
Примерно так же пытался делать для манёвров - тоже "фиг вам"!
Да, тоже для манёвров тестил. "Настроил" даух-ходовочку - маркер смртит на входной через opp_sig_lr(SigFn_NORMAL), а маневровый светофор - на маркер через opp_sig_lr (SigFn_DISTANCE), потом - через opp_sig_lr (SigFn_NORMAL). Маневровый ловил аспект функцией без проблем, а вот, маркер...

КЕ
24.09.2021, 15:21
То есть получается - маркер за входным на перегоне?

vicente
24.09.2021, 20:53
Если имеется ввиду опция opp_sig_xx, то она работает так же как next_sig_xx, только в обратную сторону. Там есть ряд ограничений на тип головы, сейчас точно не помню. Вроде REPEATER не ловил, и можно было использовать не во всех головах. Это актуально для МСТС
В том-то и дело. Там не только тип головы, а ещё ограничения! Я только не могу уже припомнить: что там касается Open Rails , а что - MSTS.

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

Добавлено через 2 минуты
То есть получается - маркер за входным на перегоне?

Да. Идея была в этом. В принципе, "связка" : входной- первый проходной в Иванцево - тоже подходит под определение. Так как их маркеры расположены

КЕ
24.09.2021, 21:25
С проходным на тестах в МСТС бывало такое - пока маневровая ездючина проходит горловину, он !enabled (аспект STOP в моем случае, и на выходном, естественно, белый). Но при выходе за последнюю стрелку и проходе за точку разворота этот проходной "включался" и открывался.

roman5
24.09.2021, 22:24
Прежде чем что-то менять в sigcfg - надо удалить изменяемые светофоры, и только потом их установить заново.
Все удалить проблемно, я ведь не знаю, где автор еще такой же поставил. А мне для теста только 1 из них заменить интересно.

КЕ
24.09.2021, 23:01
Можно по имени шейпа в *.w найти место установки.

vicente
24.09.2021, 23:24
А мне для теста только 1 из них заменить интересно.
Я же написал как делать.
Копмруешь шейп саетофора, переименовав его (файлы *.s
и *.sd, не забывая в редакторе подправить внутри *.sd название шейпа).
Добавляешь в sigcfg.dat тестовый шейп, копируя нужный блок шейпов. Не забыть увеличить на 1 общее количество шейпов в шапке Signal_Shapes.
Также добавляешь 1 в шапке Signal_Heads , копируешь блок головы, которую хочешь изменить в светофоре.
Меняешь в тестовом шейпе головы
Скрипт новой головы добавляешь в sigscr.dat
Меняешь тот светофор, который хочешь тестировать на маршруте на тестовый

Добавлено через 10 минут
С проходным на тестах в МСТС бывало такое - пока маневровая ездючина проходит горловину, он !enabled (аспект STOP в моем случае, и на выходном, естественно, белый). Но при выходе за последнюю стрелку и проходе за точку разворота этот проходной "включался" и открывался.
Я не сталкивался с этим, и знаешь почему? А какая мне разница: что происходит с первым проходным после того, как я получил белый на выходгом и выехал к точке разворота? Тем более, если я проехал за неё? У меня и в MSTS и в стабильной версии Open Rails , если помнишь, первый проходной, если был !enabled, давал 2, выходной быд запрограмирован на следующий 2 давать тоже 2. Вот и все манёвры на выходном. Как только я его проехал, в RESTRICTING на первом проходном необходимость - дело пятое. Единственное, когда он RESTRICTING , будет белый на локомотивном, а если проходной станет enabled и изменится на CLEAR_2 , локомотивный сменится на зелёный. Кстати, в реале как АЛСН работает в такой ситуации? Белый до проследования входного, потом что в сторону перегона? Ловит зелёный или нет?

КЕ
25.09.2021, 00:39
...А какая мне разница: что происходит с первым проходным после того, как я получил белый на выходном и выехал к точке разворота? Тем более, если я проехал за неё?
Я пытался его STOP ловить по opp_sig_lr(), искал условия для манёвров, чтобы зажечь белый на маневровом Б-С, стоящем у первой стрелки. А сейчас просто вспомнил.
У меня и в MSTS и в стабильной версии Open Rails, если помнишь, первый проходной, если был !enabled, давал 2, выходной был запрограммирован на следующий 2 давать тоже 2. Вот и все манёвры на выходном.
Олег, а чем лучше на !enabled давать "2", а не "0"?
А, понял, это для ORTS.
Вообще да, при движении по горловине в сторону перегона белый легко зажечь. А вот обратно...
Кстати, в реале как АЛСН работает в такой ситуации? Белый до проследования входного, потом что в сторону перегона? Ловит зелёный или нет?
А кто его знает... наверно, зелёный покажет, если проходной открыт.

vicente
25.09.2021, 02:48
Я пытался его STOP ловить по opp_sig_lr(), искал условия для манёвров, чтобы зажечь белый на маневровом Б-С, стоящем у первой стрелки. А сейчас просто вспомнил.
Хм... Хорошо, но если этот проходной
if (!enabled) {state = SIGASP_STOP;}
и становится в какой-то момент enabled и меняет аспект, как только ты переводишь реверс, он снова должен становиться !enabled ... Даже трафик пройдя точку разворота (правильно для MSTS ), сделает движение в сторону даже закрытого сигнала и "перевернёт" этот проходной снова в !enabled.
С оппозитами есть ещё одна байда - функция делает проблемы, если между соответствующими светоформи находится поезд, насколько я помню.


Олег, а чем лучше на !enabled давать "2", а не "0"?
А, понял, это для ORTS.
Вообще да, при движении по горловине в сторону перегона белый легко зажечь. А вот обратно...
Дело не в симуляторе. С выходным в MSTS другая проблема: выход на манёвры "по удалению" невозможен. Откроется поездной сигнал. По этой логике решается только служебным маркером на границе станции, дающим STOP и RESTRICTING . Я ставил его back_facing головой на входном, а выходной на следующий STOP оставался закрытым. Так что, STOP я использовал для этого. Конечно, заманчиво не ставить маркеры в тупиках, но в MSTS катастрофически не хватает аспектов, а информацию от светофора к светофору можно передать только аспектами... ну... кому я рассказываю? ;)
Потому и RESTRICTING.




Насчёт обратной стороны, в MSTS было настроено так:
RESTRICTING давался
1. На занятый путь
2. На свободный путь, если следующий- тоже RESTRICTING
В остальных случаях:
1. На следующий STOP_AND_PROCEED- STOP_AND_PROCEED со скоростью желтого
2. На остальные аспекты следующего светофора - state = next_state;
Показания прописывались отдельно, через draw_state - белый на RESTRICTING , остальные аспекты горели синими.
Конечно, было не идеально, но терпимо.
Если поезд останавливался у красного входного, который был прописан на следующий RESTRICTING давать STOP_AND_PROCEED красный, был виден горящий белым маневровый - это раз. При маневрах на свободный путь с закрытым выходным, маневровый оставался синим при том, что он открывался STOP_AND_PROCEED. Но... Для MSTS , повторяю, было удовлетворительно. В MSTS , напомню, трафики не сцепляются, а игрок на свободный путь, в основном, "обгоняется". Если ехать строго по показаниям, а выходной закрыт из-за блокировки, игрок может и подождать пока выходной откроется RESTRICTING и ему откроется маневровое показание.
Идея с оппозитами заключалась в том, что поезд с перегона - ему обязательно должен открыться входной, прежде чем он проедет его. В MSTS функция block_state () не определяет направление движения поезда, по-любому она вернёт BLOCK_OCCUPIED если блок занят. Поэтому и пытался ловить через оппозит открытый входной. Но, этого не достаточно. Маневровый должен не просто поймать момент, когда входной открыт. Он должен ещё запомнить, что входной был открыт, когда голова поезда проследует этот входной и сигнал перекроется. А это - ой как не просто в статическом скрипте. Мне казалось, что , сегодня, после того как я научился запоминать информацию в Open Rails , мне удастся соорудить что-то подобное для MSTS . Как я уже писал, я собирался написать новую сигналку, которая будет работать в обоих симуляторах, плюс мультиплейер... но... пока жизнь не даёт на это времени.

А кто его знает... наверно, зелёный покажет, если проходной открыт.

Мне нужна информация по АЛСН. Маневры на перегон, маневры по станции, потеря кодов в поездном режиме. Когда какие коды. В интернете, что-то, не густо в этом плане...:o

КЕ
25.09.2021, 11:01
Хорошо, но если этот проходной
if (!enabled) {state = SIGASP_STOP;}
и становится в какой-то момент enabled и меняет аспект, как только ты переводишь реверс, он снова должен становиться !enabled ... Даже трафик пройдя точку разворота (правильно для MSTS ), сделает движение в сторону даже закрытого сигнала и "перевернёт" этот проходной снова в !enabled.
Нет, проходной оставался открытым при реверсе.
в MSTS катастрофически не хватает аспектов
Но если б можно было передавать аспекты "вперед" по ходу сервиса.... Мечты!:(
Насчёт обратной стороны, в MSTS было настроено так:
RESTRICTING давался...
Насколько надежно это работало?
Он должен ещё запомнить, что входной был открыт, когда голова поезда проследует этот входной и сигнал перекроется. А это - ой как не просто в статическом скрипте.
Да, трудновато!)) Я так и не добился надёжного сохранения внутренней переменной. Поэтому и мечтал о передаче "вперёд".:o
Мне нужна информация по АЛСН. Маневры на перегон, маневры по станции, потеря кодов в поездном режиме. Когда какие коды. В интернете, что-то, не густо в этом плане...
Спросил на форуме http://scbist.com/obschie-voprosy-ekspluatacii-ustroistv-scb/28682-glupye-voprosy-632.html?
ЗЫ:
Залез сюда (http://www.elvastower.com/forums/index.php?app=members&module=messaging&section=view&do=showConversation&topicID=43761&st=0#msg121253).))

vicente
25.09.2021, 12:58
Нет, проходной оставался открытым при реверсе.
Да, это так. Подзабыл, прошу прощения. Ровно 10 лет назад я нацарапал на заборе тестил эту функцию "чистым тестом" с блэкджеком и шлюхами с фотографиями (к сожалению, сайты давно почили в бозе, и много материала утеряно). Описание теста прилагаю полным текстом сообщения, за исключением скринов..

Немного о функции*enabled

Данная функция является внешней функцией относительно скрипта. Мы знаем, что в скриптах есть функции внешние, то есть прописаны они в другом месте - ехе-файле симулятора и изменять в работе самой функции мы ничего не можем (см.мануал) и есть функции, которые, теоретически, может прописать разработчик сигнализации внутри самого скрипта (чем и занимаюсь сейчас для создания своего варианта одностороннего пропуска).
Итак, enabled.
Кужувский разработчик пишет:

Код:

Contains TRUE (non-zero) if the current signal instance is enabled to show
its natural state, or FALSE otherwise.


Это значит, что функция возвращает единицу, если светофор включен, чтобы показать его состояние, в противном случае - выдает 0.
То есть не все светофоры на маршруте работают по скрипту, а только те, которые находятся впереди и позади сервиса на определенном расстоянии. Расстоянием здесь является не километраж и не количество узлов, как в подготовке маршрута МСТС, а количество светофоров. Какое кол-во светофоров будут enabled перед сервисом (кстати, не важно сервис ли это игрока или трафик) мы задаем в файле конфигурации сигнала в параметре SignalNumClearAhead. Небольшой тест покажет наглядно как это работает.
Я поставил на перегоне проходные светофоры (модели Тимаса), прописав в них SignalNumClearAhead (2), обычные сигналы проходного 3АБ, а при функции enabled = 0, или правильней - !enabled - синий.

Результат - перед сервисом 2 светофора зеленые, остальные - синие - !enabled. Это понятно. Цель теста - выяснить, что с остальными светофорами на перегоне. У нас еще три направления. На скрине мы видим, что за занятым сервисом блок-участком светофор красный, то есть enabled. За этим светофором, против хода сервиса,как и положено желтый, а уже перед ним - !enabled - синий.
Что происходит с противоположной стороны?


Перед сервисом 2 светофора становятся enabled красный и желтый. Светофоры же позади него сразу же становятся !enabled - синие.
Интересно, что если я возвращаюсь назад, то светофоры по мере удаления от них остаются enabled - зелеными. То есть если я вернусь на 2 блок-участка, то впереди меня будет не 2, а 4 зеленых светофора. В обратном же направлении, направлении движения, ни один светофор enabled не становится.

Нужное место я выделил под спойлером в последнем абзаце

Добавлено через 30 минут

Но если б можно было передавать аспекты "вперед" по ходу сервиса.... Мечты!:(
Ну, с MSTS уже вряд ли что можно сделать. Но, мечты сбываются в наше время в Open Rails , и это дело обещают/сделано уже там. Но, как поётся в песне, "того, что нужно нам, всегда на свете нет..." Прграммировать светофоры для этого нужно с С#, а я вообще не знаю его, и в жизни программированием не занимаюсь.


Насколько надежно это работало?
Всегда. Там никакого выпендрёжа нет, на самом деле. Вся цепочка светофоров NORMAL-ы, каждый работает по известным и накатанным функциям и зависит толькоот следующего сигнала. Единственное- пришлось поднять SignalNumClearAhead , а я это очень не люблю. Но, маршрут - мой личный, ворочу чего хочу, в сценариях, естественно, я это учитывал.

КЕ
25.09.2021, 13:05
Прграммировать светофоры для этого нужно с С#...
В смысле - менять исходный код ORTS?
... Единственное- пришлось поднять SignalNumClearAhead , а я это очень не люблю. Но, маршрут - мой личный, ворочу чего хочу, в сценариях, естественно, я это учитывал.
Какое число было необходимым?

vicente
25.09.2021, 13:14
Да, трудновато!)) Я так и не добился надёжного сохранения внутренней переменной. Поэтому и мечтал о передаче "вперёд".:o
То, что я хотел сделать и описал выше - наоборот - "ловить" поездной режим, а если не ловится - скрипт маневрового. У меня сейчас так в Open Rails с внешними переменными (в Open Rails можно кидать переменные во внешние регистры и не только запоминать их, но и "снимать" эти переменные с других светофоров. К сожалению, только по аналогии MSTS : next_.. (next_n...) и opp_... . Но, я не удовлетворён его работой - иногда оппозит преподносит сюрпризы (дело в скриптах, нужно переделывать) из-за того, что стрелки в Open Rails остаются в последнем положении и, если кто-то "сбивает" маршрут к светофору, с которого я снимаю данные (перекрёстный маршрут), тупая программа "ловит" переменные, к примеру, не с нужного маркера, а с другого... или из тупика. :crazy:

КЕ
25.09.2021, 13:29
Оег, ты говоришь про это? -
Записывать данные: store_lvar (key, value)
Извлекать их: this_sig_lvar (key)
Передавать: next_sig_lvar (key), и id_sig_lvar (sigid, key)
next_sig_id (SigFn_Type) - функция, которая идентифицирует сигнал для дальнейшей работы с ним по идентификатору, который она возвращает

direction = this_sig_lvar (1);
if (block_state ==# BLOCK_JN_OBSTRUCTED) {state = SIGASP_RESTRICTING;store_lvar (1,1);}
else { store_lvar (1,0);}
Первая цифра в скобках - "разряд", вторая - само значение. Можно запоминать их сколько угодно! Под каждым "разрядом" - своя переменная. В смысле, под (1,Х) - одни переменные, (2,Х) - другие и т.д.


Нашёл интересное замечание в наших давних сообщениях:

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

vicente
25.09.2021, 13:33
Какое число было необходимым?
7

roman5
25.09.2021, 13:44
Прграммировать светофоры для этого нужно с С#, а я вообще не знаю его, и в жизни программированием не занимаюсь.

Удобный язык для программирования, еще qt c++ мощная штука. В msts внешнее апи очень урезанное, даже под отладку нормальных возможностей не дали - из скрипта невозможно определить с каким из шейпов идет работа. Приходится извращаться: снимать user1-4 опции у нужных сигналов, чтобы получить уникальный набор future.

Я тут поборол сигналку на БМО 1.8. Покопав далее скрипт distance входных сигналов заметил такое:

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
WORK1 = opp_sig_mr ( SIGFN_NORMAL );
if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_ONE_WAY = 1; }
WORK1 = opp_sig_lr ( SIGFN_DISTANCE );
if ( WORK1 ==# SIGASP_RESTRICTING ) { opp_POEZD = 2; } if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { opp_POEZD = 1; }
}

if ( sig_feature( SIGFEAT_GRADIENT_PLATE ) && !sig_feature( SIGFEAT_NUMBER_PLATE ) ) {
if ( ( block_state() ==# BLOCK_OCCUPIED || POEZD !=# 0 ) && opp_POEZD !=# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( opp_ONE_WAY ==# 1 || opp_POEZD ==# 2 ) { state = SIGASP_STOP_AND_PROCEED; }
}

Оказывается для удержания направления перегона используют не только SAP в distance, но и SAP в normal проходных сигналов.

Глянул код голов normal у проходных, нашел это:

state = SIGASP_STOP;
if ( sig_feature( SIGFEAT_NUMBER_PLATE ) && POEZD !=# 1 ) {
if ( block_state() !=# BLOCK_CLEAR || POEZD ==# 2 || ONE_WAY ==# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
}
То есть, если сигналы включены, то distance POEZD = 0 по скрипту и занятые участки будут в normal SAP ставить.

А выше это в коде:

WORK1 = next_sig_mr ( SIGFN_NORMAL ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { ONE_WAY = 1; }

Обеспечивает удержание sap на головах normal, где участки уже clear.

Направление перегона переключается не в Иванцево, а в Драчеево, то есть с другого конца, по редактору видно, что enable не дотягивает до входного, его скрипт не срабатывает. Попробовал увеличить вAPK_3AB_YGR_YW_DISTANCE параметр SignalNumClearAhead до 15. Теперь работает на тестовой сцене.

vicente
25.09.2021, 13:51
В смысле - менять исходный код ORTS?

Нет. Исходный код меняют разрабы. Есть там определённая процедура изменения кода. "Открытость" состоит в том, что любой желающий может предложить изменения в коде, а команда вносит эти изменения в тестовые версии по своему усмотрению. Русификацию, например, делает твой "визави" на форуме Игоря... ну, тот, что в беседу тебя внёс на elvastower.com , ссылку на которую ты мне кинул :D
Речь идёт о замене sigscr.dat на программу на С#.

Кстати, молодёжь, кто знает Шарп? Я вообще в нем ни бум-бум! :o
Может кто-нибудь набрость какой-нибудь скрипт сигнальной головы? Я имею в виду перевод из этого недо-С в С#... Я бы глянул и смекнул: что к чему. Потому что самоучитель я ниасиливаю (стар?), да и времени, если честно - совсем на него нет. Туплю на азах, в общем.
Форма скрипта в с# такова:

using System;
using Orts.Simulation.Signalling;

namespace ORTS.Scripting.Script
{ public class MYSIGNALTYPE : CsSignalScript // мой сигнальный тип - название Signal_Head
{
public override void Initialize()
{
// Perform some initializations here, taking into account // that no route information is available at this point
}
public override void Update()
{
// Set the aspect of your signal here depending on route state } public override void HandleSignalMessage(int signalId, string message)
{} } }

roman5
25.09.2021, 13:59
Кстати, молодёжь, кто знает Шарп? Я вообще в нем ни бум-бум! :o
Да проблема не в языке, а в самом проекте, нужно ведь изучить сорцы OR, прочитать даташиты по их функционалу, что и как подавать в эти переопределяющие методы ovveride. Сам язык понять можно быстро по ютуб урокам.

Судя по всему вся логика в Update. А вот HandleSignalMessage это что не очень понял, то ли для отладки, то ли обмен инфой между сигналами.

vicente
25.09.2021, 14:16
Рома, я писал, что не вижу по Иванцево буфера изменения направления. Головы входного "хватают" STOP_AND_PROCEED с выходного и соответственно - противоположное направление. А как в Драчеево это переключается? Там стоит дополнительный служебный маркер?

И, это... спасибо за проделанную работу. Дотошный :D

Добавлено через 4 минуты
Источник скачивается на сайте. Если понимаешь язык, можешь разобраться не только с сигналкой, но и с другими интересующими вещами в соответствующих cs файлах. Меня интересует пока только синтаксис

Добавлено через 11 минут

Судя по всему вся логика в Update. А вот HandleSignalMessage это что не очень понял, то ли для отладки, то ли обмен инфой между сигналами.
Если честно, пока (подчёркиваю- пока), вся эта авантюра с С# - довольно спорна. Но, старое поколение уходит, может быть, в скором времени вся логика, заимствованная из MSTS будет переписана. Это не есть хорошо, ИМХО, так как совместимость с MSTS - основоопределяющее условие, которое было заявлено при открытии проекта. Сейчас она (совместимость эта) всё дальше и дальше. Главная причина перехода на С#-скрипты - уаеличение аспектов, которых тупым американцам кое-кому там не хватает. Снятие информации с предыдущего светофора промелькнуло в одном из постов, но с тех пор по теме - тишина. Синтаксис, как я уже сказал, моя главная проблема, но беглым просмотром sc я узнаю знакомые функции. Пока по сигналам "сзади" - глухо.

roman5
25.09.2021, 14:39
Головы входного "хватают" STOP_AND_PROCEED с выходного и соответственно - противоположное направление.
Не совсем так, выходные вроде тут вообще не участвуют, у них нету в distance SAP. Между входным и выходными стоят служебные маркеры: они выдают res на занятые либо копируют distance с выходного, но там все кроме sap. То есть когда появляется поезд на станции, входной видит res состояние на маркере. И тут делает себе sap:
if ( ( block_state() ==# BLOCK_OCCUPIED || POEZD !=# 0 ) && opp_POEZD !=# 1 ) { state = SIGASP_STOP_AND_PROCEED; }
if ( opp_ONE_WAY ==# 1 || opp_POEZD ==# 2 ) { state = SIGASP_STOP_AND_PROCEED; }

При чем тут несколько вариантов, opp_POEZD=0 для станции отправления:
1. Поезд еще на станции POEZD=2 - попадаем в первый if, потом выезжаем за маркер, тут по block_state() начинает sap удерживаться.
2. На Драчеево стоит маркер около входного встречный.
3. Когда заезжаем за входной, на встречном проходном скрипт делает на normal голове аспект sap, благодаря этому теперь opp_ONE_WAY=1 помогает держать перегон.
В тех случаях, где входной и встречный проходной не рядом стоят, то за счет встречного маркера у входного делается opp_POEZD=2 - состояние res встречного маркера.

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

Добавлено через 14 минут
Немножко скринов еще сделал.

https://s211vla.storage.yandex.net/rdisk/aabbde5b669ae2f4481f86b9535ba636316e26da12a8f4ed00 88bfc843807432/614f3369/CP0r4W7WBqH1rzBA08nC4dSHB9NBKYWTVvXur3FQYzlWW0ve7G buUBTO0SFRUT-zO0U0tg0NY2Xy7SutJph6RA==?uid=0&filename=скрин.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&owner_uid=0&fsize=6158980&hid=e66f946d1c2d88d42353df6bdc6529b8&media_type=image&tknv=v2&etag=aa177c74985ba659ed0bd397b98645f3&rtoken=ikV2VPtqKCcG&force_default=no&ycrid=na-73296d88f8ae215f3a32364f55c8dc10-downloader13f&ts=5ccd2c234ec40&923c7898e5226691c790fcae3ec9f53b&pb=U2FsdGVkX1_NOwEFOQiMFHP9xVzSo1O8LvXkxXfpFvjnAUW IEkYG0i44ayGbHPzldywxYqLCOcrid6BNDMA0s68-yMDKRo03hc2anjgbTaM

На 1-2 скринах: никого нет, сигналка в обе стороны включена.
На 3: трафик появился, белый на маркере, sap подхватился.
На 4-5 выезд со станции. Переключение маркера на clear2 - перегон свободен за ним.
На 6-7: проходной изначально stop normal, по проезду на sap перешел.

КЕ
25.09.2021, 17:09
У всех скрины открываются? А то у меня - нет.

Predator
25.09.2021, 17:19
У всех скрины открываются? А то у меня - нет.
У меня не открываются.

КЕ
25.09.2021, 19:03
Ром, скрины проверь - не открываются!

Добавлено через 1 час 3 минуты
Синтаксис, как я уже сказал, моя главная проблема, но беглым просмотром sc я узнаю знакомые функции. Пока по сигналам "сзади" - глухо.
Сюда бы еще Рому RWM, он тоже вроде программер. Жаль, давно пропал с форумов...

Predator
25.09.2021, 19:40
Ребята, а есть ли способ решения задачи, при которой бы сервис игрока или трафика, смог бы выехать за сигнал светофора, после чего сделав реверс в сторону этого же светофора, уже по заранее проложенному пути? Насколько мне известно, это невозможно, так как на светофоре горит красный и как только проезжаешь его, игра заканчивается.

КЕ
25.09.2021, 19:45
В MSTS - разгонись, потом КМ в ноль, и реверс назад. Проедешь закрытый сигнал без разбора у начальника депо!:crazy:

Predator
25.09.2021, 21:08
А как трафик в этом случае поведёт себя? :)

КЕ
25.09.2021, 21:21
Встанет у красного, разумеется.

roman5
25.09.2021, 21:55
У всех скрины открываются? А то у меня - нет.
Перезалил, хотел с яндекс диск дать ссылки на оригинальные скрины, не пожатые.


https://i.ibb.co/wd1vyBt/1.png
https://i.ibb.co/Nj2gHBV/2.png
https://i.ibb.co/JCkPRx2/3.png
https://i.ibb.co/vxdDTkk/4.png
https://i.ibb.co/vhhfN3G/5.png
https://i.ibb.co/r3n7TCm/6.png
https://i.ibb.co/Q8kSLFM/7.png

vicente
25.09.2021, 22:24
Олег, ты говоришь про это? -
Именно



Нашёл интересное замечание в наших давних сообщениях:

"Как молоды мы были, как молоды мы были..."
Именно так эта функция описана кужувцами в Документации по сигнализациям MSTS . Не я один "сел в лужу" с оппозитами, надо сказать в своё оправдание. Вполне себе уважаемые Буржуи в отношении сигнализаций, тоже не вкуривали этот вопрос, пока знающие люди не разъяснили. На данный момент, совершенно очевидно: как работают функции с префиксом opp_

КЕ
25.09.2021, 22:28
...Не я один "сел в лужу" с оппозитами...
Я тоже там!:rofl:

Мне нужна информация по АЛСН. Маневры на перегон, маневры по станции, потеря кодов в поездном режиме. Когда какие коды. В интернете, что-то, не густо в этом плане...:o
Ответили на СЦБист.ком:

Зависит от типа АБ.
На числовой кодовой поймает код (любой код, а не только зелёный, значность кода зависит от места нахождения ранее отправленного поезда или числа блок-участков на коротком перегоне)
На АБТЦ не поймает.
На АБТ 80-х годов поймает, 90-х - не поймает, пока не доедет до первой сигнальной установки по удалению.

vicente
26.09.2021, 09:45
Ребята, а есть ли способ решения задачи, при которой бы сервис игрока или трафика, смог бы выехать за сигнал светофора, после чего сделав реверс в сторону этого же светофора, уже по заранее проложенному пути? Насколько мне известно, это невозможно, так как на светофоре горит красный и как только проезжаешь его, игра заканчивается.
Двойную точку разворота на стрелках не пробовал? Так, чтобы первыц реверс был до последней стрелки до занятого пути?

КЕ
26.09.2021, 10:24
Олег, и что это даст? Это маневры, что ли?

Добавлено через 3 минуты
Сигнализация не дает белый на маневры?

Predator
26.09.2021, 11:25
Сигнализация не дает белый на маневры?
Видимо нет, так как это особенность сигнализации MSTS. Игра не понимает маневровый режим. Все светофоры открываются в поездном режиме.

КЕ
26.09.2021, 11:50
Иногда это все-таки удается сделать, но зависит от путевого развития и расстановки самих светофоров.
Если после отцепки лок уходит в тупик, например. Но это надо скрипт сигнализации смотреть.

vicente
26.09.2021, 12:23
Олег, и что это даст? Это маневры, что ли?
Ну, если я правильно понял "вводную", то - да. Светофор может быть закрыт либо из-за поездной ситуации, либо из-за скрипта (бывает, линк не прописан, неправильная установка светофора - такое тоже бывало, и т.п.).
Что это даст? В Open Rails такой "финт" укоротит блок до точки разворота. Вот и подумал: "чем чёрт не шутит?" :D

Сигнализация не дает белый на маневры?
Надо бы уточнить: какой маршрут, какая версия (вычислить: что за сигналка) и какой светофор. Я так понимаю, речь идёт о входном. Входной и не должен давать маневровый

Predator
26.09.2021, 12:50
Ребята, а есть ли способ решения задачи, при которой бы сервис игрока или трафика, смог бы выехать за сигнал светофора, после чего сделав реверс в сторону этого же светофора, уже по заранее проложенному пути? Насколько мне известно, это невозможно, так как на светофоре горит красный и как только проезжаешь его, игра заканчивается.

Двойную точку разворота на стрелках не пробовал? Так, чтобы первыц реверс был до последней стрелки до занятого пути?
Хочу скорректировать свой вопрос более грамотно в понимании задачи:
Сервис игрока отправляется со станции по зелёному сигналу светофора по заранее заданному пути. После чего, заезжает за выходной светофор и останавливается за точкой разворота чуть подальше от неё. Меняю кабину на обратный путь, чтобы проехать этот выходной светофор. Как только проезжаю его, игра заканчивается и появляется сообщение: Вы проехали на красный сигнал светофора. Пробывал разные способы проезда но результат один и тот же. Может дело в скриптах светофора? Что скажете? ;)

КЕ
26.09.2021, 13:17
А если проезжать точно до точки разворота?
На этом светофоре есть обратносмотрящая "голова" (не обязательно с видимым огнем), которая почему-то не открывается.
Но чтобы сказать точнее, надо знать маршрут и конкретно это место - что за светофор там стоит.
Какой маршрут и какая сигнализация на нем?
Хотя возможен какой-то сбой в путевой базе данных маршрута - иногда помогала переустановка светофора.

Predator
26.09.2021, 13:36
А если проезжать точно до точки разворота?
Что я и сделал, без изменений.
Какой маршрут и какая сигнализация на нем?
Маршрут Светлогорск-Александровск-Верхнегорск-Лучистая, версии 1
Вымышленный русский маршрут, протяженностью около 180 километров. Маршрут неэлектрифицирован.Тестирую манёвры вблизи станции Иваньковская. Какая сигнализация на маршруте, к сожалению затрудняюсь ответить.
Скрин, неоткрывающегося светофора:https://c.radikal.ru/c37/2109/26/e3ba8bd46f08.png

vicente
26.09.2021, 13:41
Всё равно "не вкурил"! Ты выехал "за выходной", остановился "за точкой разворота" (где? На стрелках? В горловине? Получается : между выходным и входным с противоположной стороны?). И что дальше? Ты меняешь кабину (на противоположную?), едем обратно? Выходной, получается, с другой стороны пути? То есть, если первый, к примеру - четный, во втооом случае, "выходной" - нечетный?
И, ещё раз просим маршрут и версия маршрута!

КЕ
26.09.2021, 13:59
Там тимасовская сигналка, поковырянная Бигманом.:D

Predator
26.09.2021, 13:59
Выходной, получается, с другой стороны пути?

Да, c другой и с этой, ближней стороны, как на скрине, как я предполагаю. Поправьте меня, если что не так. :o
едем обратно?
Да, едем обратно.

И, ещё раз просим маршрут и версия маршрута!
Маршрут Светлогорск
Версия 1.0

КЕ
26.09.2021, 14:06
Какой-то непонятный выходной - 2-линзовый...
И если происходит "проезд", то точно дело в нем.

vicente
26.09.2021, 15:16
Хм... похоже, маневровый NORMAL WR (?) . У него есть одна интересная деталь. А можно скриншот редактора сценариев и на нем указать место, на котором сделан предыдущий скрин и как-то выделить/обозначить PATH этого сервиса. Сразу обозначу подозрение. Если светофор - тот, о котором я говорю и дальше есть противошерстная стрелка не по марщруту - будет красный

КЕ
26.09.2021, 15:57
WR? Вроде говорилось про зеленый...