PDA

Просмотр полной версии : Как преобразовать TIME в SYSDATETIME?



Ivan77
12.08.2016, 23:57
Добрый вечер!

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

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

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

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

capzap
13.08.2016, 06:48
в переменной типа TIME не храниться дата
в оскат есть функция DT_TO_SDT если что

petera
13.08.2016, 09:46
Например так

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. Потом склеиваете разряды в строку нужного вам формата.

petera
13.08.2016, 10:54
Например так

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.

petera
13.08.2016, 11:37
А если еще и дни нужны из переменной 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);