Вот вариант с суточным расписанием из макс. 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
Scheduler := true;
// exit;
end_if
end_if
end_for
end_if
end_function
Захват-03.png
Как видно - интервалы могут быть не отсортированными, т.е. с экрана можно вводить или редактировать в любом порядке
даже могут быть задействованы не все 10.
В процессе работы для исключения интервала из работы можно просто сделать начало = концу или сделать начало = конец = 0
ЗЫ.
Количество интервалов можно увеличить добавляя необходимое кол. входных переменных TODon и TODoff и добавив шагов в цикл for i := 0 to 9