Просмотр полной версии : Как преобразовать TIME в SYSDATETIME?
Добрый вечер!
%t[] нихрена в КДС 3.5.5 не работает (Это же КДС!). Обновляться не буду принципиально, т.к. СПК выше все равно ничего не держит и держать не будет.
Нужно сделать форматную строку HH:mm:ss.
В OSCAT есть работа с DT но только до часа, а мне нужны и дни тоже - временной интервал несколько суток.
В SYSDATETIME есть все нужные поля, но как его получить из TIME?
в переменной типа TIME не храниться дата
в оскат есть функция DT_TO_SDT если что
Например так
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));
Евгений Кислов
13.08.2016, 09:48
Как вариант, использовать стандартную функцию TIME_TO_DT и потом из DT вырезать разряды с помощью функции DTConcat библиотеки CAA DTutil.
Соответственно, миллисекунды вы потеряете, но не думаю, что это так критично. Из вырезанного значения дня надо будет отнять 1. Потом склеиваете разряды в строку нужного вам формата.
Например так
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);
Обе функции
25799
Осинский Алексей
13.08.2016, 10:59
Добрый вечер!
%t[] нихрена в КДС 3.5.5 не работает (Это же КДС!).
Данный функционал был добавлен позже CDS 3.5.5 поэтому претензия к CODESYS необоснованная.
Обновляться не буду принципиально
Ваше право.
т.к. СПК выше все равно ничего не держит и держать не будет
Откуда такие сведения?
Нужно сделать форматную строку HH:mm:ss.
мне нужны и дни тоже
Немного непоследовательно. В строку HH:mm:ss дни не вписываются. Более подробно можете описать задачу?
Возможно Вам подойдет переменная типа DATE_AND_TIME.
А если еще и дни нужны из переменной 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_STRIN G(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);
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot