我需要将从 Beckhoffs 功能块“FB_LocalSystemTime”获得的 timestruct 转换为自纪元以来的毫秒数,以接收本地计算机时间(以毫秒为单位)。
不幸的是,我找不到转换这个 timestruct 的函数。任何帮助表示赞赏。
//Local Systemtime variables
fbTime : FB_LocalSystemTime := ( bEnable := TRUE, dwCycle := 1 );
我需要将从 Beckhoffs 功能块“FB_LocalSystemTime”获得的 timestruct 转换为自纪元以来的毫秒数,以接收本地计算机时间(以毫秒为单位)。
不幸的是,我找不到转换这个 timestruct 的函数。任何帮助表示赞赏。
//Local Systemtime variables
fbTime : FB_LocalSystemTime := ( bEnable := TRUE, dwCycle := 1 );
我认为您可以DT_TO_DINT
在转换TIMESTRUCT
为DT
. 自 1970 年 1 月 1 日以来,这应该会给您几秒钟的时间。
编辑:这段代码应该给你自 1970 年 1 月 1 日以来的毫秒数。
PROGRAM MAIN
VAR
fbTime: FB_LocalSystemTime;
tStruct: TIMESTRUCT;
msec: DINT;
dTime: DATE_AND_TIME;
eTime_sec: DINT;
eTime_msec: LINT;
END_VAR
fbTime(bEnable:=TRUE, dwCycle:=1, SystemTime=>tStruct);
msec := tStruct.wMilliseconds;
tStruct.wMilliseconds := 0;
dTime := SYSTEMTIME_TO_DT(tStruct);
eTime_sec := DT_TO_DINT(dTime);
eTime_msec := DINT_TO_LINT(eTime_sec) * 1000 + msec;
您将使用此功能获得毫秒数:
FUNCTION F_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));
F_SYSTEMTIME_TO_TIMESTRUCT.wYear := STRING_TO_WORD(LEFT(sDt, 4));
F_SYSTEMTIME_TO_TIMESTRUCT.wMonth := STRING_TO_WORD(MID(sDt, 2, 6));
F_SYSTEMTIME_TO_TIMESTRUCT.wDay := STRING_TO_WORD(MID(sDt, 2, 9));
F_SYSTEMTIME_TO_TIMESTRUCT.wHour := STRING_TO_WORD(MID(sDt, 2, 12));
F_SYSTEMTIME_TO_TIMESTRUCT.wMinute := STRING_TO_WORD(MID(sDt, 2, 15));
F_SYSTEMTIME_TO_TIMESTRUCT.wSecond := STRING_TO_WORD(MID(sDt, 2, 18));
F_SYSTEMTIME_TO_TIMESTRUCT.wMilliseconds := STRING_TO_WORD(RIGHT(sDt, 3));
您可以使用该SYSTEMTIME_TO_DT()
函数将 timestruct 转换为 4byteDATE_AND_TIME
数据类型的 dt。
这种数据类型的最小单位是一秒而不是毫秒。鉴于其中TIMESTRUCT
有一个毫秒值,您可以轻松使用它并将所有内容连接到人类可读的字符串。