我们正在开发Beckhoff TwinCAT3中的数据记录应用程序。为了得到我们当前正在使用LTIME()的时间,然后使用:
将C#中的转换为mshistory.pushState
必须有更好的方法。此外,我们发现此时间与计算机时间(任务栏中的时间)之间存在差异。
自1970年以来(格林尼治标准时间)从计算机时钟获取ms的最佳方法是什么?
我看到NT_GetTime。看起来我们需要在struct
上进行数学运算感谢您的任何指示。
答案 0 :(得分:0)
关键是使用FB_TzSpecificLocalTimeToFileTime使用当前时区信息(T_FILETIME)将当前ST_TimeZoneInformation转换为UTC。这将是一个UTC窗口文件时间(滴答),需要转换为UTC unix时间。
以下是此过程的功能块实现:
<强>声明强>
FUNCTION_BLOCK UnixTimestamp
VAR_OUTPUT
seconds: ULINT;
milliseconds: ULINT;
END_VAR
VAR
localSystemTime : FB_LocalSystemTime := ( bEnable := TRUE, dwCycle := 1 );
getTimeZoneInformation : FB_GetTimeZoneInformation;
timeZoneInformation : ST_TimeZoneInformation;
specificLocalTimeToFileTime : FB_TzSpecificLocalTimeToFileTime;
fileTime: T_FILETIME;
onZerothSecondLastCycle : BOOL;
END_VAR
<强>实施强>
// Get local system time
localSystemTime();
// On the zeroth second of each minutesync timezone information
IF (timeZoneInformation.standardName = '' OR (localSystemTime.systemTime.wSecond = 0 AND NOT onZerothSecondLastCycle)) THEN
getTimeZoneInformation(sNetID := '', bExecute := TRUE, tzInfo => timeZoneInformation);
END_IF;
// Convert local system time to unix timestamps
specificLocalTimeToFileTime(in := Tc2_Utilities.SYSTEMTIME_TO_FILETIME(localSystemTime.systemTime), tzInfo := timeZoneInformation, out => fileTime);
seconds := (SHL(DWORD_TO_ULINT(fileTime.dwHighDateTime), 32) + DWORD_TO_ULINT(fileTime.dwLowDateTime)) / 10000000 - 11644473600;
milliseconds := (SHL(DWORD_TO_ULINT(fileTime.dwHighDateTime), 32) + DWORD_TO_ULINT(fileTime.dwLowDateTime)) / 10000 - 11644473600000;
onZerothSecondLastCycle := localSystemTime.systemTime.wSecond = 0;
<强>用法强>
VAR
unixTime: UnixTimestamp;
timestampSeconds: ULINT;
timestampMilliseconds: ULINT;
END_VAR
-----
unixTime();
timestampMilliseconds := unixTime.milliseconds;
timestampSeconds := unixTime.seconds;