Вход

Просмотр полной версии : Извленчение миллисекунд из модуля OwenRTC в ПЛК200



Антон_Б
14.12.2025, 17:07
Здравсвуйте
Пытаюсь получить время из ПЛК 200 с точностью до миллисекунд, но в поле ms постоянно нули

DateToStr := OSU.DT_TO_STRING_FORMAT (TargetVars.stRtc.dtDateAndTime, '%t[dd.MM.yyyy]');
TimeToStr := OSU.DT_TO_STRING_FORMAT (TargetVars.stRtc.dtDateAndTime, '%t[HH:mm:ss.ms]');

Возможно ли или нужно использовать другие функции?

Евгений Кислов
14.12.2025, 17:38
Здравсвуйте
Пытаюсь получить время из ПЛК 200 с точностью до миллисекунд, но в поле ms постоянно нули

DateToStr := OSU.DT_TO_STRING_FORMAT (TargetVars.stRtc.dtDateAndTime, '%t[dd.MM.yyyy]');
TimeToStr := OSU.DT_TO_STRING_FORMAT (TargetVars.stRtc.dtDateAndTime, '%t[HH:mm:ss.ms]');

Возможно ли или нужно использовать другие функции?

Добрый день.
В библиотеке Util есть функции GetDateTime и GetLocalDateTime.
Возвращаемое ими значение нужно домножить на 1000000 и привести к типу LDT.

Антон_Б
14.12.2025, 18:06
Спасибо за наводку. Не понятно зачем умножать? У меня так заработало:

TTime : TIME;
ulTime : ULINT;

ulTime := GetDateTime();
TTime := ULINT_TO_TIME (ulTime);
TimeToStr := OSU.TIME_TO_STRING_FORMAT (TTime, '%t[HH:mm:ss.ms]');

Ещё пользовал SysTimeRtcGet( udiResult ); но она без миллисекунд

* Задача в отображении времени в таблице логирования с миллисекундами *

Евгений Кислов
14.12.2025, 18:18
Не понятно зачем умножать?

Судя по исходному вопросу - речь шла о системном времени.
Описанный мной выше вариант подразумевает этот случай.

***


TTime := ULINT_TO_TIME (ulTime);
// Происходит потеря данных - 64-битный ULINT превращается в 32-битный TIME
// Полученное значение не имеет смысла
// Но, действительно, разность двух таких значений между собой - это время, прошедшее между двумя вызовами данного фрагмента кода


Если достаточно относительного времени (системного тика) - то можно использовать для его получения функцию TIME() или канал System Timer из OwenRTC, чтобы обойтись без лишних движений.

Антон_Б
14.12.2025, 19:06
Хотел бы получать текущее системное время в ПЛК, вида 19:05:10.389 и это время нужно преобразовать в строку

kondor3000
14.12.2025, 19:16
Хотел бы получать текущее системное время в ПЛК, вида 19:05:10.389 и это время нужно преобразовать в строку

Вот так примерно 87230

Антон_Б
14.12.2025, 19:35
Что интересно , мой вариант работает, а при умножении получается белиберда,да уж у меня время не соответствует

Антон_Б
14.12.2025, 20:02
C0032: Cannot convert type 'LDATE_AND_TIME' to type 'DATE_AND_TIME'

ldtTime : LDT;
ulTime : ULINT;


ulTime := GetDateTime() * 1000000;
ldtTime := ULINT_TO_LDT (ulTime);
TimeToStr := OSU.DT_TO_STRING_FORMAT (ldtTime, '%t[HH:mm:ss.ms]');

Евгений Кислов
14.12.2025, 20:16
DT_TO_STRING_FORMAT не поддерживает LDT.
Можно сделать так:


TimeToStr := TO_STRING(ldtTime);

и дальше другими функциями обработать строку (убрать префикс, заменить разделители и т. д.).

Антон_Б
14.12.2025, 20:32
OwenStringUtil не работает в этом случае?

Евгений Кислов
14.12.2025, 20:35
OwenStringUtil не работает в этом случае?

Конкретно функции для преобразования значения типа LDT в форматированную строку в библиотеке OwenStringUtils нет.
Как я упомянул выше - в случае необходимости не слишком сложно реализовать ее самостоятельно.

kondor3000
14.12.2025, 20:49
В 2 строки всё делается 87232

Антон_Б
14.12.2025, 21:02
Это работает:
ulTime : ULINT;
strTimeDate : SysTimeRtc.RTS_SYSTIMEDATE;

SysTimeRtcHighResGet(ulTime);
udiResult := SysTimeRtcConvertHighResToLocal(ulTime , strTimeDate);

Антон_Б
14.12.2025, 21:03
Две строки не получается если нужно перевести в STRING

capzap
14.12.2025, 22:34
Через sysExecute можно получить любую форму сразу в виде строки и я так понимаю в одну строчку

Антон_Б
15.12.2025, 08:39
Спасибо за ответы