问题描述
我需要将从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));
*已测试。有效