Просмотр полной версии : Преобразование Ticks в Date_and_time (Codesys 3.5)
День добрый. Нужна помощь с преобразованием Ticks-ов в Date_and_time. По ModbusTCP получаем 4 word-а значения текущего времени в Ticks, как это все преобразовать в DT, может кто сталкивался?
Евгений Кислов
12.04.2023, 09:55
День добрый. Нужна помощь с преобразованием Ticks-ов в Date_and_time. По ModbusTCP получаем 4 word-а значения текущего времени в Ticks, как это все преобразовать в DT, может кто сталкивался?
Добрый день.
Что именно вы называете термином "ticks"?
Приведите пример значений 4-х ваших WORD'ов и соответствующего им значения DT.
Тики это вроде с миллисекундами, если не ошибаюсь. или даже с коэффициентом 10000... могу код на C# глянуть как делал. Но в каком виде оно у вас не знаю.
public static long Ticks()
{
DateTime now = DateTime.Now;
long time = now.Ticks/10000;
return time;
}
тут текущее время переводится в количество секунд (если не ошибся), и коэффициент 10000.
Примеров в нете должно быть много, если речь о компьютерных тиках
Ticks - это 1*10^-7 сек. А время в Ticks - это время прошедшее от Рождества Христова в этих самых тиксах.
По Modbus получаем такие ворды:
1) 19050
2) 36219
3) 15165
4) 2267
После преобразования 4-х вордов в LWord получаем значение: 638168907755768426
Если прогнать его через онлайн конвертер Ticks -> Date_and_time, то время и дата отображаются корректно. Мне нужно понять как можно реализовать эту конвертацию в Codesys
Да, извиняюсь /10000 это преобразование в миллисекунды
https://learn.microsoft.com/ru-ru/dotnet/api/system.datetime.ticks?view=netcore-3.1
Datetime dateFromTicks = new DateTime(ticks);
Только в CodeSys время если не ошибаюсь в UnixUTC и там вроде онли секунды.
По идее вам надо свои полученные тики привести к секундам и собственно вы получите Utix Time и делайте с этим что хотите.
Да, я тоже так понял что вроде только секунды, но есть библиотека Codesys-овская "Time and Date", там можно вроде как преобразовывать Ticks to Seconds. Вот только функция преобразования ест только UDint, в который такое огромное число ну никак не лезет(
Андрей Косоротов
12.04.2023, 10:27
Да, я тоже так понял что вроде только секунды, но есть библиотека Codesys-овская "Time and Date", там можно вроде как преобразовывать Ticks to Seconds. Вот только функция преобразования ест только UDint, в который такое огромное число ну никак не лезет(
Отнимите от тиков которые получаете по модбасу время которое прошло от Рождества Христова до 1970-01-01 и получите UnixTime которое можно уже использовать в библиотеке Codesys. SysTime и SysTimeRtc по-моему.
Евгений Кислов
12.04.2023, 10:40
PROGRAM PLC_PRG
VAR
uliTicks: ULINT := 638168907755768426;
uliFromTicksToUnixTimeOffset: ULINT := 621355968000000000; // https://stackoverflow.com/a/72567540
dtDateAndTime: DT;
END_VAR
// т.к один тик - это 100 наносекунд (10^-7 секунд), то для конверсии в DT переводим в секунды
dtDateAndTime := TO_DT( (uliTicks - uliFromTicksToUnixTimeOffset) / 10000000 );
https://www.datetimetoticks-converter.com/
67218 67219
Премного благодарен. Заработало!)
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot