Исправил при помощи крепкого кофе с шоколадкой и одного умного пожилого киповца вместе обсудили логику и решили проблему решилось довольно легко просто сделал противо включение как на пускателях при реверсе если едим в сторону А то условии стороны Б чтоб не мешалось и наоборот ну и попутно еще несколько ошибочек и недоработок нашли и устранили.
Код:
FUNCTION_BLOCK TELEGA
VAR_INPUT
start, stop : BOOL; (* Экранные кнопки СТАРТ и СТОП *)
sens_reidi_a : BOOL; (* Включение обратная связь *)
sens_reidi_b : BOOL; (* Включение обратная связь *)
reset : BOOL; (* Сигнал сброса аварии *)
reset_buton : BOOL; (* Сигнал сброса аварии *)
adres : DWORD; (* Адрес необходимого положения механизма *)
pologenie : DWORD; (* Текущее положение механизма *)
TR_reidi : BOOL; (* Транспортёр тележки контроль работы*)
alarm_stop_a : BOOL; (* Аварийный датчик конец транспортёра сторона А *)
alarm_stop_b : BOOL; (* Аварийный датчик конец транспортёра сторона В *)
END_VAR
VAR_OUTPUT
OUT_A: BOOL;
OUT_B: BOOL; (* Выходы движения на пускатель*)
alarm : BOOL;
END_VAR
VAR
timer_reidi: TON; (* Контроль включения *)
start_Q: BOOL;
pologenie_a: BOOL;
pologenie_b: BOOL;
END_VAR
(******************************************************)
(*Обработка кнопки СТАРТ*)
IF start =TRUE AND NOT TR_reidi THEN (* Транспортёр тележки должен быть выключен во время движения, контроль *)
start_Q:=TRUE;
END_IF(*END Обработка кнопки СТАРТ*)
(*Обработка кнопки СТОП*)
IF stop =TRUE THEN
start_Q:=FALSE;
out_a:=FALSE;
out_b:=FALSE;
pologenie_a:=FALSE;
pologenie_b:=FALSE;
END_IF(*END Обработка кнопки СТОП*)
IF start_Q =TRUE THEN (**Обработка кнопки СТАРТ**)
timer_reidi(in:=FALSE); (* Обнуляем таймер *)
IF adres > pologenie AND NOT pologenie_b THEN (**Выбор направления движения тележки и запуск движения pologenie_a**)
pologenie_a:=TRUE;
out_a:=TRUE;
out_b:=FALSE;
timer_reidi(in:= NOT sens_reidi_a, pt:=T#5s, Q=>alarm);
IF timer_reidi.Q =TRUE THEN
start_Q:=FALSE;
END_IF
END_IF(**END Выбор направления движения тележки и запуск движения pologenie_a**)
IF pologenie_a AND adres = pologenie THEN (**Остановка тележки на выбраном силосе pologenie_a**)
out_a:=FALSE;
pologenie_a:=FALSE;
start_Q:=FALSE;
END_IF (**END Остановка тележки на выбраном силосе pologenie_a**)
IF adres < pologenie AND NOT pologenie_a THEN (**Выбор направления движения тележки и запуск движения pologenie_b**)
pologenie_b:=TRUE;
out_b:=TRUE;
out_a:=FALSE;
timer_reidi(in:= NOT sens_reidi_b, pt:=T#5s, Q=>alarm);
IF timer_reidi.Q =TRUE THEN
start_Q:=FALSE;
END_IF
END_IF(**END Выбор направления движения тележки и запуск движения pologenie_b**)
IF pologenie_b AND adres = pologenie THEN (**Остановка тележки на выбраном силосе pologenie_b**)
out_b:=FALSE;
pologenie_b:=FALSE;
start_Q:=FALSE;
END_IF(**END Остановка тележки на выбраном силосе pologenie_b**)
IF out_b=TRUE AND alarm_stop_a=TRUE THEN (**Обработка сигналов Аварийных концевиков alarm_stop_a**)
out_b:=FALSE;
start_Q:=FALSE;
alarm:=TRUE;
END_IF
IF out_a=TRUE AND alarm_stop_b=TRUE THEN (**Обработка сигналов Аварийных концевиков alarm_stop_b**)
out_a:=FALSE;
start_Q:=FALSE;
alarm:=TRUE;
END_IF
IF alarm =TRUE THEN (**Обработка Аварии**)
start_Q:=FALSE;
out_a:=FALSE;
out_b:=FALSE;
END_IF
END_IF (**END Обработка кнопки СТАРТ**)
IF reset OR reset_buton =TRUE THEN (**Обработка сигналов сброса Аварии**)
alarm:=FALSE;
END_IF