PDA

Просмотр полной версии : Преобразование Ticks в Date_and_time (Codesys 3.5)



PPSTAsu
12.04.2023, 09:52
День добрый. Нужна помощь с преобразованием 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.

melky
12.04.2023, 09:56
Тики это вроде с миллисекундами, если не ошибаюсь. или даже с коэффициентом 10000... могу код на C# глянуть как делал. Но в каком виде оно у вас не знаю.


public static long Ticks()
{
DateTime now = DateTime.Now;
long time = now.Ticks/10000;
return time;
}

тут текущее время переводится в количество секунд (если не ошибся), и коэффициент 10000.

Примеров в нете должно быть много, если речь о компьютерных тиках

PPSTAsu
12.04.2023, 10:13
Ticks - это 1*10^-7 сек. А время в Ticks - это время прошедшее от Рождества Христова в этих самых тиксах.
По Modbus получаем такие ворды:
1) 19050
2) 36219
3) 15165
4) 2267

После преобразования 4-х вордов в LWord получаем значение: 638168907755768426
Если прогнать его через онлайн конвертер Ticks -> Date_and_time, то время и дата отображаются корректно. Мне нужно понять как можно реализовать эту конвертацию в Codesys

melky
12.04.2023, 10:13
Да, извиняюсь /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 и делайте с этим что хотите.

PPSTAsu
12.04.2023, 10:19
Да, я тоже так понял что вроде только секунды, но есть библиотека 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 по-моему.

PPSTAsu
12.04.2023, 10:30
Спасибо, будем пробовать

Евгений Кислов
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

PPSTAsu
12.04.2023, 10:47
Премного благодарен. Заработало!)