Форум 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 22.09.2021 00:42

Костя, я о входном и говорю. На прошлом скрине у тебя другие показатели были. Да, маркеры так. Я писал: "для очистки совести". Там "взадсмотрящих" голов нет, вроде. Но, чтобы не было каких-нибудь непредвиденных сюрпризов с 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]

roman5 22.09.2021 01:54

[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]

КЕ 22.09.2021 02:08

[QUOTE=vicente;602167]Как тебе тогда удалось получить DISTANCE 0 и 7? [/QUOTE]
[I]Не знаем - поезда ехал, моя смотрел.[/I]:confused::rofl:
Ничего не менялось - поезд был на подходе к входному светофору, трафиков в сцене нет, только табло стояли немного по-другому, на скрине - вся разница. Самому непонятно.

vicente 23.09.2021 18:27

Да, описался. 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 и делать на этом основании сигнальные выводы. "Козлёночком станешь" (ц)

КЕ 23.09.2021 18:33

Точно-точно! Дистансы могут и соврать.

vicente 23.09.2021 18:52

[QUOTE]
SignalSubObj ( 2
"SIGNAL" "Dlja drugix ukazanij ispolzujte marker!"
SigSubType ( SIGNAL_HEAD )
SigSubSType ( "APK_INFO_CLEAR_2" )
)[/QUOTE]

[QUOTE]
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);
[/QUOTE]
Не даёт выбрать опцию "Dlja drugix ukazanij ispolzujte marker!", потому как не стоит опциональный флаг, ни флаг Default . Поэтому и птичка в настройках не кликабельна. Я так понимаю, шина INFO по умолчанию - CLEAR_2 , если не тыкаем между двумя светофорами маркер.

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

КЕ 23.09.2021 19:16

[QUOTE=vicente;602213]А что там за выходной с главного пути стоит? Сколько там голов с INFO в названии?[/QUOTE]
Вот светофор:

[SPOILER]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" ) ///[COLOR="Red"] [B]INFO[/B][/COLOR]
)
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" )
)
)
)[/SPOILER]

vicente 23.09.2021 19:19

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

roman5 23.09.2021 19:39

[QUOTE=vicente;602211]
Вообще не рекомендую ловить состояние блока головами типа DISTANCE и делать на этом основании сигнальные выводы.(ц)[/QUOTE]
А можно подробнее, для меня эти distance,info,normal как набор равнозначных объектов для хранения состояний. Я как раз и спрашивал выше про особенности.

[QUOTE=vicente;602211]

Почему нижний?
[/QUOTE]
Ну да, наиболее разрешающий аспект там.

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

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

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

[size="1"][color="Silver"]Добавлено через 2 минуты[/color][/size]
[QUOTE=vicente;602213] шина INFO по умолчанию - CLEAR_2[/QUOTE]
Именно так, на все пути, по умолчанию, выдавать 2 желтых. А ниже этой головы в этих служебных [B]APK_Sluz_INFO_Link_Marker[/B], для настройки путей, на которые зеленый давать.

КЕ 23.09.2021 20:00

[QUOTE=vicente;602213]
next_INFO = 8[/quote]
А разве сим может правильно работать при значениях аспектов больше 7?

[size="1"][color="Silver"]Добавлено через 5 минут[/color][/size]
[QUOTE=roman5;602218]А можно подробнее, для меня эти distance,info,normal как набор равнозначных объектов для хранения состояний.[/QUOTE]
Они не равнозначны! (хотя хотелось бы!)
Грубо говоря, NORMAL опрашивается постоянно, DISTANCE немного реже, остальные ещё реже.
[quote]
Закодировать все необходимые данные для обмена между сигнальными точками только 8 "поездными" кодами невозможно, особенно учитывая, что они созданы для управления движением, а не для передачи служебной информации СЦБ.

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

vicente 23.09.2021 21:03

[QUOTE=КЕ;602220]А разве сим может правильно работать при значениях аспектов больше 7?
[/QUOTE]
Там хитро сделано. 8 задаётся изначально. Передаются обычные аспекты 0-7, в случае если ни одно из условий не соблюдается, остаётся 8, а также - часть из того, что передаётся, позже приравнивается тоже к 8-ми.

КЕ 23.09.2021 21:17

Помнится, мы с Игорем пробовали со [B]state = 8;[/B], но разные симы по-разному воспринимали такой аспект.

vicente 23.09.2021 21:27

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

roman5 23.09.2021 21:27

[QUOTE=КЕ;602223]Помнится, мы с Игорем пробовали со [B]state = 8;[/B], но разные симы по-разному воспринимали такой аспект.[/QUOTE]
Там не аспект 8, а локальная переменная.

КЕ 23.09.2021 21:28

А, да, действительно!


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

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