Вы можете построить внутренний счетчик с точностью вашего цикла задач.Допустим, у вас есть цикл 10 мс, вы можете записывать свои данные с отметкой времени 10 мс.Если вы хотите быть более точным, вы можете либо сократить время выполнения основной задачи plc, либо создать отдельную задачу с более быстрым циклом.
Другая возможность состоит в использовании быстрых операций ввода-вывода с избыточной дискретизацией, таких как el1262.
Вот пример необработанного внутреннего счетчика:
Часть декларации:
PROGRAM MAIN
VAR
bInit : BOOL;
nTime : UINT;
tBufferTime : TIME;
dtBufferDT : DT;
nCalcBuffer : UDINT;
sMs : STRING;
sLogTime : STRING;
sLogTimeWithMs : STRING;
stSystemTime : TIMESTRUCT;
fbLocalTime : FB_LocalSystemTime;
END_VAR
Часть реализации:
fbLocalTime(bEnable := TRUE);
IF NOT bInit
THEN
dtBufferDT := SYSTEMTIME_TO_DT(fbLocalTime.systemTime);
IF fbLocalTime.bValid
THEN
bInit := TRUE;
END_IF
ELSE
nTime := nTime + 1;
tBufferTime := UINT_TO_TIME(nTime*10);
IF tBufferTime = T#1S
THEN
//Add a second to your system time
ntime := 0;
nCalcBuffer := DT_TO_UDINT(dtBufferDT)+1;
dtBufferDT := UDINT_TO_DT(nCalcBuffer);
sLogTime := DT_TO_STRING(dtBufferDT);
sLogTimeWithMs := sLogTime;
ELSE
//Add ms string time-stamp
sMs := TIME_TO_STRING(tBufferTime);
sLogTimeWithMs := CONCAT(sLogTime,sMs);
END_IF
END_IF
sLogTimeWithMs покажет что-то вроде этого:
'DT # 2019-09-21-14: 30: 28T # 530ms'
, что дает вам правильное время с точностью 10 мс без необходимости дальнейшегосинхронизация.
Затем вы можете полировать строку, чтобы очистить ее от нежелательных символов, таких как DT #, T # или ms.