0

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

不幸的是,我找不到转换这个 timestruct 的函数。任何帮助表示赞赏。

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

3 回答 3

2

我认为您可以DT_TO_DINT在转换TIMESTRUCTDT. 自 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;
于 2020-09-14T20:19:40.203 回答
1

您将使用此功能获得毫秒数:

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));
于 2020-09-24T15:35:00.053 回答
0

您可以使用该SYSTEMTIME_TO_DT()函数将 timestruct 转换为 4byteDATE_AND_TIME数据类型的 dt。

这种数据类型的最小单位是一秒而不是毫秒。鉴于其中TIMESTRUCT有一个毫秒值,您可以轻松使用它并将所有内容连接到人类可读的字符串。

于 2020-09-14T17:51:35.323 回答