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