PDA

Просмотр полной версии : Алгоритм включения выключения по времени



Roman29
19.01.2015, 19:12
Подскажите как реализовать следующий алгоритм (CFC)
Задается время включения выключения
если задано в 9 включить а 1 выключить то чтоб в промежуток между 9 и 1 должно произойти включение *(если оператор задал в 10 часов, чтоб включилось 9 то должно включится не на следующий день а сразу )
а с 1 до 9 выключение

lara197a
19.01.2015, 19:17
библиотека сислиб тайм- получаете время.
потом сравниваете. если больше или равно времени включения то устанавливаете маркер
если больше времени выключения то устанавливаете маркер выключения.
маркеры на вход RS

Roman29
19.01.2015, 19:24
это все сейчас так и сделано но если А>9 то все хорошо до 0 а потом получается что А<9

capzap
19.01.2015, 19:39
это все сейчас так и сделано но если А>9 то все хорошо до 0 а потом получается что А<9

так может изменить логику, задавать начало включения и период работы, а тот вариант которывый изначально хотите осуществить далеко не полный, не решена проблема как плк должен определять насколько часов можно задавать начало "задним числом"

Roman29
19.01.2015, 19:46
проблема в том что надо именно так . Уже месяц голову ломаю.
В СКАДЕ выставляется время включения час + минуты и время выключения
сейчас включается ровно в за данное время (9:00 к примеру )

lara197a
19.01.2015, 19:54
По фронтам тогда маркер ставьте. можно с запоминанием.
А при срабатывании по фронту, не только устанавливайте маркер включения, но и производите сброс маркера установки.
Соотвественно при установке маркера выключения сначала сбросьте маркер включения.

Yegor
19.01.2015, 20:08
Я что-то не догоняю или вы дружно велосипед изобретаете?
код ниже

capzap
19.01.2015, 20:28
Я что-то не догоняю или вы дружно велосипед изобретаете?
out := (on < off AND curTime >= on AND curTime < off) OR
(on > off AND curTime < off OR curTime > on);

гы, там еще предлагалось, когда on>off, currTime>on то всёравно включить и работать до off? причем не указывалось насколько могла быть велика разница между currTime-on

Yegor
19.01.2015, 20:40
когда on>off, currTime>on то всёравно включить и работать до offУ меня вроде так и есть. Ну то есть если включение на 9:00, выключение — на 03:00 (ночи), и сейчас 23:00, то оно (за)работает. И в 01:00 ночи оно (за)работает.

Фу ты блин, скобки забыл:
out := (on < off AND curTime >= on AND curTime < off) OR
(on > off AND (curTime < off OR curTime > on));

capzap
19.01.2015, 21:03
У меня вроде так и есть. Ну то есть если включение на 9:00, выключение — на 03:00 (ночи), и сейчас 23:00, то оно (за)работает. И в 01:00 ночи оно (за)работает.

Фу ты блин, скобки забыл:
out := (on < off AND curTime >= on AND curTime < off) OR
(on > off AND (curTime < off OR curTime > on));конечно я не проверял код, просто интуитивно чуствую, не всё так однозначно :)

...а как с такими НУ on:=4, off:=21, curTime:=22

Yegor
19.01.2015, 21:06
on:=4, off:=21, curTime:=22Выключено согласно первой строчке.

CFC для некоторых: 16267

petera
19.01.2015, 21:28
Подскажите как реализовать следующий алгоритм (CFC)
Задается время включения выключения
если задано в 9 включить а 1 выключить то чтоб в промежуток между 9 и 1 должно произойти включение *(если оператор задал в 10 часов, чтоб включилось 9 то должно включится не на следующий день а сразу )
а с 1 до 9 выключение


Я что-то не догоняю или вы дружно велосипед изобретаете?


проблема в том что надо именно так . Уже месяц голову ломаю.
В СКАДЕ выставляется время включения час + минуты и время выключения
сейчас включается ровно в за данное время (9:00 к примеру )
Я уже выкладывал готовый ФБ http://www.owen.ru/forum/showthread.php?t=10555&p=158114&viewfull=1#post158114
В программе на CFC будет выглядеть так
16268

capzap
19.01.2015, 21:32
Выключено согласно первой строчке.

CFC для некоторых: 16267

а чего у меня тогда горит выход?

petera
19.01.2015, 21:37
А мой код работает, проверено
16270
ЗЫ.
Или частный случай, без дней недели

CASE BOOL_TO_INT(time_on <= time_of) OF
0: q:=NOT(current_time >= time_of AND current_time < time_on);
1: q:=current_time >= time_on AND current_time < time_of;
END_CASE

(*Или такой вариант
IF time_on <= time_of THEN
q:=current_time >= time_on AND current_time < time_of;
ELSE
q:=NOT(current_time >= time_of AND current_time < time_on);
END_IF
*)

Yegor
20.01.2015, 09:06
а чего у меня тогда горит выход?Скобки во второй строке забыли (ну, то есть я сначала забыл).

petera
20.01.2015, 10:15
У меня вроде так и есть. Ну то есть если включение на 9:00, выключение — на 03:00 (ночи), и сейчас 23:00, то оно (за)работает. И в 01:00 ночи оно (за)работает.

Фу ты блин, скобки забыл:
out := (on < off AND curTime >= on AND curTime < off) OR
(on > off AND (curTime < off OR curTime > on));
Чтобы совсем было гуд, надо в последнем условии вместо ">" ставить ">="

out := (on < off AND curTime >= on AND curTime < off) OR
(on > off AND (curTime < off OR curTime >= on));
В противном случае если on > off, то out включается на целый час позже значения "on"

Roman29
20.01.2015, 10:22
Спасибо всем сейчас буду пробовать

Roman29
20.01.2015, 10:29
Спасибо всем сейчас буду пробовать

KRUG
20.01.2015, 10:51
у меня освещение примерно так
svet12_0 := TimeAndDate.Hour >=2 AND TimeAndDate.Hour <=20; (*время включения и выключения тогда будет работать с 21-1*)
MDVV_out.7:= NOT svet12_0 AND autosvet;

Yegor
20.01.2015, 11:02
В противном случае если on > off, то out включается на целый час позже значения "on"Я так-то с типом TOD это предполагал использовать, который здесь очень кстати. Тогда ошибка на одну миллисекунду, а не на час. Но всё равно ошибка, вы правы.

Roman29
20.01.2015, 11:04
Я уже выкладывал готовый ФБ http://www.owen.ru/forum/showthread.php?t=10555&p=158114&viewfull=1#post158114
В программе на CFC будет выглядеть так
16268

Установил все отлично работает еще раз большое спасибо

Спорягин Кирилл
26.05.2016, 19:02
Petera, спасибо. Тоже пригодился Ваш ФБ.