Надо почитать про функции RTC. Не сложно.
Вид для печати
На предыдущей странице есть подобная программа от petera, на таймерах с временем работы и паузами между ними. https://owen.ru/forum/showthread.php...&page=296#2954
Первый раз можно сделать и по макросу Clock_Week.
Когда-то в кодесис делал программу для управления освещением с включения N количества ламп в одном из K интервалов суток
Сделал функцию Scheduler_Ex, где число интервалов времени заранее не известно и может быть очень большим (в примере ограничено 100)
Расписание - массив структур
Каждая строка массива
Программа PLC_PRG может выглядеть такКод:TYPE Schedule :
STRUCT
On: TOD; (*Время включения*)
Off: TOD; (*Время выключения*)
amount: UINT; (*Количество включенных светильников*)
END_STRUCT
END_TYPE
Легко заметить, что интервалы где amount:=0(все выкл) можно не указывать.Код:PROGRAM PLC_PRG
VAR RETAIN PERSISTENT
Shedule1:ARRAY[0..7] OF Schedule:=
(On:=TOD#00:00, Off:=TOD#01:30, amount:=1),
(On:=TOD#02:00, Off:=TOD#03:30, amount:=2),
(On:=TOD#04:00, Off:=TOD#05:30, amount:=3),
(On:=TOD#06:00, Off:=TOD#07:30, amount:=1),
(On:=TOD#08:00, Off:=TOD#09:30, amount:=2),
(On:=TOD#10:00, Off:=TOD#12:00, amount:=3),
(On:=TOD#16:00, Off:=TOD#18:00, amount:=2),
(On:=TOD#20:00, Off:=TOD#22:00, amount:=1);
END_VAR
VAR
Lamp1: BOOL;
Lamp2: BOOL;
Lamp3: BOOL;
amount: UINT; (*Количество включеных светильников*)
END_VAR
amount:=Scheduler_Ex(pt_Shedule:=ADR(Shedule1) , size:=SIZEOF(Shedule1) );
CASE amount OF
0: Lamp1:=FALSE; Lamp2:=FALSE; Lamp3:=FALSE;
1: Lamp1:=TRUE; Lamp2:=FALSE; Lamp3:=FALSE;
2: Lamp1:=TRUE; Lamp2:=TRUE; Lamp3:=FALSE;
3: Lamp1:=TRUE; Lamp2:=TRUE; Lamp3:=TRUE;
END_CASE
Универсальность в том, что очень просто добавлять интервалы или менять в расписании кол.включеных ламп, не меняя при этом самой программы.
В будущем очень просто будет изменить общее количество ламп.
Код функции Scheduler, с моим любимым способом поиска попадания в заданный диапазон методом деления интервала пополам
Scheduler_Ex:
Жалко, что в ОЛ нельзя работать с указателями.
Функцию можно адаптировать для ОЛ, но с конечным, заданным числом интервалов в расписании.
вот можно переделать под себя https://owen.ru/forum/showthread.php...l=1#post358595
Вот вариант с суточным расписанием из макс. 10 интервалов включенного состояния
В начале некоторые соглашения
Время включения и время выключения для каждого интервала будем задавать с экрана ПР в виде целых чисел типа
1235 для времени 12:35
1841 для времени 18:41
это упростит задачу ввода с экрана ПР
Вложение 66738
Да и количество переменных для расписания будет меньше
Вложение 66739
Включением выключением будет заниматься функция на ST
Вложение 66740Код: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
Как видно - интервалы могут быть не отсортированными, т.е. с экрана можно вводить или редактировать в любом порядке
даже могут быть задействованы не все 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
Всем спасибо, буду смотреть.
Ребят кто то сталкивался с проблемой опроса трм 32 в пр200 . Проблема такая , вынул измеренное значение темп гвс - все хорошо , вынул уставку гвс ( только чтение 716 регистр ) - все хорошо .Но когда пытаюсь добавить регистр записи уставки гвс ( 10 регистр ) на холст в owen logic , то трм 32 становится не кликабельной ( что не нажмешь на ней , всегда возвращается в u-11 параметр как раз это 10 регистр ) . Убираю регистр с холста , все сразу нормально . Никак не могу вынуть эту переменную с овенклауд чтобы не было такой проблемы , хотя все работает запись и чтение с овенклауда . уже сломал всю голову . может кто поможет ?
Добрый день!
Напишите, пожалуйста, на support@owen.ru. Приложите Ваш проект Owen Logic и заводской номер ТРМ32.