Код:
FUNCTION NTP_FORMAT_TO_DT : DT
VAR_INPUT
(* Пакет данных, полученный от NTP-сервера*)
abyNtpResponse: ARRAY [0..47] OF BYTE;
(*Часовой пояс*)
iUtcOffset: INT(-12..14) := 3;
END_VAR
VAR
(*Промежуточные переменные*)
dwNtpServerTime: DWORD;
liNtpServerTime: LINT;
END_VAR
VAR CONSTANT
(*Число секунд между точками отсчета NTP Format Time и Unix Time*)
c_dwNtpToUnixTimeOffset: DWORD := 2208988800;
(*Число минут в часе*)
c_usiMinutesPerHour: USINT := 60;
(* Число секунд в минуте*)
c_usiSecondsPerMinute: USINT := 60;
END_VAR
dwNtpServerTime := abyNtpResponse[43] + SHL(abyNtpResponse[42], 8) + SHL(abyNtpResponse[41], 16) + SHL(abyNtpResponse[40], 24);
liNtpServerTime := DWORD_TO_LINT (dwNtpServerTime);
NTP_FORMAT_TO_DT := LINT_TO_DT (liNtpServerTime - c_dwNtpToUnixTimeOffset + iUtcOffset * c_usiMinutesPerHour * c_usiSecondsPerMinute);