Показано с 1 по 10 из 10

Тема: Преобразование Ticks в Date_and_time (Codesys 3.5)

  1. #1

    Question Преобразование Ticks в Date_and_time (Codesys 3.5)

    День добрый. Нужна помощь с преобразованием Ticks-ов в Date_and_time. По ModbusTCP получаем 4 word-а значения текущего времени в Ticks, как это все преобразовать в DT, может кто сталкивался?

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,160

    По умолчанию

    Цитата Сообщение от PPSTAsu Посмотреть сообщение
    День добрый. Нужна помощь с преобразованием Ticks-ов в Date_and_time. По ModbusTCP получаем 4 word-а значения текущего времени в Ticks, как это все преобразовать в DT, может кто сталкивался?
    Добрый день.
    Что именно вы называете термином "ticks"?
    Приведите пример значений 4-х ваших WORD'ов и соответствующего им значения DT.

  3. #3
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,660

    По умолчанию

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

    Код HTML:
    public static long Ticks()
    {
    DateTime now = DateTime.Now;
    long time = now.Ticks/10000;
    return time;
    }
    тут текущее время переводится в количество секунд (если не ошибся), и коэффициент 10000.

    Примеров в нете должно быть много, если речь о компьютерных тиках
    Последний раз редактировалось melky; 12.04.2023 в 10:02.

  4. #4

    По умолчанию

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

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

  5. #5
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,660

    По умолчанию

    Да, извиняюсь /10000 это преобразование в миллисекунды

    https://learn.microsoft.com/ru-ru/do...ew=netcore-3.1

    Datetime dateFromTicks = new DateTime(ticks);

    Только в CodeSys время если не ошибаюсь в UnixUTC и там вроде онли секунды.
    По идее вам надо свои полученные тики привести к секундам и собственно вы получите Utix Time и делайте с этим что хотите.
    Последний раз редактировалось melky; 12.04.2023 в 10:17.

  6. #6

    По умолчанию

    Да, я тоже так понял что вроде только секунды, но есть библиотека Codesys-овская "Time and Date", там можно вроде как преобразовывать Ticks to Seconds. Вот только функция преобразования ест только UDint, в который такое огромное число ну никак не лезет(

  7. #7
    Пользователь
    Регистрация
    30.07.2009
    Адрес
    Нижний Новгород
    Сообщений
    117

    По умолчанию

    Цитата Сообщение от PPSTAsu Посмотреть сообщение
    Да, я тоже так понял что вроде только секунды, но есть библиотека Codesys-овская "Time and Date", там можно вроде как преобразовывать Ticks to Seconds. Вот только функция преобразования ест только UDint, в который такое огромное число ну никак не лезет(
    Отнимите от тиков которые получаете по модбасу время которое прошло от Рождества Христова до 1970-01-01 и получите UnixTime которое можно уже использовать в библиотеке Codesys. SysTime и SysTimeRtc по-моему.

  8. #8

    По умолчанию

    Спасибо, будем пробовать

  9. #9
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,160

    По умолчанию

    Код:
    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/

    2023-04-12_10-39-39.png 2023-04-12_10-39-51.png

  10. #10

    По умолчанию

    Премного благодарен. Заработало!)

Похожие темы

  1. DATE_AND_TIME и прочие вопросы по времени
    от vnkorol в разделе СПК2хх
    Ответов: 10
    Последнее сообщение: 12.09.2016, 15:58
  2. Отображение формата DATE_AND_TIME на панели
    от DmitriiAnyushin в разделе СПК2хх
    Ответов: 4
    Последнее сообщение: 15.01.2016, 13:15
  3. Преобразование 4...20 мА в 0...10 В
    от Turboblock в разделе Подбор Оборудования
    Ответов: 6
    Последнее сообщение: 30.01.2015, 18:57
  4. ПЛК160: узнать дату и время в DATE_AND_TIME
    от Yegor в разделе ПЛК1хх
    Ответов: 13
    Последнее сообщение: 07.11.2012, 08:35
  5. Преобразование RS-232 в RS-485
    от dikens3 в разделе Подбор Оборудования
    Ответов: 4
    Последнее сообщение: 09.04.2012, 18:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •