![]() |
[B] roman5 [/B] по DISTANCE , функция block_state () в тестах показала, что ей нельзя доверять. При фактической занятости безмоторными единицами возвращала BLOCK_CLEAR.
|
Вообще есть некоторые отличия между сигнальными головами 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: |
То есть в SAP переходят головы "ненужных" светофоров?
|
[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". |
SAP дают головы, если поезд движется "на них" в противоположном направлении. Заманчиво конечно. Проблема в том, что у меня не получалось так "снимать" "оппозиты" - если поезд не движется на светофор, тот в упор не видел светофор за ним...
|
[QUOTE=vicente;602234]"оппозиты"[/QUOTE]
Кстати в доке не очень понятно opp_sig_mr - функция берет сигнал, который в обратную сторону светит и стоит до текущего сигнала или за ним ? |
Хорошо. Допустим, у меня в "чердаке" перепутались уже 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]. |
Эти функции и в МСТС ненадёжны.
|
Я могу допустить, что разница в симуляторах - функция enabled () работает совершенно по-другому и оппозиты снимаются только enabled-головами. В этом случае скрипт АРК работает так как [B]светофоры обратного направления перед сервисом - enabled[/B] (в количестве 2-х штук) и если они снимают эти данные - по совокупности того, что я писал раньше, ТЕОРЕТИЧЕСКИ, поезд движущийся по станционному пути в сторону входного обратного направления "включает" этот входной и тот снимает нужный RES с первого проходного, чтобы дать opp_poezd 2
|
[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] |
[QUOTE=КЕ;602240]Эти функции и в МСТС ненадёжны.[/QUOTE]
В MSTS я точно это деол пробовал. Задумка была немного другая: светофор противоположного направления должен был ловить оппозит светофора перед поездом (скажем, поезд приближается к первому проходному перегона, а входной должен был "ловить" [B]opp_sig_lr (SigFn_NORMAL)[/B], что тот - открыт, давть STOP без огней, а уже этот STOP остальные проходные того же (обратного) направления ловят через обычную next_sig_lr (SigFn_NORMAL). Так вот, не фига не работало. |
Примерно так же пытался делать для манёвров - тоже "фиг вам"! ::wall::
|
А как правильно редактировать shape в файле [B]sigcfg.dat[/B], захотел во входном светофоре заменить имя скрипта distance головы на свой, так как родной скрипт используется еще в куче сигналов других и в лог идет еще и с них, хотел отсеять.
Заметил, что в [B]tdb [/B]и [B]tit [/B]файлах по координатам имена этих скриптов стоят. То есть редактирование [B]sigcfg.dat[/B] не дает эффекта. Правильно ли я понял, что можно в tdb и tit поправить имя скрипта, зная координаты нужного сигнала ? |
Прежде чем что-то менять в [I]sigcfg[/I] - надо удалить изменяемые светофоры, и только потом их установить заново.
|
Если сигнальная голова используется ещё где-то, надо не заменять, а добавлять. Я описывал несколько страниц назад процедуру. Добавить 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