Страница 298 из 359 ПерваяПервая ... 198248288296297298299300308348 ... ПоследняяПоследняя
Показано с 2,971 по 2,980 из 3585

Тема: разные вопросы новичка

  1. #2971
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от RomanKk Посмотреть сообщение
    В данном случае это будет применено для вентиляции, чтобы она вкл/выкл по заданному времени. Из того что можно сделать быстрее, можно взять умное реле, которое настраивается через смартфон, там задавать нужный график вкл/выкл, и через какое-то промежуточное реле подавать 0/1 на DI пр200. Но все же хотелось бы сделать это программно, если не очень сложно.
    Надо почитать про функции RTC. Не сложно.
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  2. #2972
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    917

    По умолчанию

    Цитата Сообщение от Сергей0308 Посмотреть сообщение
    Когда болеете, Вас доктора по фотографии лечат?
    Таки да, флюрография )))
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

  3. #2973

    По умолчанию

    Цитата Сообщение от RomanKk Посмотреть сообщение
    Только недавно закончил всю программу, все проверил, запустил, работат как надо. Но постала новая задача, хочется иметь возможность работы по графику, но с множеством периодов вкл/выкл. То есть для примера, вкл с 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.

  4. #2974
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    На предыдущей странице есть подобная программа от 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
    Программа PLC_PRG может выглядеть так
    Код:
    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
    Легко заметить, что интервалы где 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


    Жалко, что в ОЛ нельзя работать с указателями.
    Функцию можно адаптировать для ОЛ, но с конечным, заданным числом интервалов в расписании.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #2975
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,088

    По умолчанию

    Цитата Сообщение от RomanKk Посмотреть сообщение
    Только недавно закончил всю программу, все проверил, запустил, работат как надо. Но постала новая задача, хочется иметь возможность работы по графику, но с множеством периодов вкл/выкл. То есть для примера, вкл с 8 до 10 ч, с 14 до 16, с 20 до 22, в остальные периоды выкл. Или каждые 2-3 часа, но лучше задавать конкретные промежутки времени. Макрос Clock_Week вроде как подходит, но как задавать разные промежутки времени, если там только один промежуток можно задать? Или для этого нужно совсем другое? Тут даже не обязательно иметь расписание на каждый день, как в макросе Clock_Week, главное чтобы при достижении нужного времени срабатывал сценарий на вкл/выкл.

    В данном случае это будет применено для вентиляции, чтобы она вкл/выкл по заданному времени. Из того что можно сделать быстрее, можно взять умное реле, которое настраивается через смартфон, там задавать нужный график вкл/выкл, и через какое-то промежуточное реле подавать 0/1 на DI пр200. Но все же хотелось бы сделать это программно, если не очень сложно.
    вот можно переделать под себя https://owen.ru/forum/showthread.php...l=1#post358595

  6. #2976
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от 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
    Вложения Вложения
    Последний раз редактировалось petera; 29.03.2023 в 20:59.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  7. #2977

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Вот вариант с суточным расписанием из макс. 10 интервалов включенного состояния
    Работа по времени без единого таймера, круто)))

  8. #2978

    По умолчанию

    Всем спасибо, буду смотреть.

  9. #2979

    По умолчанию

    Ребят кто то сталкивался с проблемой опроса трм 32 в пр200 . Проблема такая , вынул измеренное значение темп гвс - все хорошо , вынул уставку гвс ( только чтение 716 регистр ) - все хорошо .Но когда пытаюсь добавить регистр записи уставки гвс ( 10 регистр ) на холст в owen logic , то трм 32 становится не кликабельной ( что не нажмешь на ней , всегда возвращается в u-11 параметр как раз это 10 регистр ) . Убираю регистр с холста , все сразу нормально . Никак не могу вынуть эту переменную с овенклауд чтобы не было такой проблемы , хотя все работает запись и чтение с овенклауда . уже сломал всю голову . может кто поможет ?

  10. #2980

    По умолчанию

    Цитата Сообщение от shmnpay Посмотреть сообщение
    Ребят кто то сталкивался с проблемой опроса трм 32 в пр200 . Проблема такая , вынул измеренное значение темп гвс - все хорошо , вынул уставку гвс ( только чтение 716 регистр ) - все хорошо .Но когда пытаюсь добавить регистр записи уставки гвс ( 10 регистр ) на холст в owen logic , то трм 32 становится не кликабельной ( что не нажмешь на ней , всегда возвращается в u-11 параметр как раз это 10 регистр ) . Убираю регистр с холста , все сразу нормально . Никак не могу вынуть эту переменную с овенклауд чтобы не было такой проблемы , хотя все работает запись и чтение с овенклауда . уже сломал всю голову . может кто поможет ?
    Добрый день!

    Напишите, пожалуйста, на support@owen.ru. Приложите Ваш проект Owen Logic и заводской номер ТРМ32.
    Инженер по продукту | ПР и Owen Logic
    email: k.korolev@owen.ru

Страница 298 из 359 ПерваяПервая ... 198248288296297298299300308348 ... ПоследняяПоследняя

Похожие темы

  1. Вопросы новичка!!!
    от sau в разделе ПЛК1хх
    Ответов: 42
    Последнее сообщение: 02.05.2022, 19:57
  2. Вопросы новичка по MasterScada
    от MrNobody в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 04.09.2014, 15:39
  3. ПЛК 110 - Вопросы новичка?
    от di-s в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 06.09.2011, 15:12
  4. Вопросы полного новичка
    от Korion в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 09.02.2010, 10:08
  5. Вопросы новичка по ПЛК
    от Ollegator в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 07.07.2009, 10:29

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •