TwinCAT Systemtime-Timestruct自纪元以来的毫秒数

问题描述

我需要将从Beckhoffs功能块“ FB_LocalSystemTime”获得的时间结构转换为自纪元以来的毫秒数,以便以毫秒为单位接收本地计算机时间。

不幸的是,我找不到转换此时间结构的函数。任何帮助表示赞赏。

//Local Systemtime variables
fbTime : FB_LocalSystemTime := ( bEnable := TRUE,dwCycle := 1 );

解决方法

您可以使用SYSTEMTIME_TO_DT()函数将时间结构转换为4字节DATE_AND_TIME数据类型的dt。

该数据类型的最小单位是一秒,而不是毫秒。 假设TIMESTRUCT中包含毫秒值,则可以轻松使用它并将所有内容连接到人类可读的字符串。

,

我认为您可以在将TIMESTRUCT转换为DT后使用DT_TO_DINT。自1970年1月1日以来,这应该给您几秒钟。

,

尝试此功能:

FUNCTION SYSTEMTIME_TO_TIMESTRUCT : TIMESTRUCT
VAR
    fbGetSystemTime : GETSYSTEMTIME;    (*timestamp*)
    fileTime        : T_FILETIME;
    sDT: STRING(30);
END_VAR
fbGetSystemTime(timeLoDW => fileTime.dwLowDateTime,timeHiDW => fileTime.dwHighDateTime);
sDT := SYSTEMTIME_TO_STRING(FILETIME_TO_SYSTEMTIME(fileTime));

SYSTEMTIME_TO_TIMESTRUCT.wYear := STRING_TO_WORD(LEFT(sDt,4));
SYSTEMTIME_TO_TIMESTRUCT.wMonth := STRING_TO_WORD(MID(sDt,2,6));
SYSTEMTIME_TO_TIMESTRUCT.wDay := STRING_TO_WORD(MID(sDt,9));
SYSTEMTIME_TO_TIMESTRUCT.wHour := STRING_TO_WORD(MID(sDt,12));
SYSTEMTIME_TO_TIMESTRUCT.wMinute := STRING_TO_WORD(MID(sDt,15));
SYSTEMTIME_TO_TIMESTRUCT.wSecond := STRING_TO_WORD(MID(sDt,18));
SYSTEMTIME_TO_TIMESTRUCT.wMilliseconds := STRING_TO_WORD(RIGHT(sDt,3));

*已测试。有效