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

Тема: Как преобразовать TIME в SYSDATETIME?

  1. #1

    По умолчанию Как преобразовать TIME в SYSDATETIME?

    Добрый вечер!

    %t[] нихрена в КДС 3.5.5 не работает (Это же КДС!). Обновляться не буду принципиально, т.к. СПК выше все равно ничего не держит и держать не будет.

    Нужно сделать форматную строку HH:mm:ss.

    В OSCAT есть работа с DT но только до часа, а мне нужны и дни тоже - временной интервал несколько суток.

    В SYSDATETIME есть все нужные поля, но как его получить из TIME?

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

    По умолчанию

    в переменной типа TIME не храниться дата
    в оскат есть функция DT_TO_SDT если что
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,815

    По умолчанию

    Например так
    Код:
    FUNCTION myTIME_TO_STR : STRING
    VAR_INPUT
    	ttt: TIME;
    END_VAR
    VAR
    	a: DWORD;
    	ss: DWORD;
    	mm: DWORD;
    	dd: DWORD;
    END_VAR
    a:=TIME_TO_DWORD(ttt)/1000;
    dd:=a/86400;
    myTIME_TO_STR:=CONCAT(DWORD_TO_STRING(dd), ':');
    mm:=(a MOD 86400)/60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(mm)); myTIME_TO_STR:=CONCAT(myTIME_TO_STR, ':');
    ss:=a MOD 60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(ss));
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

    По умолчанию

    Как вариант, использовать стандартную функцию TIME_TO_DT и потом из DT вырезать разряды с помощью функции DTConcat библиотеки CAA DTutil.

    Соответственно, миллисекунды вы потеряете, но не думаю, что это так критично. Из вырезанного значения дня надо будет отнять 1. Потом склеиваете разряды в строку нужного вам формата.

  5. #5
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,815

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Например так
    Код:
    FUNCTION myTIME_TO_STR : STRING
    VAR_INPUT
    	ttt: TIME;
    END_VAR
    VAR
    	a: DWORD;
    	ss: DWORD;
    	mm: DWORD;
    	dd: DWORD;
    END_VAR
    a:=TIME_TO_DWORD(ttt)/1000;
    dd:=a/86400;
    myTIME_TO_STR:=CONCAT(DWORD_TO_STRING(dd), ':');
    mm:=(a MOD 86400)/60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(mm)); myTIME_TO_STR:=CONCAT(myTIME_TO_STR, ':');
    ss:=a MOD 60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(ss));
    Я вместо часов дни использовал,
    должно быть так
    Код:
    FUNCTION myTIME_TO_STR : STRING
    VAR_INPUT
    	ttt: TIME;
    END_VAR
    VAR
    	a: DWORD;
    	ss: DWORD;
    	mm: DWORD;
    	hh: DWORD;
    END_VAR
    a:=TIME_TO_DWORD(ttt)/1000;
    hh:=a/3600;
    myTIME_TO_STR:=CONCAT(DWORD_TO_STRING(hh), ':');
    mm:=(a MOD 3600)/60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(mm)); myTIME_TO_STR:=CONCAT(myTIME_TO_STR, ':');
    ss:=a MOD 60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(ss));
    В этом варианте будут отсутствовать ведущие нули в результате преобразования, т.е. строка будет 1: 2: 3
    Если привлечь DWORD_TO_STRF из OSCAT, то результат можно сделать с ведущими нулями
    Код:
    FUNCTION myTIME_TO_STRF : STRING
    VAR_INPUT
    	ttt: TIME;
    END_VAR
    VAR
    	a: DWORD;
    	ss: STRING;
    	mm: STRING;
    	hh: STRING;
    END_VAR
    a:=TIME_TO_DWORD(ttt)/1000;
    hh:=DWORD_TO_STRF((a/3600),2);
    myTIME_TO_STRF:=CONCAT(hh, ':');
    mm:=DWORD_TO_STRF(((a MOD 3600)/60),2);
    myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, mm); myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, ':');
    ss:=DWORD_TO_STRF((a MOD 60),2);
    myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, ss);
    Обе функции
    Захват-1.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #6

    По умолчанию

    Добрый вечер!
    Цитата Сообщение от Ivan77 Посмотреть сообщение
    %t[] нихрена в КДС 3.5.5 не работает (Это же КДС!).
    Данный функционал был добавлен позже CDS 3.5.5 поэтому претензия к CODESYS необоснованная.

    Цитата Сообщение от Ivan77 Посмотреть сообщение
    Обновляться не буду принципиально
    Ваше право.

    Цитата Сообщение от Ivan77 Посмотреть сообщение
    т.к. СПК выше все равно ничего не держит и держать не будет
    Откуда такие сведения?

    Цитата Сообщение от Ivan77 Посмотреть сообщение
    Нужно сделать форматную строку HH:mm:ss.
    мне нужны и дни тоже
    Немного непоследовательно. В строку HH:mm:ss дни не вписываются. Более подробно можете описать задачу?
    Возможно Вам подойдет переменная типа DATE_AND_TIME.

  7. #7
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,815

    По умолчанию

    А если еще и дни нужны из переменной TIME,
    1. Без OSCAT
    Код:
    FUNCTION myTIME_TO_STR : STRING
    VAR_INPUT
    	ttt: TIME;
    END_VAR
    VAR
    	a: DWORD;
    	ss: DWORD;
    	mm: DWORD;
    	hh: DWORD;
    	dd: DWORD;
    END_VAR
    a:=TIME_TO_DWORD(ttt)/1000;
    dd:=a/86400;
    myTIME_TO_STR:=CONCAT(DWORD_TO_STRING(dd), ':');
    hh:=(a MOD 86400)/3600;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR,DWORD_TO_STRING(hh)); myTIME_TO_STR:=CONCAT(myTIME_TO_STR, ':');
    mm:=(a MOD 3600)/60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(mm)); myTIME_TO_STR:=CONCAT(myTIME_TO_STR, ':');
    ss:=a MOD 60;
    myTIME_TO_STR:=CONCAT(myTIME_TO_STR, DWORD_TO_STRING(ss));
    2. С ведущими нулями (нужна OSCAT)
    Код:
    VAR_INPUT
    	ttt: TIME;
    END_VAR
    VAR
    	a: DWORD;
    	ss: STRING;
    	mm: STRING;
    	hh: STRING;
    	dd: STRING;
    END_VAR
    a:=TIME_TO_DWORD(ttt)/1000;
    dd:=DWORD_TO_STRF((a/86400),2);
    myTIME_TO_STRF:=CONCAT(dd, ':');
    hh:=DWORD_TO_STRF(((a MOD 86400)/3600),2);
    myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, hh); myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, ':');
    mm:=DWORD_TO_STRF(((a MOD 3600)/60),2);
    myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, mm); myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, ':');
    ss:=DWORD_TO_STRF((a MOD 60),2);
    myTIME_TO_STRF:=CONCAT(myTIME_TO_STRF, ss);
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

Похожие темы

  1. Системное время преобразовать в DATE
    от KRUPSKIY в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 07.06.2016, 08:46
  2. Преобразовать ответ
    от IIeroniux в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 05.10.2015, 17:45
  3. Преобразовать HEX в Float
    от serezha в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 15.12.2014, 09:56
  4. Ответов: 6
    Последнее сообщение: 20.10.2013, 13:58
  5. как преобразовать время?
    от hilih в разделе Помощь Разработчикам
    Ответов: 4
    Последнее сообщение: 15.06.2009, 23:07

Ваши права

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