День добрый. Нужна помощь с преобразованием Ticks-ов в Date_and_time. По ModbusTCP получаем 4 word-а значения текущего времени в Ticks, как это все преобразовать в DT, может кто сталкивался?
Вид для печати
День добрый. Нужна помощь с преобразованием Ticks-ов в Date_and_time. По ModbusTCP получаем 4 word-а значения текущего времени в Ticks, как это все преобразовать в DT, может кто сталкивался?
Тики это вроде с миллисекундами, если не ошибаюсь. или даже с коэффициентом 10000... могу код на C# глянуть как делал. Но в каком виде оно у вас не знаю.
тут текущее время переводится в количество секунд (если не ошибся), и коэффициент 10000.Код HTML:public static long Ticks()
{
DateTime now = DateTime.Now;
long time = now.Ticks/10000;
return time;
}
Примеров в нете должно быть много, если речь о компьютерных тиках
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/do...ew=netcore-3.1
Datetime dateFromTicks = new DateTime(ticks);
Только в CodeSys время если не ошибаюсь в UnixUTC и там вроде онли секунды.
По идее вам надо свои полученные тики привести к секундам и собственно вы получите Utix Time и делайте с этим что хотите.
Да, я тоже так понял что вроде только секунды, но есть библиотека Codesys-овская "Time and Date", там можно вроде как преобразовывать Ticks to Seconds. Вот только функция преобразования ест только UDint, в который такое огромное число ну никак не лезет(
Спасибо, будем пробовать
https://www.datetimetoticks-converter.com/Код: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 );
Вложение 67218 Вложение 67219
Премного благодарен. Заработало!)