Да ,арифметика со временем -не привычное дело ....
Вид для печати
Да ,арифметика со временем -не привычное дело ....
я вот как то предлагал иметь время в ПРке в виде общего количества миллисекунд или секунд, как удобно было бы арифметические операции делать, независимо от перехода на следующие сутки, а вернуть в нормальное представление не так уж много функций понадобилось бы, так нет закидали меня "помидорами" :)
А как в кодесис работают со временем ,как там учитывают переход через ноль...при сравнении данного типа
ну как я предлагал макросы для вычисления фаз восход/закат из оскатовских библиотек, это если с RTS работать, а так я например использую функцию TIME(), преобразую её в двойное слово (целочисленное по вашему) и вычисляю разницу вышеуказанной функции с запомненым значением, получаю прошедшее время в секундах
У меня вроде бы все варианты проверяются, кроме варианта "В включается, когда А еще не выключилось, а выключается, когда А уже включилось". Вот в этот случай я и уперся. Хотя я тут выкладывал рабочий вариант, но он действует только в случае фиксированных интервалов 18 и 12, да и то с "костылями" внутри. А хочется универсальный сделать, чтобы с любыми уставками работал :)
Вроде победил его :) Теперь должен работать правильно во всем диапазоне и с любыми интервалами. Проверяйте!
Тогда вставляем ваш макрос в мой проект ....:rolleyes:
Он простой, спору нет. Жалко только, не работает :) После А=18:00 и включения B в полночь(ну или например А=23:00 B=01:00) он ошибку показывает, хотя все правильно по алгоритму и режим В завершает работу в пределах режима А. Я примерно такой уже пробовал сделать, с "костылями"(как раз обслуживающими кусок времени с 18:00 до 0:00) он даже правильно работает, выкладывал его. Но он получился не универсальным, а лучше один раз сделать хорошо, чтобы потом не переделывать каждый раз "костыли" под очередную уставку.
Теперь про Ваш. По состоянию выходов двух макросов видно, что они по-разному работают, а должны одинаково, если алгоритм один и тот же отрабатывается. Ну и если другие промежутки поставить(не 1080 минут и 720), то и время ошибочное другое будет. Повторюсь, мой по задумке считает адекватно при любых уставках интервалов и времени старта режимов, хотя скорее всего его и упростить можно было бы. Но повторюсь еще раз, я только учусь...
P.S. Спасибо, что занимаетесь моей проблемой, я во время этих попыток разобраться в алгоритмах узнаю для себя что-то новое постоянно :)
Прекрасно понимая, что у всех есть своя работа и свои дела, не прошу готового решения. Но может кто-нибудь из уважаемого сообщества хотя бы с алгоритмом поможет? Таймеры двух видов уже есть, проверку тоже осилили, а вот то самое переключение по полчаса в день двенадцать дней подряд - не могу алгоритм простой придумать. Но понимаю, что нужно плясать от реальной даты(номер дня в году), чтобы энергонезависимость была, и при этом только одну переменную энергонезависимую использовать(дату переключения). Пока задумка такая: в момент переключения записываем в энергонезависимую переменную номер дня, дальше считаем от него. Берем номер дня, прибавляем 1, в минутах А и В проверяем, можно ли с одной стороны отнять 30 минут, чтобы не вылезти за допустимые пределы, и назначаем на этот день А-30минут(если с одной стороны нельзя, проверяем с другой стороны и отнимаем). Берем опять номер дня, прибавляем 2, повторяем с 60 минутами, если не проходит - отнимаем 30 с одной, 30 с другой и т.д., пока не останется меньше 30 минут с каждой стороны, их не обрабатываем в последний день, а уже включаем режим В, потому что это и есть последние 30 минут. Но очень громоздко получается, на каждый день свой блок проверок и расчетов. Или я не в ту сторону думаю? :) Может, как-то проще можно сделать?
У мегя вот было пару свободных часов, решил сесть и написать какой нить пример, но так и не понял что нужно сделать, как дохожу до места где про "обрезание" какие то циклы, так и всё,каша в голове :)
Так. Попробую еще раз. Есть два интервала, А+18 и В+12 часов. Моменты А и В произвольные, но интервал В+12 должен всегда лежать внутри интервала А+18. То есть, если проще, на линейной временнОй шкале(например в секундах с 1970 года) В всегда должно быть от А до А+6. Готовый макрос проверки выше я выкладывал, вроде бы он правильно проверяет в любое время суток.
Переход от режима А+18 к режиму В+12 должен происходить за 12 циклов, в каждом из которых убирается по полчаса. То есть, в первый день перехода мы должны сократить 18-часовой интервал до 17,5 часов, на следующий день до 17, дальше до 16,5, и так далее до 12,5, после чего следующим циклом включить В+12. При этом, В+12 должно всегда лежать внутри этого сокращающегося интервала. Интервал мы можем сокращать произвольно с любой стороны до совпадения его со строго заданными В+12.
Если все еще не очень понятно, напишите. Попробую какие-нибудь графики порисовать.
А и В задается один раз, перед полным циклом событий. Полный цикл - это:
А+18 какое-то количество суток(от 1 до 30, например).
Далее идет переход от (А+18) к (В+12) 11 суток сокращение по полчаса
И на 12-е сутки начинается режим В+12, который продолжается какое-то количество суток(от 5 до 30, грубо)
При задаче А и В они проверяются на тупость персонала.
Он задан перед полным циклом событий, и не меняется до следующего полного цикла. Цикл я описал выше.Цитата:
Так В+12 - неизменяемый интервал? А начинается он всегда в одно время, или в разное?
У нас нет задачи получить А+12, а есть задача В+12 получить. Потому что если (В+12) начинается в (А+5) например, то нужно убирать время работы, включая позже, а не выключая раньше. Когда осталось менее 30 минут с каждой из сторон, значит осталось ровно полчаса. Просто включаем В+12, и переход завершен.Цитата:
И ещё, если между А и В интервал меньше 0,5 часа, и между
А+12,5 и В+12 то же меньше, то как в следующем цикле получить А+12?
Думаю, в энергонезависимую память писать номер дня от начала года, когда переключился режим, и от него уже считать.Цитата:
если происходит сброс питания - как мы узнаем предыдущее значение и сколько суток назад вступили в силу новые значения?
P.S. Графики выложил несколькими постами выше, может понятнее будет :)
Вдогонку. А и В пишутся в энергонезависимые переменные. Если начался режим А+18, значение А должно быть заблокировано от изменений. Пока не начался режим перехода(идет режим А+18), значение В может быть изменено в пределах от А до А+6,но в данном случае это неважно, думаю. В момент начала перехода должно быть заблокировано и значение В, до окончания полного цикла. Но это к самой логике отношения не имеет, это внешние ФБ или макросы какие-то должны быть, и сейчас можно на это вообще внимания не обращать, думаю что сам это сделаю.
Уехал, буду у компа после 23-00, если вопросы будут, отвечу. Всем огромное спасибо, что моей схемкой занимаетесь!
думаю, как и в моих "костылях" нужно всё приводить к "началу координат" - в точке первого запуска, а начА и длитА превращать в начВ и длитВ интерполяцией, за любое (заданное) кол-во дней.
AI!, я ни черта не понял, но это работает! И работает прекрасно. И проще моего в сто раз. Попытаюсь понять алгоритм вычисления, но пока просто сижу и восхищаюсь :) Конечно, я где-то в глубине души понимал, что там не все так сложно, но вот привести к такому простому виду никак не получалось. Я верно понимаю, что Ваш макрос вполне универсален и при любых уставках правильно считает, а не только при 18 и 12 часах?
ну да, одно условие - что бы длительности были меньше 24ч.
-----------
алгоритм на самом деле мега простой.
представим всё на прямой.
сделаем, что бы "А.нач" - бало началом координат, тогда (В.нач-А.нач)=В.нач.new в новых координатах
а координаты А.кон численно совпадают с А.длит
соответственно "интервал В" внутри "интервала А", если В.нач и В.кон лежит в диапазоне [0;A.длит]
ну и последний "костыль" - это избавляемся от минуса в выражении (В.нач-А.нач)=В.нач.new
PS добавлю, что т.к. В.нач мы "нормализуем" относительно А.нач, то В.кон может быть больше 24ч от "начала координат"
Почти понял :) Я пытался в своем варианте реализовать подсчет от начала суток, и пришлось задействовать вторые сутки, факт перехода через полночь, проверять отдельно начало, отдельно окончание, и отдельно(как потом выяснилось) нет ли отключения в середине, когда неожиданно выяснилось, что если В включено про работающем А, и выключено при работающем А, то совершенно не факт, что А работало между этими двумя точками :) Поэтому накрутил туда столько всякого лишнего, что просто жуть. Сейчас когда гонял Ваш и свой варианты, в своем нашел мелкую ошибку и поправил в одном месте "больше" на "больше или равно", но это уже так, из принципа "чтоб работало". Ваш намного проще, намного изящнее и меньше ресурсов жрет. Теорию я примерно осознал, и попробую не заглядывая в Ваш(хотя уже заглядывал и открыл для себя ФБ "деление с остатком", который в своем варианте реализовывал сравнением и вычитанием) сделать аналог. Не для того, чтобы его использовать, а для "усвоения пройденного", и внутреннего понимания. Использовать все равно Ваш буду :)
Если сразу не получится из теории сделать практический простой вариант, тогда погоняю на свежую голову Ваш макрос, посмотрю по связям, посчитаю, думаю что соображу в итоге. Еще раз огромное спасибо, Вы укрепляете меня в мысли, что на самом деле, большинство алгоритмов можно осуществить очень простыми методами. Нужно только правильно сформулировать задачу, потому что в вопросе содержится половина ответа :)
P.S. Все равно из описания немного не понял, где задействовано В.нач.new
P.P.S. Все, разобрался! Считаем абсолютное расстояние в минутах по временнОй оси от А до В, и от А до В+Вt, потом сравниваем их с абсолютным значением Аt, где Аt и Вt - интервалы включения, соответственно. "Костыль" помогает правильно посчитать переход через полночь в следующие сутки. Блин, ну как я сам до этого не додумался, ведь просто же...
Кстати, я немного подумал, как реализовать переходный режим. Не знаю только, правильно ли :) Вот начало:
Запоминаем в энергонезависимую переменную номер дня(в году) начала перехода, пусть будет D. Дальше вычитаем из текущего дня года D, получаем N. Берем отдельную переменную для включения режима, например F, и если А+30<В, присваиваем ей значение А+(30xN). Таким образом, с каждым днем F приближается к B. Только пока не продумывал, как зафиксировать значение, если уже не соблюдается А+30<В. Возможно, энергонезависимой её сделать. Когда остается менее 30 минут, проделать ту же штуку с другой стороны.
Возможные засады - конец года, включая високосный год. Но тоже проверку можно организовать, думаю. В понедельник попробую сам нарисовать, может что получится. Еще раз всех благодарю, с каждым(даже неправильным) вариантом я узнаю что-то новое и полезное для себя.
AI!, это уже просто чудеса! Просто, элегантно, и совершенно недосягаемо! Для меня на данном этапе, во всяком случае...
Проверил. на ПР114 удается создать цифровую линию задержки на 3072 бита из макросов AI
[/QUOTE]Цитата:
Сообщение от sanet
На дизельной горелке стоял автомат горения siemens LOA44.252A27
турбина с насосом
Клапан 1
Клапан 2
Трансформатор Розжига (искра)
Фоторезистивный датчик пламени
Кнопка сброса
Принцип работы автомата
При включении запускаеться турбина с насосом на предпродувку 10 сек потом включается зажигание, искра на 15 секунде. Через 20 сек включается клапан открытия топлива на форсунку.При успешном зажигании с датчика поступает сигнал.отключается искра. турбина и клапан работают.через выключатель включается второй клапан. При неудачном розжиге автомат выключается на 10 сек и повторяется попытка, всего 3 раза и если не зажглась блокируется и выдает сигнал.Кнопкой сброса сбрасывается в начальное положение.
http://xn----8sbaagc7blfrqf5cd.xn--p...7130ru_LMO.pdf[/QUOTE]
Не совсем понятно описание (не знаком с данным обьектом) .Нарисуйте лучше последовательность выходных\выходных сигналов и перечислите их .Сам проект делать 5 минут а вот догадываться можно целый день....
В теме уже были несколько вариантов дизель генераторов ,может подойдут ..
Вообще стоило ли заморачиваться если только ради любви к искуству. Как будем ток датчика пламени контролировать?
14000р и золотой ключик в кармане. Вот алгоритм автомата
датчик через релюшку (есть пламя ,нет пламени)
14000 или ПР за 2000 да и нет в наличии
есть автоматы горения и за 25т.р. LOK16.250A17 а ПР с такой логикой работы справиться и за одно может гирляндой управлять
Программка очень нужна
Можно вот такой датчик применить на пламя - выход релейный:
http://kipinfo.ru/info/stati/?id=189
поспешил я с покупкой ПР. Горелку так и не запустили,вода в системе отопления встала. Всеже может ктото из умельцев сваяет Автомат горения на ПР думаю много бы кому пригодилось.
Всеже ПР пригодиться буду учиться.
Датчик пламени вот такой о)
QRB max. ток 100 µA при наличии пламени
http://xn----8sbaagc7blfrqf5cd.xn--p...7130ru_LMO.pdf
У вас такая программа?Вложение 11245