Сообщение от
DIPHENHYDRAMINE
petera выкладывал тут.... напиши ему в личку
где-то был пост...
Захват-01.png
Код:
FUNCTION_BLOCK clock_week
(*включение и отключение выхода по времени с недельной маской разрешения включения.
Блок использует ФБ real_time, который надо вызывать в начале основной программы*)
VAR_INPUT
on_Hour: WORD; (*время включения: часы*)
on_Minute: WORD; (*время включения: минуты*)
on_Second: WORD; (*время включения: секунды*)
of_Hour: WORD; (*время выключения: часы*)
of_Minute: WORD; (*время выключения: минуты*)
of_Second: WORD; (*время выключения: секунды*)
en_SU: BOOL; (*разрешить в восскресение*)
en_MO: BOOL; (*разрешить в понедельник*)
en_TU: BOOL; (*разрешить во вторник*)
en_WE: BOOL; (*разрешить в среду*)
en_TH: BOOL; (*разрешить в четверг*)
en_FR: BOOL; (*разрешить в пятницу*)
en_SA: BOOL; (*разрешить в субботу*)
END_VAR
VAR_OUTPUT
q: BOOL; (*выход*)
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate; (*нужна для обнуления параметров*)
END_VAR
VAR
uptime: SysTime64;
datetime: SystemTimeDate;
clock: CurTimeEx;
time_on:DWORD; (*время включения в секундах*)
time_of:DWORD; (*время отключения в секундах*)
current_time:DWORD; (*текущее время в секундах*)
on: TIME;
cur: DWORD;
enable: BOOL; (*разрешение на включение по маске дней недели*)
END_VAR
datetime := nulldt;(*обнуляем переменные времени*)
clock(SystemTime := uptime, (*текущее время в микросекундах*)
TimeDate := datetime); (*текущее время и дата в развернутом формате*)
(*собираем часы, минуты и секунды в одну кучу - в секунды*)
time_on:=(on_Hour * 60 + on_Minute) * 60 + on_Second; (*время включения*)
time_of:=(of_Hour * 60 + of_Minute) * 60 + of_Second; (*время отключения*)
current_time:=(datetime.Hour * 60 + datetime.Minute) * 60 + datetime.Second; (*текущее время*)
(*Если бит маски установлен, то разрешение для включения получено*)
CASE datetime.DayOfWeek OF (*получаем или не получаем разрешение по значению из маски дней недели*)
0: (*воскресенье *)
enable:=en_SU;
1: (*понедельник *)
enable:=en_MO;
2: (*вторник *)
enable:=en_TU;
3: (*среда *)
enable:=en_WE;
4: (*четверг *)
enable:=en_TH;
5: (*пятница *)
enable:=en_FR;
6: (*суббота *)
enable:=en_SA;
END_CASE
CASE BOOL_TO_INT(time_on <= time_of) OF
0: q:=enable AND NOT(current_time >= time_of AND current_time < time_on);
1: q:=enable AND current_time >= time_on AND current_time < time_of;
END_CASE
(*Или такой вариант
IF time_on <= time_of THEN
q:=enable AND current_time >= time_on AND current_time < time_of;
ELSE
q:=enable AND NOT(current_time >= time_of AND current_time < time_on);
END_IF
*)