Форум Trainsim

Форум Trainsim (http://www.trainsim.ru/forum/index.php)
-   MSTS - Маршруты (http://www.trainsim.ru/forum/forumdisplay.php?f=19)
-   -   Сигнализация: конфигурация и скрипты (http://www.trainsim.ru/forum/showthread.php?t=13819)

vicente 23.09.2021 21:31

[B] roman5 [/B] по DISTANCE , функция block_state () в тестах показала, что ей нельзя доверять. При фактической занятости безмоторными единицами возвращала BLOCK_CLEAR.

vicente 24.09.2021 01:15

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

[size="1"][color="Silver"]Добавлено через 42 минуты[/color][/size]
[QUOTE=roman5;602218]
Самое интересное это distance там. Проходные это состояние спрашивают друг у друга по цепи. Состоянием stop_and_proceed идет переключение перегона. Самое интересное - это функциональная голова входных distance.

Проходные зажигаются по stop, а по stop_and_proceed гаснут distance.
[/QUOTE]
Вот, за это - спасибо. Я тогда, когда сигналка эта вышла, так и не понял: как он гасит противоположгое направление. :drinks:

КЕ 24.09.2021 01:18

То есть в SAP переходят головы "ненужных" светофоров?

roman5 24.09.2021 01:33

[QUOTE=vicente;602229]так и не понял: как он гасит противоположгое направление. :drinks:[/QUOTE]
Я вот его скрипт distance входного смотрю:
[SPOILER][CODE]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);[/CODE][/SPOILER]

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

[size="1"][color="Silver"]Добавлено через 1 минуту[/color][/size]
[QUOTE=КЕ;602231]То есть в SAP переходят головы "ненужных" светофоров?[/QUOTE]
Именно и если sap на входном поставить, то все проходные его подхватят и погаснут. Надо теперь понять, чего с другой стороны перегона входной не прокинул "не sap".

vicente 24.09.2021 01:34

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

roman5 24.09.2021 01:52

[QUOTE=vicente;602234]"оппозиты"[/QUOTE]
Кстати в доке не очень понятно opp_sig_mr - функция берет сигнал, который в обратную сторону светит и стоит до текущего сигнала или за ним ?

vicente 24.09.2021 02:04

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

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

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

КЕ 24.09.2021 02:08

Эти функции и в МСТС ненадёжны.

vicente 24.09.2021 02:12

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

roman5 24.09.2021 02:43

[QUOTE=vicente;602236]Я не вижу в скриптах входных и выходных (один скрипт иногда) того места, где передача STOP_AND_PROCEED прерывается, а она должна прерываться на станциях - скрещения, старты-стопы сервисов и т.п.[/QUOTE]

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

[SPOILER][CODE]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);[/CODE][/SPOILER]

Между входным и выходными обычно стоят служебные сигналы скрытые, у них так обычно: копируют состояние distance у последнего проходного.
[SPOILER][CODE]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);[/CODE][/SPOILER]

vicente 24.09.2021 02:43

[QUOTE=КЕ;602240]Эти функции и в МСТС ненадёжны.[/QUOTE]
В MSTS я точно это деол пробовал. Задумка была немного другая: светофор противоположного направления должен был ловить оппозит светофора перед поездом (скажем, поезд приближается к первому проходному перегона, а входной должен был "ловить" [B]opp_sig_lr (SigFn_NORMAL)[/B], что тот - открыт, давть STOP без огней, а уже этот STOP остальные проходные того же (обратного) направления ловят через обычную next_sig_lr (SigFn_NORMAL). Так вот, не фига не работало.

КЕ 24.09.2021 11:52

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

roman5 24.09.2021 13:08

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

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

КЕ 24.09.2021 13:33

Прежде чем что-то менять в [I]sigcfg[/I] - надо удалить изменяемые светофоры, и только потом их установить заново.

vicente 24.09.2021 13:44

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


Текущее время: 09:31. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
© 2001-2019, Администраторы и разработчики Клуба Trainsim