1. Если значение с аналогового входа меньше определенной уставки в течение некоторого времени (единицы секунд, точность не важна), то выполнить определенное действие, при этом нужно не блокировать основной поток, т.е. "получить значение со входа, подождать 10 секунд, опять получить значение", а в это время контроллер более ничем не занят не подходит.
Код:
VAR
timer: TON := (PT := T#10s);
END_VAR
timer(IN := AI1 < 5);
IF timer.Q THEN
(* Значение ниже уставки дольше 10 секунд *)
(* Выполняем определённые действия *)
END_IF
Кстати на ПЛК вообще не принято вешать поток. Об этом можно не сообщать дополнительно. Если вы напишете что-то в духе WHILE AI1 > 5, то сторожевой таймер просто перезагрузит устройство через пару секунд.
2. Чем и как считать время наработки (логической единицы на одном из входов)?
Код:
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. Соответственно за скобками — единица *)
Кто-то вместо этого суммирует дельту между проходами по TIME(), но они упираются в 49 суток, т.к. больше в 32-битный TIME не помещается. При счёте секундами предел, очевидно, в 1000 раз больше (130 с чем-то лет).