Использую следующий код:
PROGRAM SHOW_UPTIME
VAR_INPUT
z: DINT;
END_VAR
VAR
FormatUint: STRING(10):='%02u';
FormatUintS: STRING(10):='%01u';
t: DINT;
dd: UDINT;
hh: UDINT;
mm: UDINT;
ss: UDINT;
uptime_sec: UDINT;
END_VAR
uptime_sec:=uptime_Sys_time.ulHigh*4294+uptime_Sys _time.ulLow/1000000;
dd:=uptime_sec/86400;
hh:=(uptime_sec-dd*86400)/3600;
mm:=(uptime_sec-dd*86400-hh*3600)/60;
ss:=uptime_sec-hh*3600-mm*60;
IF dd<9 THEN
t:=ShowDint(z, 9, 0, FormatUintS,dd);
t:=ShowString(z, 10, 0, 'д');
t:=ShowDint(z, 11, 0, FormatUint,hh);
t:=ShowString(z, 13, 0, ':');
t:=ShowDint(z, 14, 0, FormatUint,mm);
ELSE
t:=ShowString(z, 9, 0, '>9 дней-ОК');
END_IF
Структуры со временем - глобальные переменные:
VAR_GLOBAL
uptime_Sys_Time: SysTime64;
TimeAndDate: SystemTimeDate;
END_VAR
Переменные заполняются следующим образом:
PROGRAM GET_TIME
VAR_INPUT
END_VAR
VAR
GetTime: CurTimeEx;
END_VAR
TimeAndDate.Day :=0;
TimeAndDate.DayOfWeek :=0;
TimeAndDate.dwHighMsec :=0;
TimeAndDate.dwLowMSecs :=0;
TimeAndDate.Milliseconds :=0;
TimeAndDate.Minute :=0;
TimeAndDate.Second :=0;
TimeAndDate.Hour :=0;
TimeAndDate.Year :=0;
TimeAndDate.Month :=0;
uptime_Sys_Time.ulHigh :=0;
uptime_Sys_Time.ulLow :=0;
GetTime (SystemTime:=uptime_Sys_Time, TimeDate:= TimeAndDate);
Что в итоге имеем: сначала время отсчитывается хорошо, потом, в какой-то момент времени, начинает идти в обратную сторону, затем опять хорошо и т.д.
Очевидно, где-то вместо беззнакового INTа используется знаковый. Не могу понять где, и всё тут...
Или может есть готовый кусочек кода?
Под UpTime'ом подразумеваю время с момента загрузки контроллера и автостарта программы.