![]() |
[QUOTE=КЕ;602068]
Ещё раз создал тестовый сценарий[/QUOTE] Можно даже 1 трафик пустить, запускаю с Иванцево до Драчеево и там реверсом обратно. Обратно выходной не выпускает, если проехать на красный выходной, то следующий служебный 120 res впереди меняется на зеленый, после этого выходной начинает открываться и направление перегона переключается. |
Все-таки там что-то не то с БД пути. Нужен еще один патч.))
|
[QUOTE=vicente;602072]
Каждая сигнализация - творчество Автора. Как он видит, так и пишет.[/QUOTE] Вопрос про головы Normal,Distance,Info был именно о сигналке 1.8 бмо. То есть, что в каких типах голов там. А также как ее правильно расставить на тестовом маршруте, то есть куда и как надо ставить служебные сигналы - маркеры. |
Никто об этом не расскажет лучше [URL="http://xn----btb0ae6ajy.xn--p1ai/index.php?/topic/78-signalizaciya-dlya-msts-rts-open-rails-versiya-apk-v7137015/"]автора[/URL]
В сообщение #9 описываются все типы сигнальных точек |
Версии v3 и v7 сильно отличаются друг от друга
|
Ну,, это кому - как ;)
Я не просто так к отослал девятому пункту |
[SPOILER][url=https://imgbb.com/][img]https://i.ibb.co/dLRLkXQ/Clipboard02.gif[/img][/url][/SPOILER]
Вот здесь табло слева показывает коды, идущие в РЦ от этого чётного входного светофора на Иванцево: 2 красных аспекта "1" [B]Dn[/B] и [B]Dv[/B] - коды DISTANCE, соответствующие видимому красному огню. Nn и Nv - "0" и "2", аспекты NORMAL, и на мониторе пути будет виден более высший аспект "2" - RESTRICTING. Табло справа - коды, приходящие по РЦ к этому входному от впередистоящего светофора (не виден за кривой). Как видно по кодам, тот открыт - и NORMAL (в РЦ 2 значения - "0" и "7", сервисы едут по высшему, а низший передаёт доп. инфу), и по DISTANCE - "7". На Мониторе пути будет зелёный, видимый огонь тоже зеленый. Станционный путь свободен. Ошибка работы входного очевидна. [COLOR="Blue"]Но в РТС он работает правильно.[/COLOR] |
[QUOTE=КЕ;602093]
Станционный путь свободен. Ошибка работы входного очевидна. [/QUOTE] Давайте теперь попробуем разобрать все его скрипты этого входного, чтобы понять где ошибка в коде. |
Ну, я ставлю на то, что там не хватает какого-нибудь служебного маркера. Между входным и выходным.
У меня нет этого маршрута и сигнализации этой версии, так что, если хотите - скрипты всех девяти подобъектов Signal_Head в этом шейпе- в студию. Начать предлагаю с NORMAL -голов. Почему у нас RESTRICTING 20, а не CLEAR_2 без ограничения скорости. Поэтому для начала сократим количество скриптов до пяти. То есть, выложите всё, что имеет в названии ALSN. |
[QUOTE=vicente;602096]скрипты всех девяти Signal_Head в этом шейпе- в студию.[/QUOTE]
[SPOILER][CODE]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" ) ) ) )[/CODE][/SPOILER] [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 ); 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); [/CODE][/SPOILER] [SPOILER][CODE]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);[/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER] |
[SPOILER][CODE]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); [/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER] |
Ну, давайте попробуем выяснить: какая из NORMAL голов выдаёт нам наш RESTRICTING . Это сложно, но возможно. В MSTS единственная информация, которую можно передать от одной сигнальной головы к другой - аспекты.
Первая голова типа NORMAL - APK_ALSN_KZ_0_B_0. Так как sig_feature USER2 у нас выбрана в настройках светофора (скрин из TSRE5 от [B]roman5[/B]) и блок, как вы утверждаете, своюоден, методом исключения, голова даст RESTRICTING только когда opp_POEZD 2, или opp_ONE_WAY 1.. opp_ONE_WAY будет 1 когда сигнал NORMAL "сзади" входного по ходу движения будет наиболее запрещающим аспектом (нижним) давать STOP_AND_PROCEED. opp_POEZD будет 2 когда голова DISTANCE, расположенная так же, наиболее разрешающим аспектом (вехним) будет в RESTRICTING. [size="1"][color="Silver"]Добавлено через 5 минут[/color][/size] Так что, Костя, пожалуйста, поставь ещё одно табло так, чтобы оно смотрело "назад". И, да. Лёша использует и DISTANCE и INFO в своей сигнализации. Так что, сигнальные головы в табло не должны быть этих типов. Надо поменять их на что-нибудь другое. SHUNTING, REPEATER... [size="1"][color="Silver"]Добавлено через 18 минут[/color][/size] [Ушел спать] Я в предыдущих постах говорил о "религии"... Так вот, эта "блуждающая" рабочая переменная WORK1 меня всегда настораживала. Это не С++ и даже не С. Буржуи называют эту программу "с натяжкой Quake C" - С очень ограниченный в функционале. Я всегда боялся даже присваивать переменным начальные значения в sigscr.dat считая эту программу статической... |
[QUOTE=vicente;602100]Лёша использует и DISTANCE и INFO в своей сигнализации. Так что, сигнальные головы в табло не должны быть этих типов. Надо поменять их на что-нибудь другое. SHUNTING, REPEATER...
[/QUOTE] В табло головы REPEATER, так что вроде все нормально, мы не вмешиваемся в его логику. [QUOTE=vicente;602100] Так вот, эта "блуждающая" рабочая переменная WORK1 меня всегда настораживала. Это не С++ и даже не С. [/QUOTE] Хочешь сказать, что она может быть не локальной [CODE]float WORK1;[/CODE], а глобальной, то есть один скрипт будет писать в нее, другой прочитает из нее ( в С++ эта называется проблемой обращения с общей памятью - мьютексы ). [size="1"][color="Silver"]Добавлено через 21 минуту[/color][/size] [QUOTE=vicente;602100] opp_ONE_WAY будет 1 когда сигнал NORMAL "сзади" входного по ходу движения будет наиболее запрещающим аспектом (нижним) давать STOP_AND_PROCEED. [/QUOTE] Похоже так. [SPOILER][IMG]https://i.ibb.co/PTjq4kT/image.png[/IMG][/SPOILER] [size="1"][color="Silver"]Добавлено через 13 минут[/color][/size] [QUOTE=vicente;602100]методом исключения, голова даст RESTRICTING только когда opp_POEZD 2, или opp_ONE_WAY 1.. [/QUOTE] А там ведь еще условие [CODE]if ( POEZD !=# 0 || next_INFO ==# 7 )[/CODE] [B]POEZD [/B] будет не 0, если [CODE]WORK1 = next_sig_lr ( SIGFN_DISTANCE ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }[/CODE] Но DISTANCE next сигнала на табло SIGASP_CLEAR_2. Потом: [CODE]WORK1 = next_sig_mr ( SIGFN_INFO ); if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; }[/CODE] На табло нет INFO, я добавил вывод в лог, поправив скрипт Табло: [CODE]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);[/CODE] Получил в логе: 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. То есть в это условие не попадаем. |
[QUOTE=vicente;602100]... Так вот, эта "блуждающая" рабочая переменная WORK1 меня всегда настораживала. Это не С++ и даже не С... Я всегда боялся даже присваивать переменным начальные значения в sigscr.dat считая эту программу статической...[/QUOTE]
Может быть, Леше это удалось. Я, например, сколько ни пытался сохранять переменные (для манёвров) - бесполезно, они не работают. Или сбрасываются при опросе сигнальных точек, или вообще не реагируют. [SPOILER][url=https://ibb.co/L0TCP62][img]https://i.ibb.co/S6kKx09/Clipboard03.gif[/img][/url][/SPOILER] Табло только показывает в левых столбцах коды DISTANCE, а само - REPEATER. Вот поставил обратносмотрящее - левое. Скинул [B]Roman5[/B] свой "БМО" c [I]YardCam[/I] для удобства наблюдений. |
[QUOTE=roman5;602103]В табло головы REPEATER, так что вроде все нормально, мы не вмешиваемся в его логику.[/QUOTE]
Я не помнил: какие типы голов на табло. Я с телефона всё это делаю. [QUOTE=roman5;602103] Хочешь сказать, что она может быть не локальной (...), а глобальной, то есть один скрипт будет писать в нее, другой прочитает из нее ( в С++ эта называется проблемой обращения с общей памятью - мьютексы ). [/QUOTE] В неё пишется 4 раза. 2 со следующего/их сигнала/ов (головы DISTANCE и NORMAL, теоретически, могут быть на разных сигналах, я не смотрел всю конфигурацию сигнализации на этот предмет). Я говорю о том, что в реальном времени, если несколько условий для WORK1 будут одинаковыми, соответствующие переменные получат соответствующие значения одновременно. Но, возможно, автор всё просчитал, и так и должно работать. Я бы сделал по-другому: WORK1, WORK2 и т.д. Но, я не Автор :D Костя, я как раз пол-года назад задумался над новой сигнализацией с совершенно новой логикой и собирался запоминать переменные по принципу "условие - 1, условие - 0, не выполняется ни то, ни другое условие - переменная остаётся в последнем значении, т.е. запоминается". Не вижу причин, что не будет работать. Но, до сигнализации так и не добрался пока - жизнь закрутилась и пришлось отложить на неопределённый срок. [QUOTE=roman5;602103] Похоже так. [/QUOTE] "Оппозит" - светофор "сзади по ходу" в противоположном направлении. Но, я хотел бы знать: где стоит маркер табло слева у тебя на скрине? [QUOTE=roman5;602103] А там ведь еще условие [CODE]if ( POEZD !=# 0 || next_INFO ==# 7 )[/CODE] [B]POEZD [/B] будет не 0, если [CODE]WORK1 = next_sig_lr ( SIGFN_DISTANCE ); if ( WORK1 ==# SIGASP_STOP_AND_PROCEED ) { POEZD = 1; }[/CODE] Но DISTANCE next сигнала на табло SIGASP_CLEAR_2. Потом: [CODE]WORK1 = next_sig_mr ( SIGFN_INFO ); if ( WORK1 ==# SIGASP_CLEAR_1 ) { next_INFO = 7; }[/CODE] [/QUOTE] Мы ищем сейчас: какой из NORMAL -ов даёт этот наиболее разрешающий RESTRICTING. STOP_AND_PROCEED - более запрещающий и нас он сейчас не интересует. [QUOTE=roman5;602103] То есть в это условие не попадаем.[/QUOTE] Надо искать сигнальную голову, подпадающую под все условия и дающую аспект 2. [size="1"][color="Silver"]Добавлено через 28 минут[/color][/size] Повторяю/поясняю: [QUOTE]if ( block_state() ==# BLOCK_CLEAR ) { if ( POEZD !=# 0 || next_INFO ==# 7 ) { state = SIGASP_STOP_AND_PROCEED; [/QUOTE] ...даёт STOP_AND_PROCEED, а не требуемый RESTRICTING , поэтому это условие не выполняется. Данная сигнальная голова, когда блок впереди не занят и нет враждебной стрелки, даст RESTRICTING только в случае, который я описал в предыдущем посте. [size="1"][color="Silver"]Добавлено через 4 минуты[/color][/size] Судя по [URL="http://www.trainsim.ru/forum/showpost.php?p=602109&postcount=654"]скрину[/URL], приведенному [B]КЕ[/B], эта сигнальная голова - "чиста". Попробуйте просчитать следующую голову с ALSN. |
[quote] запоминать переменные по принципу "условие - 1, условие - 0, не выполняется ни то, ни другое условие - переменная остаётся в последнем значении, т.е. запоминается".[/quote]
Опять маневры?:) |
[QUOTE=vicente;602115]
"Оппозит" - светофор "сзади по ходу" в противоположном направлении. Но, я хотел бы знать: где стоит маркер табло слева у тебя на скрине? [/QUOTE] Маркер стоит перед проходным светофором, конусом в сторону, в которую проходной светит. То есть снимает показания с проходного этого. [SPOILER][IMG]https://i.ibb.co/KWGBCjP/image.png[/IMG][/SPOILER] |
Да, всё правильно. Просто табло развёрнуто в другую сторону, поэтому не понял.
Кстати, насчёт POEZD !=# 0 || next_INFO ==# 7 ты тоже прав. Должно выполняться. Просмотрел, что нет фигурной скобки. В любом случае, это не эта голова даёт нам RESTRICTING [size="1"][color="Silver"]Добавлено через 2 минуты[/color][/size] Сложно всё. Нужно делать ещё одно табло (чтобы не крафтить новый шейп) для INFO. Скопироаать и переназвать шейп, прописать его в конфиге и написать ему скрипт [size="1"][color="Silver"]Добавлено через 1 минуту[/color][/size] [QUOTE=КЕ;602119]Опять маневры?:)[/QUOTE] Ахаха! Ну, ты же маня знаешь! Они-самые. |
[QUOTE=vicente;602121]Нужно делать ещё одно табло (чтобы не крафтить новый шейп) для INFO. Скопироаать и переназвать шейп, прописать его в конфиге[/QUOTE]
Править шейп, то есть *.s файл ? Не достаточно поправить *.ace и дописать скрипты ? |
Нужно скопировать *.s, переименовав его (скажем, добавив "_INFO". Скопировать *.sd файл, переименовав его также, как и *.s. Не забыть открыть его в блокноте и изменить имя *.s файла на новое. Прописать новые сигнальные головы в sigcfg.dat, а также говый SignalShape, не забывая при этом уведичит на "1" общее количество шейпов и количество новый SignalHeads на сколько новых голов добавлено. Написать скрипты для новых голов по аналогии с существующими. Если уж совсем делать "как нужно" и, чтобы не путать табло между собой, можно подправить и *.асе
[size="1"][color="Silver"]Добавлено через 20 минут[/color][/size] Но, для того, чтобы шейп обращался к другому *.асе, нужно править сам файл *.s. Если не ошибаюсь, это Костино табло. Так что, исходник у него должен быть. В крайнем случае, расконверт через SFM (если *.s сжат) и правка в блокноте ссылки на файл текстуры. |
Можно перерисовать текстуру, сделав не 4, а 6 или 8 столбцов, сам шейп растянуть в ширину, и в скриптах добавить субобъекты для других типов (INFO, SHUNTING).
|
Не понял. А почему у вас разные показания на табло?
[QUOTE=roman5;602103] [SPOILER][IMG]https://i.ibb.co/PTjq4kT/image.png[/IMG][/SPOILER] [/QUOTE] [QUOTE=КЕ;602109] [SPOILER][url=https://ibb.co/L0TCP62][img]https://i.ibb.co/S6kKx09/Clipboard03.gif[/img][/url][/SPOILER] [/QUOTE] [size="1"][color="Silver"]Добавлено через 2 минуты[/color][/size] Это ожно и то же место? Или это разные станции? |
Судя по кустам:) - одно и то же. Может, сами табло по-разному стоят впереди и сзади светофоров?...
|
[QUOTE=roman5;602120]Маркер стоит перед проходным светофором, конусом в сторону, в которую проходной светит. То есть снимает показания с проходного этого.
[SPOILER][IMG]https://i.ibb.co/KWGBCjP/image.png[/IMG][/SPOILER][/QUOTE] Костя, у тебя не так? |
У меня обратносмотрящее табло стоит самым левым на скрине, а у Романа "прямые".
Могло ли это как-то повлиять... да вроде нет, они же репитеры все. Если только где-то код "застревает" на одном табло. Про такие "триггерные" случаи вроде мы у Игоря на форуме говорили... Только там речь была про опрос типов DISTANCE. Смысл был такой, что скрипты субобъектов NORMAL и DISTANCE в одном светофоре могут неодновременно опрашиваться и отрабатываться. |
Может, "для чистоты эксперимента" вы оба засунете табло входного и проходного внутрь маркеров этих светофоров вершинами друг к другу? Хотя, если поездная ситуация одинаковая, не вижу причин на такую разницу в кодах входного. Но, самое интересное - на твоём скрине Dv - 7, тем не менее, входной горит красным. У Лёши голова DISTANCE - это видимый сигнал. В смысле, показание. Что там за DISTANCE такой, что он 7, но не светофор? Пипец
|
[QUOTE=vicente;602140] табло входного и проходного внутрь маркеров этих светофоров вершинами друг к другу[/QUOTE]
Не понял, как ты хочешь их расположить? |
Маркеры входного и первого проходного, стоящих друг напротив друга, "смотрят" друг на друга вершинами "пирамидок", так? Между ними есть промежуток. Вот, в этот промежуток впихнуть оба табло: считывающее с входного и с оппозита. Так же: вершинами внутрь.
|
[QUOTE=vicente;602132]Не понял. А почему у вас разные показания на табло?
[/QUOTE] У меня поезд перед входным, поэтому на скринах запрещающие аспекты на проходном. |
[SPOILER][url=https://ibb.co/Ph6Nkz2][img]https://i.ibb.co/8570k4y/Clipboard01.gif[/img][/url][/SPOILER]
Олег, вроде такого? Входной всё так же красный. Это Роман5 мне прислал новые табло, там слева направо идут DISTANCE, NORMAL и INFO. Левое показывает аспекты с проходного. Качество скринов плохое, у меня в ноуте МСТС ну никак не хочет на nVidia работать, только на встроенной. |
[QUOTE=vicente;602142]Вот, в этот промежуток впихнуть оба табло: считывающее с входного и с оппозита. Так же: вершинами внутрь.[/QUOTE]
[SPOILER][IMG]https://i.ibb.co/Y0DSWqg/image.png[/IMG] [IMG]https://i.ibb.co/m5ZC542/image.png[/IMG][/SPOILER] [size="1"][color="Silver"]Добавлено через 6 минут[/color][/size] [QUOTE=КЕ;602147][SPOILER][url=https://ibb.co/Ph6Nkz2][img]https://i.ibb.co/8570k4y/Clipboard01.gif[/img][/url][/SPOILER] [/QUOTE] Тут маркер похоже перепутал, очень похоже, что острие смотрит на перегон и берет показание за входным попутного сигнала. |
[QUOTE=roman5;602148]Тут маркер похоже перепутал, очень похоже, что острие смотрит на перегон и берет показание за входным попутного сигнала.[/QUOTE]
Не, у левого табло маркер "смотрит" на станцию, т.е. считывает именно с перегона. |
[QUOTE=КЕ;602150]Не, у левого табло маркер "смотрит" на станцию, т.е. считывает именно с перегона.[/QUOTE]
Похоже маркер стоит после маркера проходного первого, то есть берет показания 2-ого проходного, там то зеленый. А первый проходной должен запрещаюшие аспекты выдать, перегон ведь занят. |
[QUOTE=roman5;602145]У меня поезд перед входным, поэтому на скринах запрещающие аспекты на проходном.[/QUOTE]
У Кости он не за 100 с чем-то метров до входного разве? У вас разные показания на тех двух скринах как раз на табло, считывающем этот входной:( [size="1"][color="Silver"]Добавлено через 3 минуты[/color][/size] В [URL="http://www.trainsim.ru/forum/showpost.php?p=602132&postcount=662"]этом[/URL] сообщении. [size="1"][color="Silver"]Добавлено через 1 минуту[/color][/size] У Романа оба D - 1, у Кости - один D -0, другой - 7. Я что-то упустил? [size="1"][color="Silver"]Добавлено через 2 минуты[/color][/size] [QUOTE=КЕ;602147][SPOILER][url=https://ibb.co/Ph6Nkz2][img]https://i.ibb.co/8570k4y/Clipboard01.gif[/img][/url][/SPOILER].[/QUOTE] Вот здесь уже и у Кости оба D - единицы. Классное табло получилось, кстати. |
[QUOTE=vicente;602156]Вот здесь уже и у Кости оба D - единицы.[/QUOTE]
Приходящие с входного. Вообще так или не так табло стоят? У Романа они по-другому. |
Костя, я о входном и говорю. На прошлом скрине у тебя другие показатели были. Да, маркеры так. Я писал: "для очистки совести". Там "взадсмотрящих" голов нет, вроде. Но, чтобы не было каких-нибудь непредвиденных сюрпризов с DISTANCE , о которых ты писал, вплотную к нужному маркеру - самое то. Что по аспектам? Как тебе тогда удалось получить DISTANCE 0 и 7? Идеи?
[size="1"][color="Silver"]Добавлено через 7 минут[/color][/size] [QUOTE] 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; } } [/QUOTE] Я вижу на табло все коды INFO -7. То есть, WORK1 не "хватает" никакой код по скрипту, который я разбирал. Поэтому next_INFO в том скрипте остаётся 0 (изначально заданный) [size="1"][color="Silver"]Добавлено через 3 минуты[/color][/size] Следующие скрипты, которые предлагаю "прозвонить" - это эти два. ИМХО, один из них должен давать тот самый зелёный, который мы не получаем. [QUOTE=roman5;602098][SPOILER][CODE]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); [/CODE][/SPOILER] [SPOILER][CODE]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); [/CODE][/SPOILER][/QUOTE] |
[QUOTE=vicente;602167]
Я вижу на табло все коды INFO -7. То есть, WORK1 не "хватает" никакой код по скрипту, который я разбирал. Поэтому next_INFO в том скрипте остаётся 0 (изначально заданный) [/QUOTE] next_INFO = 8 при объявлении и таким и остается, если INFO = 7, как у нас. Немного комментов добавил в скрипт [B]APK_3AB_YGR_YW_DISTANCE[/B]. [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; 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); [/CODE][/SPOILER] [size="1"][color="Silver"]Добавлено через 14 минут[/color][/size] [QUOTE=vicente;602167] Следующие скрипты, которые предлагаю "прозвонить"[/QUOTE] [B]APK_4AB_YRG_YW_ALSN_Zel_B_Z[/B] выдает STOP. [SPOILER][CODE]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); [/CODE][/SPOILER] [size="1"][color="Silver"]Добавлено через 5 минут[/color][/size] [B]APK_4AB_YR_GY_Kv[/B] тоже STOP выдает. [SPOILER][CODE]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); [/CODE][/SPOILER] |
[QUOTE=vicente;602167]Как тебе тогда удалось получить DISTANCE 0 и 7? [/QUOTE]
[I]Не знаем - поезда ехал, моя смотрел.[/I]:confused::rofl: Ничего не менялось - поезд был на подходе к входному светофору, трафиков в сцене нет, только табло стояли немного по-другому, на скрине - вся разница. Самому непонятно. |
Да, описался. 8, конечно.
[QUOTE=roman5;602172] 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 [/QUOTE] Почему нижний? Вообще не рекомендую ловить состояние блока головами типа DISTANCE и делать на этом основании сигнальные выводы. "Козлёночком станешь" (ц) |
Точно-точно! Дистансы могут и соврать.
|
Текущее время: 07:03. Часовой пояс GMT +4. |
Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
© 2001-2019, Администраторы и разработчики Клуба Trainsim