如何获取TwinCAT3中的unix时间戳?

时间:2017-01-20 23:00:21

标签: unix-timestamp twincat twincat-ads

我们正在开发Beckhoff TwinCAT3中的数据记录应用程序。为了得到我们当前正在使用LTIME()的时间,然后使用:

将C#中的转换为ms
history.pushState

必须有更好的方法。此外,我们发现此时间与计算机时间(任务栏中的时间)之间存在差异。

自1970年以来(格林尼治标准时间)从计算机时钟获取ms的最佳方法是什么?

我看到NT_GetTime。看起来我们需要在struct

上进行数学运算

感谢您的任何指示。

1 个答案:

答案 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;