В переменной uptime_30m будет наработка за последние 30 минут.
Код:
VAR
on: BOOL;
first_run: BOOL := TRUE;
uptime_30m_buf: ARRAY [0..29] OF TIME;
uptime_30m: TIME;
prev_scan: TIME;
minute, prev_minute: UDINT;
END_VAR
IF first_run THEN
prev_scan := TIME();
first_run := FALSE;
END_IF
minute := (TIME_TO_UDINT(TIME()) / 60000) MOD 30;
IF prev_minute <> minute THEN
uptime_30m_buf[minute] := 0;
END_IF
prev_minute := minute;
uptime_30m_buf[minute] := uptime_30m_buf[minute] + SEL(on, T#0s, TIME() - prev_scan);
uptime_30m := T#0s;
FOR minute := 0 TO 29 DO
uptime_30m := uptime_30m + uptime_30m_buf[minute];
END_FOR
prev_scan := TIME();
За 4 часа аналогично.
Но значение будет правильным только в момент перехода на очередную минуту. Другими словами, uptime_30m хоть и вычисляется постоянно, но правильное значение принимает один раз в минуту. Если не устраивает, то буфер надо брать больше и ячейки переключать чаще.
Пользуясь случаем, напоминаю, что с часами ПЛК надо аккуратнее: http://www.owen.ru/forum/showthread.php?t=23319