PDA

Просмотр полной версии : Записи данных в файл из ПЛК 110-30



WeSs
07.11.2018, 17:44
Добрый день! Подскажите пожалуйста, возможно ли изменить формат записи данных из ПЛК в файл.
Есть программа которая записывает данные в формате [1 2 3 4], для решения задачи нужно чтобы записывались в формате [1234]

Заранее спасибо!

capzap
07.11.2018, 19:06
справка КДС => операции со строками
как то так

WeSs
08.11.2018, 10:12
справка КДС => операции со строками
как то так

С этим разобрался, спасибо за ответ

WeSs
08.11.2018, 10:12
Сразу не отходя от кассы. В Codesys есть функция перевода стандартного представления времени в Unix-time?

petera
08.11.2018, 10:37
Сразу не отходя от кассы. В Codesys есть функция перевода стандартного представления времени в Unix-time?
По мотивам библиотеки OSCAT
39696

функция UCT_TO_DWORD выдает Unix время как DWORD число секунд, начиная с 0 часов 1 января 1970 года.

FUNCTION UCT_TO_DWORD : DWORD
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
UCT_TO_DWORD := SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600;


Собственно в Codesys DATE_AND_TIME (сокр. DT) и есть время Unix
По этому вторая функция toDT собирает секунды, минуты, часы, день, месяц и год в стандартное DATE_AND_TIME


FUNCTION toDT : DT
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
toDT := DWORD_TO_DT(SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600);

WeSs
08.11.2018, 10:51
По мотивам библиотеки OSCAT
39696

функция UCT_TO_DWORD выдает Unix время как DWORD число секундах, начиная с 0 часов 1 января 1970 года.

FUNCTION UCT_TO_DWORD : DWORD
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
UCT_TO_DWORD := SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600;


Собственно в Codesys DATE_AND_TIME (сокр. DT) и есть время Unix
По этому вторая функция toDT собирает секунды, минуты, часы, день, месяц и год в стандартное DATE_AND_TIME


FUNCTION toDT : DT
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
toDT := DWORD_TO_DT(SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600);

Спасибо большое! Будем преобразовывать на ST :)

ЗЫ Подключил в проект. Выводит Реальную дату, а нужно именно время в UNIXTIMESTAMP. В чем моя проблема и как ее решить?

ЗЫЫ Неправильный формат данных. Для вывода unixtime нужно было перевести в DWORD