Извиняюсь, поторопился и не вставил код...
Вечером выложу.
Вид для печати
Если я правильно понял вход in2 включает q. Вход in1 выключает выход q на 5 минут.
Код:VAR_INPUT
in1, in2:BOOL;
END_VAR
VAR_OUTPUT
q:BOOL;
END_VAR
VAR
TOF1: TOF;
END_VAR
-------------------------
TOF1(IN:=in1 , PT:=t#5m);
q:=in2 AND NOT TOF1.Q;
Спасибо! Попробую. Я что-то нагородил там с таймером =)
Оживлю свою старую тему.
Решил переписать свою программу управления злополучным аквариумом. Основной критерий: суточное переключение света, газа, воздуха. Режимы, в общем.
Привязано все к реальному времени. И в этом проблема.
Захотел я сделать так, чтобы в уставках вводилась основная информация: время запуска основного света и продолжительность, а остальной суточный режим пересчитывался сам. Добился, чтобы все переменные были в диапазоне 0-23, чтобы привязать к часам. И тут незадача:
IF clock>=time_start AND clock< time_end THEN
day_light:=TRUE;
Вся беда в том, что по расчётам может получиться так:
time_start=19
time_end=3 (3 часа утра следующих суток)
Тут вся логика и затыкается.
Подскажите, что можно сделать?
Программировать!
Варианта минимум 2:
1. RS триггер, если считать, что ПЛК работает круглосуточно всегда.
2. Ещё одно условие на сравнение времени начала и окончания с обработкой перехода через 0.
Простейшая школьная задачка.
Для проекта нужна библиотека SysLibTimeКод: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
*)
В случае с RS нужно на Set подать TRUE, которое берём из сравнения времени с уставкой старта, а на Reset дать TRUE из времени выключения? Я правильно понимаю?
Вот без всяких триггеров
СМ. предыдущий постКод:CASE BOOL_TO_INT(ime_start <= time_end) OF
0: day_light:=NOT(clock >= time_end AND clock < ime_start); (* 0 ------I________I------ 24 *)
1: day_light:=clock >= ime_start AND clock < time_end; (* 0 _____I----------I_____ 24 *)
END_CASE