PDA

Просмотр полной версии : Дата следующего дня.



Пьер
23.01.2017, 11:35
есть процесс, который должен закончится через двое (или N) суток. Как можно вывести дату окончания процесса, может какой блок есть для этой задачи. Пока представляю себе прописать весь календарь с числами по массивам, но это муторно, может есть легче решение? Спасибо!


ПЛК 1** версии. Сравниваю с текущим временем ПЛК.

petera
23.01.2017, 11:48
есть процесс, который должен закончится через двое (или N) суток. Как можно вывести дату окончания процесса, может какой блок есть для этой задачи. Пока представляю себе прописать весь календарь с числами по массивам, но это муторно, может есть легче решение? Спасибо!


ПЛК 1** версии. Сравниваю с текущим временем ПЛК.

Странный вопрос.

28855
Ровно через два дня после старта переменная Stop установится в "1"

Пьер
23.01.2017, 13:32
Странный вопрос.

28855
Ровно через два дня после старта переменная Stop установится в "1"

У меня другое. Мне вывести дату готовности в переменные.
Допустим 1 января запустили, через 3 дня готов, т.е. Результат в таком формате: "4 января процесс закончится." Это как пояснение.

А вся сложность, заключается, если запустим 31 января или 28 февраля на несколько дней, тут надо пересчитать относительно еще и высокосного года.

Еще раз. Запускаем процесс сегодня 23 января, на 5 суток. В результате выходит сообщение после запуска: 28 января процесс закончится". В этом смысле.

petera
23.01.2017, 14:28
У меня другое. Мне вывести дату готовности в переменные.
Допустим 1 января запустили, через 3 дня готов, т.е. Результат в таком формате: "4 января процесс закончится." Это как пояснение.

А вся сложность, заключается, если запустим 31 января или 28 февраля на несколько дней, тут надо пересчитать относительно еще и высокосного года.

Еще раз. Запускаем процесс сегодня 23 января, на 5 суток. В результате выходит сообщение после запуска: 28 января процесс закончится". В этом смысле.

В чем проблема?
В Кодесис есть переменные для работы с датой
28867
Прибавляете к текущей дате два дня (пять дней) и получайте правильный результат с учетом перехода на другой месяц и с учетом високосного года.
Причем все будет автоматически.

petera
23.01.2017, 14:49
Например, високосный год
28878

Тот же интервал для обычного года
28879

petera
23.01.2017, 15:27
Только в кодесис нет стандартной функции, которая определяет текущую дату.
Воспользуйтесь такой функцией, которая с помощью библиотеки SysLibTime вычисляет текущую дату

FUNCTION curDATE : DATE
VAR_INPUT
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
day: INT;
month: INT;
count: INT;
END_VAR

CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
(*------------------------------------------------------------------------*)
IF year=0 THEN year:=1970; day:=1; month:=1; END_IF (* если функция вызывается в эмуляции*)
(*Вычислить дату с учетом високосных лет*)
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;
curDATE := DWORD_TO_DATE((INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400);
(*------------------------------------------------------------------------*)
С учетом этой функции получится
28886

28885

petera
23.01.2017, 16:40
Запускаем процесс сегодня 23 января, на 5 суток. В результате выходит сообщение после запуска: 28 января процесс закончится". В этом смысле.
Чтобы выходило сообщение "28 января процесс закончится", а не "D#2017-02-02"
Добавил несколько функций из OSCAT
DAY_OF_MONTH - немного модифицирована
sMONTH_OF_DATE - выводит название месяца, а не его номер
28890


https://www.youtube.com/watch?v=-T-Zicg3Paw

GTS
13.08.2018, 15:51
Добрый день! Задача стоит похожая: для журнала учета расхода необходимо писать время -1 час (т.е. расход за прошедший час) и день -1 (т.е. расход за прошедшие сутки). По вашему примеру получил дата -1, но как таким же методом вычитать -1 час? Полученный результат, в вашем случае OUT, необходимо разложить на отдельные переменные год, день, месяц, час ну и т.д. Пытался это сделать по методу описанному в материале "Программируем временные сложности" Петрова И.В. но запутался в функциональных блоках и выходят постоянные ошибки. Есть ли методы по проще? Буду благодарен за помощь!

petera
13.08.2018, 16:59
Получить текущее время в формате TOD, аналогично получению текущей дате DATE, и отнимать 1 час

GTS
13.08.2018, 22:46
Я на ST писать не силен. По аналогии сделал время в формате TOD, не знаю насколько правильно. Надеюсь там высокосный год вычислять не надо было. 38352Теперь мне нужно из переменных out и out1 вытащить год, месяц, день и часы, минуты соответственно в отдельные переменные. Как это сделать?