1. Если значение с аналогового входа меньше определенной уставки в течение некоторого времени (единицы секунд, точность не важна), то выполнить определенное действие, при этом нужно не блокировать основной поток, т.е. "получить значение со входа, подождать 10 секунд, опять получить значение", а в это время контроллер более ничем не занят не подходит.Кстати на ПЛК вообще не принято вешать поток. Об этом можно не сообщать дополнительно. Если вы напишете что-то в духе WHILE AI1 > 5, то сторожевой таймер просто перезагрузит устройство через пару секунд.Код:VAR timer: TON := (PT := T#10s); END_VAR timer(IN := AI1 < 5); IF timer.Q THEN (* Значение ниже уставки дольше 10 секунд *) (* Выполняем определённые действия *) END_IF2. Чем и как считать время наработки (логической единицы на одном из входов)?Кто-то вместо этого суммирует дельту между проходами по TIME(), но они упираются в 49 суток, т.к. больше в 32-битный TIME не помещается. При счёте секундами предел, очевидно, в 1000 раз больше (130 с чем-то лет).Код:VAR sectrig: R_TRIG; running: BOOL; (* Логический вход *) END_VAR VAR RETAIN uptime: DWORD := 0; (* Наработка в секундах *) END_VAR sectrig(CLK := TIME_TO_DWORD(TIME()) MOD 1000 > 500); (* Тик-так *) uptime := uptime + BOOL_TO_DWORD(sectrig.Q AND running); (* Раз в секунду выражение в скобках даёт TRUE. Соответственно за скобками — единица *)


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

Просто нужно было перезагрузить контролллер)
