алгоритма ничего пока и нет, даже представления о реализации в КДС
Да какой тут алгоритм... Прога будет на две с половиной строчки. Что-то вроде такого:
Код:
VAR
logFileHandle: DWORD := 0;
logFileSize: DINT;
buffer: DWORD;
END_VAR
IF FALSE THEN (* Однократно при включении или выключении *)
logFileSize := SysFileGetSize(logFileName);
logFileHandle := SysFileOpen(logFileName, 'w');
IF logFileHandle <> 0 THEN
(* Время включения пишем только на чётные позиции *)
IF NOT ShuttingDown THEN
SysFileSetPos(logFileHandle, logFileSize - logFileSize MOD 8);
ELSE
SysFileSetPos(logFileHandle, logFileSize);
END_IF
buffer := GetCurrentUnixTime();
SysFileWrite(logFileHandle, ADR(buffer), SIZEOF(buffer));
SysFileClose(logFileHandle);
logFileHandle := 0;
END_IF
END_IF
Функция GetCurrentUnixTime:
Код:
FUNCTION GetCurrentUnixTime : DWORD
VAR
timedate: SystemTimeDate;
systime: SysTime64;
GetTime: CurTimeEx;
END_VAR
SysMemSet(ADR(systime), 0, SIZEOF(systime));
SysMemSet(ADR(timedate), 0, SIZEOF(timedate));
GetTime(SystemTime := systime, TimeDate := timedate);
GetCurrentUnixTime :=
DATE_TO_DWORD(PackDate(timedate.Year, timedate.Month, timedate.Day)) +
TIME_TO_DWORD(PackTime(timedate.Hour, timedate.Minute, timedate.Second, timedate.Milliseconds)) / 1000;
Используемые библиотеки: SysLibFile, SysLibTime, SysLibMem, TimeExp. Местами псевдокод.
Проверить это на реальном контроллере пока не смогу — сижу дома на больничном.