Сообщение от
WeSs
Сразу не отходя от кассы. В Codesys есть функция перевода стандартного представления времени в Unix-time?
По мотивам библиотеки OSCAT
Захват-1.png
функция UCT_TO_DWORD выдает Unix время как DWORD число секунд, начиная с 0 часов 1 января 1970 года.
Код:
FUNCTION UCT_TO_DWORD : DWORD
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
UCT_TO_DWORD := SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600;
Собственно в Codesys DATE_AND_TIME (сокр. DT) и есть время Unix
По этому вторая функция toDT собирает секунды, минуты, часы, день, месяц и год в стандартное DATE_AND_TIME
Код:
FUNCTION toDT : DT
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
toDT := DWORD_TO_DT(SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600);