Исправил при помощи крепкого кофе с шоколадкой и одного умного пожилого киповца вместе обсудили логику и решили проблему решилось довольно легко просто сделал противо включение как на пускателях при реверсе если едим в сторону А то условии стороны Б чтоб не мешалось и наоборот ну и попутно еще несколько ошибочек и недоработок нашли и устранили.
Код: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




Ответить с цитированием