
Сообщение от
RomanKk
Только недавно закончил всю программу, все проверил, запустил, работат как надо. Но постала новая задача, хочется иметь возможность работы по графику, но с множеством периодов вкл/выкл. То есть для примера, вкл с 8 до 10 ч, с 14 до 16, с 20 до 22, в остальные периоды выкл. Или каждые 2-3 часа, но лучше задавать конкретные промежутки времени. Макрос Clock_Week вроде как подходит, но как задавать разные промежутки времени, если там только один промежуток можно задать? Или для этого нужно совсем другое? Тут даже не обязательно иметь расписание на каждый день, как в макросе Clock_Week, главное чтобы при достижении нужного времени срабатывал сценарий на вкл/выкл.
В данном случае это будет применено для вентиляции, чтобы она вкл/выкл по заданному времени. Из того что можно сделать быстрее, можно взять умное реле, которое настраивается через смартфон, там задавать нужный график вкл/выкл, и через какое-то промежуточное реле подавать 0/1 на DI пр200. Но все же хотелось бы сделать это программно, если не очень сложно.
Вот вариант с суточным расписанием из макс. 10 интервалов включенного состояния
В начале некоторые соглашения
Время включения и время выключения для каждого интервала будем задавать с экрана ПР в виде целых чисел типа
1235 для времени 12:35
1841 для времени 18:41
это упростит задачу ввода с экрана ПР
Захват-01.png
Да и количество переменных для расписания будет меньше
Захват-02.png
Включением выключением будет заниматься функция на ST
Код:
function Scheduler: bool; // Интервальный суточный таймер
//(c) Petera для форума ОВЕН
var_input //объявление входных переменных
Enbl: bool; //Разрешение работы функции
curHH: udint; //Текущее время - часы
curMM: udint; //Текущее время - минуты
//Далее расписание только интервалы включенного состояния
//Формат времени вкл/выкл в виде 1230 - для 12:30 чч:мм
TODon1: udint;
TODoff1: udint;
TODon2: udint;
TODoff2: udint;
TODon3: udint;
TODoff3: udint;
TODon4: udint;
TODoff4: udint;
TODon5: udint;
TODoff5: udint;
TODon6: udint;
TODoff6: udint;
TODon7: udint;
TODoff7: udint;
TODon8: udint;
TODoff8: udint;
TODon9: udint;
TODoff9: udint;
TODon10: udint;
TODoff10: udint;
end_var
var //объявление локальных переменных
Schedule: array [0..9] of udint; // Для упакованного расписание
curTOD: udint; //текущее время в виде 1230 - для 12:30 чч:мм
i: udint;
tmp_on: udint;
tmp_off: udint;
end_var
if not Enbl then Scheduler := false;
else
curTOD := curHH * 100 + curMM; //текущее время в виде 1230 - для 12:30 чч:мм
//Т.к. двухмерные массивы не поддерживаются
//упаковываем интервалы в одномерный массив
//получаем формат времени вкл - выкл в виде 12301445 - для вкл в 12:30 и выкл в 14:45
Schedule[0] :=TODon1 *10000 + TODoff1;
Schedule[1] :=TODon2 *10000 + TODoff2;
Schedule[2] :=TODon3 *10000 + TODoff3;
Schedule[3] :=TODon4 *10000 + TODoff4;
Schedule[4] :=TODon5 *10000 + TODoff5;
Schedule[5] :=TODon6 *10000 + TODoff6;
Schedule[6] :=TODon7 *10000 + TODoff7;
Schedule[7] :=TODon8 *10000 + TODoff8;
Schedule[8] :=TODon9 *10000 + TODoff9;
Schedule[9] :=TODon10 *10000 + TODoff10;
Scheduler := false;
//ищем попадание текущего времени в интервалы расписания
for i := 0 to 9 do
tmp_on := Schedule[i] / 10000;
tmp_off := Schedule[i] mod 10000;
if tmp_on < tmp_off then
if curTOD >= tmp_on and curTOD < tmp_off then // исправил curTOD <= tmp_of на curTOD < tmp_of. Иначе выключалось на 1 мин. позже
Scheduler := true;
exit;
end_if
end_if
end_for
end_if
end_function
Захват-03.png
Как видно - интервалы могут быть не отсортированными, т.е. с экрана можно вводить или редактировать в любом порядке
даже могут быть задействованы не все 10.
В процессе работы для исключения интервала из работы можно просто сделать начало = концу или сделать начало = конец = 0
ЗЫ.
Количество интервалов можно увеличить добавляя необходимое кол. входных переменных TODon и TODoff и добавив шагов в цикл for i := 0 to 9
ЗЫ.
Исправил строку
if curTOD >= tmp_on and curTOD <= tmp_off then
на
if curTOD >= tmp_on and curTOD < tmp_off then