А Вы вот это видели?
Вложение 41788
Вид для печати
А Вы вот это видели?
Вложение 41788
Сергей0308 Именно здесь я и нашел свою ошибку.
Может тогда вывести на экран номер уставки, что последней сработала, тогда будет легче понять, что время сбито? А то действительно, когда много уставок, непонятно какая сработала!
Вот, как обещал, добавил на экран номер последней сработавшей уставки:
Вложение 41802
Вложение 41803
До хантера далековато. Время включения выходов не регулируется. Нет очереди включения зон ("входов") с тем, чтобы гарантировать включение только одного выхода. Нет % регулировки длительности включения всех входов. Нет обработки датчиков (дождя, ветра и прочего семейства хантеровских нормально замкнутых датчиков *Click). Но впрочем задача Сергея в этом и не состояла.
Просто я занимаюсь автополивом. Но сейчас не сезон и я неспешно курю ПР200 на предмет применения в качестве контроллера системы антиобледенения для одного объекта. Проблема на объекте в том, что мощностей дают мало, а требуется ее много. И необходимо по таймеру включать разные контуры греющего кабеля не более N штук за раз.
(Между прочим, включение нескольких зон одновременно - фишка только продвинутых контроллеров полива для коммерческого использования.)
Наткнулся еще на первые примеры Сергея. Начал над ними работать. И пришел примерно к тому, что Сергей показал в последнем примере. Т.е. главный суточный таймер "пинает" таймеры задержки выключения. При этой схеме можно уйти от не совсем красивой переменной последнего включения.
Ну и применил схему уставки не как принято у "автоматчиков" - время суток включения+время суток выключения, а так как обычно это реализовано в контроллерах полива - время суток включения+длительность включения.
При этом в один UInt32 запихал следующие переменные:
1) 11 бит - минуты суток включения;
2) 7 бит - маска дней недели;
3) 10 бит длительность включения (максимум 1023 минут);
4) 4 бита - номер выхода, который надо включить (4 бита дают 16 шт., естественно).
Тратить один бит на признак вкл/выкл - роскошь. Можно применить время суток включения более 24 часов. Либо длительность установить в ноль.
А при чём здесь сколько минут в сутках? Всё зависит с каким минимальным интервалом, т. е. ступенькой нужно назначать время уставок, при минимальной ступеньке в 5 минут диапазон уставок уместится в 9 бит(при 10 минутах в 8 бит), а умножить на 5(или 10) всегда можно вне уставки, с длительностью включения аналогично поступить, а так получается..., короче плохо получается, не рационально биты используются! И ещё хотел добавить, только нечто почти противоположное, вот у Вас выхода включаются очень заморочено, 4 битами, Вам не кажется это странным, когда энергонезависимая память используется только на четверть, короче зачем это делать, если ресурсов более чем достаточно выполнить это по-человечьи?
Защита от ошибок и от дурака. При 32-х уставках легко ошибиться в ступеньках. Задача - ограничить число включаемых одновременно входов.
Назначаем произвольное время суток на включение. Выставляем произвольную (в пределах разумного и возможного) длительность включения, которая может составлять несколько часов. Никаких ступенек не получится. Ну можно время включения как в тех же поливных контроллерах хантер назначить с шагом 15-10 минут и сэкономить на этом несколько бит. Для подобных применений - не критично.
Когда номер выхода в сохраняем в уставке - имеем бОльшую свободу при выборе времен включения. Можно, конечно привязать номер выхода к номеру уставки. Скажем, первые две уставки - выход 1, следующие две - выход 2 и т.д.
Имеем 32 уставки на 16 выходов - по две уставки на выход. Но один выход нам нужно включить раз в сутки, другой - 3 раза.
Ничего замороченного не вижу, например уставка/задание: в 18.00 по пятницам и субботам включить выход 2 на 4 часа.
Если 4-мя битами включаются 16 выходов, то все биты выключены(0) будет соответствовать включению 1 выхода, все биты включены(1) будет соответствовать 16 выходу, ну и все остальные выхода будут аналогично задаваться, разве это не заморочено?
И как это внешне задаётся и как сделано в программе - это две разные вещи, короче, можно к времени включения добавить время включенного состояния и вычислить время выключения(удобней, чем самому вычислять)), по нему и выключать, а не по таймеру обратного отсчёта времени, надеюсь, понятно получилось объяснить?!
??? Это обычная битовая арифметика. 4-мя битами мы можем отобразить только число от 0 до 15. Ничего сложного, только нужно быть внимательным к очепяткам/ошибкам при написании. Для облегчения распаковки/запаковки уставок я засунул эти функции и связанные преобразования переменных пользовательского интерфейса в макросы - PackSet/UnpackSet. (См вложение.)
Ну во вложении примерно то, что я хочу изобразить. Ваш таймер занимается только подачей сигнала о включении, номера выхода и длительности включения на таймеры выходов. Дальше - не его дело ("я не стратег, я тактик"). Таймеры выходов крутятся самостоятельно - можно приостановить, отменить. И, поскольку ваш таймер минутный, может лучше счетчик ctzu пускать только раз в минуту (блинком или по изменению переменной минуты). Раз в минуту пробежаться по уставкам, избавиться от переменной "Время ПК" и/или не дергать лишний раз таймеры задержки выключения?
Подскажите это нормально ?
Если переменная не энергонезависимая то она не работает (а мне нужно чтобы она была не энергонезависимая).
Вложение 42038
Вложение 42039