Показано с 1 по 10 из 4462

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,108

    По умолчанию

    Цитата Сообщение от 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/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #2

    По умолчанию

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

  3. #3

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Вот вариант с суточным расписанием из макс. 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
    Добрый день. Как-то не очень точно работает функция "Scheduler", включение по расписанию включается почно по времени, а выключение по расписанию почему-то спустя 1 минуту:
    Расписание_1.PNG
    Расписание_2.PNG
    Расписание_3.PNG
    Хотя должно выключаться точно по указанному времени, может я где-то ошибся?
    Вложения Вложения

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

    По умолчанию

    Цитата Сообщение от Pvalp Посмотреть сообщение
    Добрый день. Как-то не очень точно работает функция "Scheduler", включение по расписанию включается почно по времени, а выключение по расписанию почему-то спустя 1 минуту:
    Расписание_1.PNG
    Расписание_2.PNG
    Расписание_3.PNG
    Хотя должно выключаться точно по указанному времени, может я где-то ошибся?
    Думаю, что дело в строчке
    if curTOD >= tmp_on and curTOD <= tmp_off then
    нужно исправить на
    if curTOD >= tmp_on and curTOD < tmp_off then
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Думаю, что дело в строчке
    if curTOD >= tmp_on and curTOD <= tmp_off then
    нужно исправить на
    if curTOD >= tmp_on and curTOD < tmp_off then
    Да, действительно, подправил строку в функции, теперь работает правильно.
    Спасибо.

Похожие темы

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

Ваши права

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