Сообщение от
tanatholog
Оживлю свою старую тему.
Решил переписать свою программу управления злополучным аквариумом. Основной критерий: суточное переключение света, газа, воздуха. Режимы, в общем.
Привязано все к реальному времени. И в этом проблема.
Захотел я сделать так, чтобы в уставках вводилась основная информация: время запуска основного света и продолжительность, а остальной суточный режим пересчитывался сам. Добился, чтобы все переменные были в диапазоне 0-23, чтобы привязать к часам. И тут незадача:
IF clock>=time_start AND clock< time_end THEN
day_light:=TRUE;
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
Подскажите, что можно сделать?
Код:
PROGRAM PLC_PRG
VAR
on_Hour: WORD; (*время включения: часы*)
on_Minute: WORD; (*время включения: минуты*)
on_Second: WORD; (*время включения: секунды*)
of_Hour: WORD; (*время выключения: часы*)
of_Minute: WORD; (*время выключения: минуты*)
of_Second: WORD; (*время выключения: секунды*)
uptime: SysTime64;
datetime: SystemTimeDate;
clock: CurTimeEx;
time_on:DWORD; (*время включения в секундах*)
time_of:DWORD; (*время отключения в секундах*)
current_time:DWORD; (*текущее время в секундах*)
enable: BOOL; (*разрешение на включение*)
day_light: BOOL; (*выход*)
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate; (*нужна для обнуления параметров*)
END_VAR
(*получить текущее время в секундыах*)
datetime := nulldt;(*обнуляем переменные времени*)
clock(SystemTime := uptime, (*текущее время в микросекундах*)
TimeDate := datetime); (*текущее время и дата в развернутом формате*)
current_time:=(datetime.Hour * 60 + datetime.Minute) * 60 + datetime.Second; (*текущее время*)
(*----------------------------------------------------------------*)
(*для уставок собираем часы, минуты и секунды в одну кучу - в секунды*)
time_on:=(on_Hour * 60 + on_Minute) * 60 + on_Second; (*время включения*)
time_of:=(of_Hour * 60 + of_Minute) * 60 + of_Second; (*время отключения*)
(*----------------------------------------------------------------*)
(*-----------РЕШЕНИЕ ЗАДАЧИ-----------------*)
(*ВОПРОС:
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
*)
(*Вот ответ на задачу*)
CASE BOOL_TO_INT(time_on <= time_of) OF
0: day_light:=enable AND NOT(current_time >= time_of AND current_time < time_on);
1: day_light:=enable AND current_time >= time_on AND current_time < time_of;
END_CASE
(*Или такой вариант
IF time_on <= time_of THEN
day_light:=enable AND current_time >= time_on AND current_time < time_of;
ELSE
day_light:=enable AND NOT(current_time >= time_of AND current_time < time_on);
END_IF
*)
Для проекта нужна библиотека SysLibTime