Просмотр полной версии : Алгоритм включения выключения по времени
Подскажите как реализовать следующий алгоритм (CFC)
Задается время включения выключения
если задано в 9 включить а 1 выключить то чтоб в промежуток между 9 и 1 должно произойти включение *(если оператор задал в 10 часов, чтоб включилось 9 то должно включится не на следующий день а сразу )
а с 1 до 9 выключение
lara197a
19.01.2015, 19:17
библиотека сислиб тайм- получаете время.
потом сравниваете. если больше или равно времени включения то устанавливаете маркер
если больше времени выключения то устанавливаете маркер выключения.
маркеры на вход RS
это все сейчас так и сделано но если А>9 то все хорошо до 0 а потом получается что А<9
это все сейчас так и сделано но если А>9 то все хорошо до 0 а потом получается что А<9
так может изменить логику, задавать начало включения и период работы, а тот вариант которывый изначально хотите осуществить далеко не полный, не решена проблема как плк должен определять насколько часов можно задавать начало "задним числом"
проблема в том что надо именно так . Уже месяц голову ломаю.
В СКАДЕ выставляется время включения час + минуты и время выключения
сейчас включается ровно в за данное время (9:00 к примеру )
lara197a
19.01.2015, 19:54
По фронтам тогда маркер ставьте. можно с запоминанием.
А при срабатывании по фронту, не только устанавливайте маркер включения, но и производите сброс маркера установки.
Соотвественно при установке маркера выключения сначала сбросьте маркер включения.
Я что-то не догоняю или вы дружно велосипед изобретаете?
код ниже
Я что-то не догоняю или вы дружно велосипед изобретаете?
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
когда 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));
У меня вроде так и есть. Ну то есть если включение на 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
on:=4, off:=21, curTime:=22Выключено согласно первой строчке.
CFC для некоторых: 16267
Подскажите как реализовать следующий алгоритм (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
Выключено согласно первой строчке.
CFC для некоторых: 16267
а чего у меня тогда горит выход?
А мой код работает, проверено
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
*)
а чего у меня тогда горит выход?Скобки во второй строке забыли (ну, то есть я сначала забыл).
У меня вроде так и есть. Ну то есть если включение на 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"
Спасибо всем сейчас буду пробовать
Спасибо всем сейчас буду пробовать
у меня освещение примерно так
svet12_0 := TimeAndDate.Hour >=2 AND TimeAndDate.Hour <=20; (*время включения и выключения тогда будет работать с 21-1*)
MDVV_out.7:= NOT svet12_0 AND autosvet;
В противном случае если on > off, то out включается на целый час позже значения "on"Я так-то с типом TOD это предполагал использовать, который здесь очень кстати. Тогда ошибка на одну миллисекунду, а не на час. Но всё равно ошибка, вы правы.
Я уже выкладывал готовый ФБ http://www.owen.ru/forum/showthread.php?t=10555&p=158114&viewfull=1#post158114
В программе на CFC будет выглядеть так
16268
Установил все отлично работает еще раз большое спасибо
Спорягин Кирилл
26.05.2016, 19:02
Petera, спасибо. Тоже пригодился Ваш ФБ.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot