Просмотр полной версии : Извленчение миллисекунд из модуля OwenRTC в ПЛК200
Здравсвуйте
Пытаюсь получить время из ПЛК 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.
Спасибо за наводку. Не понятно зачем умножать? У меня так заработало:
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, чтобы обойтись без лишних движений.
Хотел бы получать текущее системное время в ПЛК, вида 19:05:10.389 и это время нужно преобразовать в строку
kondor3000
14.12.2025, 19:16
Хотел бы получать текущее системное время в ПЛК, вида 19:05:10.389 и это время нужно преобразовать в строку
Вот так примерно 87230
Что интересно , мой вариант работает, а при умножении получается белиберда,да уж у меня время не соответствует
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);
и дальше другими функциями обработать строку (убрать префикс, заменить разделители и т. д.).
OwenStringUtil не работает в этом случае?
Евгений Кислов
14.12.2025, 20:35
OwenStringUtil не работает в этом случае?
Конкретно функции для преобразования значения типа LDT в форматированную строку в библиотеке OwenStringUtils нет.
Как я упомянул выше - в случае необходимости не слишком сложно реализовать ее самостоятельно.
kondor3000
14.12.2025, 20:49
В 2 строки всё делается 87232
Это работает:
ulTime : ULINT;
strTimeDate : SysTimeRtc.RTS_SYSTIMEDATE;
SysTimeRtcHighResGet(ulTime);
udiResult := SysTimeRtcConvertHighResToLocal(ulTime , strTimeDate);
Две строки не получается если нужно перевести в STRING
Через sysExecute можно получить любую форму сразу в виде строки и я так понимаю в одну строчку
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot