Да какой тут алгоритм... Прога будет на две с половиной строчки. Что-то вроде такого:алгоритма ничего пока и нет, даже представления о реализации в КДСФункция GetCurrentUnixTime:Код: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Используемые библиотеки: SysLibFile, SysLibTime, SysLibMem, TimeExp. Местами псевдокод.Код: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;
Проверить это на реальном контроллере пока не смогу — сижу дома на больничном.




Ответить с цитированием