Только недавно закончил всю программу, все проверил, запустил, работат как надо. Но постала новая задача, хочется иметь возможность работы по графику, но с множеством периодов вкл/выкл. То есть для примера, вкл с 8 до 10 ч, с 14 до 16, с 20 до 22, в остальные периоды выкл. Или каждые 2-3 часа, но лучше задавать конкретные промежутки времени. Макрос Clock_Week вроде как подходит, но как задавать разные промежутки времени, если там только один промежуток можно задать? Или для этого нужно совсем другое? Тут даже не обязательно иметь расписание на каждый день, как в макросе Clock_Week, главное чтобы при достижении нужного времени срабатывал сценарий на вкл/выкл.
В данном случае это будет применено для вентиляции, чтобы она вкл/выкл по заданному времени. Из того что можно сделать быстрее, можно взять умное реле, которое настраивается через смартфон, там задавать нужный график вкл/выкл, и через какое-то промежуточное реле подавать 0/1 на DI пр200. Но все же хотелось бы сделать это программно, если не очень сложно.
На предыдущей странице есть подобная программа от petera, на таймерах с временем работы и паузами между ними. https://owen.ru/forum/showthread.php...&page=296#2954
Первый раз можно сделать и по макросу Clock_Week.
На предыдущей странице есть подобная программа от petera, на таймерах с временем работы и паузами между ними. https://owen.ru/forum/showthread.php...&page=296#2954
Первый раз можно сделать и по макросу Clock_Week.
Когда-то в кодесис делал программу для управления освещением с включения N количества ламп в одном из K интервалов суток
Сделал функцию Scheduler_Ex, где число интервалов времени заранее не известно и может быть очень большим (в примере ограничено 100)
Расписание - массив структур
Каждая строка массива
Код:
TYPE Schedule :
STRUCT
On: TOD; (*Время включения*)
Off: TOD; (*Время выключения*)
amount: UINT; (*Количество включенных светильников*)
END_STRUCT
END_TYPE
Легко заметить, что интервалы где amount:=0(все выкл) можно не указывать.
Универсальность в том, что очень просто добавлять интервалы или менять в расписании кол.включеных ламп, не меняя при этом самой программы.
В будущем очень просто будет изменить общее количество ламп.
Код функции Scheduler, с моим любимым способом поиска попадания в заданный диапазон методом деления интервала пополам
Scheduler_Ex:
Код:
FUNCTION Scheduler_Ex : UINT
VAR_INPUT
pt_Shedule: POINTER TO ARRAY[0..99] OF Schedule;
size: UINT;
END_VAR
VAR
a: INT; (*Начало интервала поиска*)
b: INT; (*Конец интервала поиска*)
N: INT; (*Число точек в расписании*)
i: INT;
uptime: SysTime64;
datetime: SystemTimeDate;
clock: CurTimeEx;
current_time: TOD; (*Текущее время*)
END_VAR
(*Получить текущее время*)
clock(SystemTime := uptime, (*текущее время в микросекундах*)
TimeDate := datetime); (*текущее время и дата в развернутом формате*)
(*собираем часы, минуты и секунды в одну кучу - в миллисекунды*)
current_time:=DWORD_TO_TOD((UINT_TO_DWORD(datetime.Hour) * 3600 +
UINT_TO_DWORD(datetime.Minute * 60) +
UINT_TO_DWORD(datetime.Second))*1000 +
datetime.Milliseconds);
N:= size / 12-1; (*находим число интервалов в расписании*)
(*Сразу проверить крайности*)
IF current_time <= pt_Shedule^[0].On THEN
Scheduler_Ex:=0;
ELSIF current_time >= pt_Shedule^[N].Off THEN
Scheduler_Ex:=0;
ELSE
(*Теперь можно начать поиск
поиск выполняется методом деления на 2*)
(*Начальные значения интервала поиска*)
a:=0;
b:=N+1;
WHILE (b-a) <> 0 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками On и Off*)
IF current_time >= pt_Shedule^[i].On AND current_time < pt_Shedule^[i].Off THEN (*Может нам повезло, и мы нашли ВКЛ? *)
Scheduler_Ex:=pt_Shedule^[i].amount; EXIT; (*тогда конец итераций, нечего в пустую молотить :) *)
ELSIF current_time >= pt_Shedule^[i].Off AND current_time < pt_Shedule^[i+1].On THEN (*Может нам повезло, и мы нашли ВЫКЛ? *)
Scheduler_Ex:=0; EXIT; (*тогда конец итераций, нечего в пустую молотить :) *)
END_IF(*мимо :( ,тогда посмотрим в какую половину интервалов попали*)
i:=(a+b)/2; (*Делим интервал поиска пополам*)
IF current_time > pt_Shedule^[i].Off THEN (*Если тек.время больше середины интервала поиска,*)
a:=i; (*то следующий поиск будем делать начиная от середины и до конца интервалов*)
ELSE (*А если входной сигнал меньше середины интервала поиска,*)
b:=i; (*то следующий поиск будем делать начиная от начала и до середины интервалов*)
END_IF
(*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину интервалов
два соседних интервала On(i) - Off(i) или Off(i)- On(i+1), меду которыми попадает текущее время найдем очень быстро
для 8 интервалов On - Off нужно не более 3 итераций
при 9..16 интервалов On - Off нужно не более 4 итераций
при 17..32 интервалов On - Off нужно не более 5 итераций
при 33..64 интервалов On - Off нужно не более 6 итераций
при 65..128 интервалов On - Off не более 7 итераций
инфа точная - 100% ;) *)
END_WHILE
END_IF
Жалко, что в ОЛ нельзя работать с указателями.
Функцию можно адаптировать для ОЛ, но с конечным, заданным числом интервалов в расписании.
Ребят кто то сталкивался с проблемой опроса трм 32 в пр200 . Проблема такая , вынул измеренное значение темп гвс - все хорошо , вынул уставку гвс ( только чтение 716 регистр ) - все хорошо .Но когда пытаюсь добавить регистр записи уставки гвс ( 10 регистр ) на холст в owen logic , то трм 32 становится не кликабельной ( что не нажмешь на ней , всегда возвращается в u-11 параметр как раз это 10 регистр ) . Убираю регистр с холста , все сразу нормально . Никак не могу вынуть эту переменную с овенклауд чтобы не было такой проблемы , хотя все работает запись и чтение с овенклауда . уже сломал всю голову . может кто поможет ?
Ребят кто то сталкивался с проблемой опроса трм 32 в пр200 . Проблема такая , вынул измеренное значение темп гвс - все хорошо , вынул уставку гвс ( только чтение 716 регистр ) - все хорошо .Но когда пытаюсь добавить регистр записи уставки гвс ( 10 регистр ) на холст в owen logic , то трм 32 становится не кликабельной ( что не нажмешь на ней , всегда возвращается в u-11 параметр как раз это 10 регистр ) . Убираю регистр с холста , все сразу нормально . Никак не могу вынуть эту переменную с овенклауд чтобы не было такой проблемы , хотя все работает запись и чтение с овенклауда . уже сломал всю голову . может кто поможет ?
Добрый день!
Напишите, пожалуйста, на support@owen.ru. Приложите Ваш проект Owen Logic и заводской номер ТРМ32.
Напишите, пожалуйста, на support@owen.ru. Приложите Ваш проект Owen Logic и заводской номер ТРМ32.
прислал вам 2 дня назад ...
P.S.
Имеется пр200 и трм32 щ7 и передача данных через пе210 в owencloud .
Нужно изменять данные в трм32 удаленно , все сделал всё читается и записывается , но с есть проблема , в трм32 нельзя в программировании листать и толком лазить по настройкам , всегда возвращается к одному параметру как будто идет вечная запись настроек с овенклауда .
Не знаю как обьяснить , приложу видео и тестовый проект ( кусок из основного проекта )
Последний раз редактировалось shmnpay; 02.04.2023 в 19:23.
Задумался над реализацией нажатия только одной кнопки из 10-ти.
Если нажато более одной любой клавиши, на выходе 0, при нажатии только одной, любой клавиши, на выходе 1.
Реализовал, все работает, но мне кажется, что я сделал через заднее место.
Пробовал через логические операторы, не смог осилить мозгом.
Пробовал через двоичную систему, получается громоздко.
Хочу услышать рекомендации, правильным путем пошел или нет? 2023-04-03_15-18-47.jpg
Задумался над реализацией нажатия только одной кнопки из 10-ти.
Если нажато более одной любой клавиши, на выходе 0, при нажатии только одной, любой клавиши, на выходе 1.
Реализовал, все работает, но мне кажется, что я сделал через заднее место.
Пробовал через логические операторы, не смог осилить мозгом.
И, совсем забыл сказать: легко расширяется до 32 входов, в смысле, просто добавить на входе второй макрос вставки(записи) бит, макрос с расширением(имеется специальный вход) и настройками(в свойствах макроса), короче, даже дополнительных макросов не потребуется!
Последний раз редактировалось Сергей0308; 03.04.2023 в 13:16.
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.