Показано с 1 по 5 из 5

Тема: Макрос Clockweek.

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию Макрос Clockweek.

    Всем доброго времени суток. Я человек малоопытный в этой теме, но нужда по работе вынуждает. Поэтому прошу у вас помощи.
    Ситуация:
    1.Есть контроллер ПР205. Необходимо на него поставить Алгоритм работы 7 вытяжных вентиляторов, которые будут срабатывать по времени и дням недели. Для каждого вентилятора свой режим работы.
    2. На контроллерах первого поколения существуют функциональный блок CLOCK WEEK, но на моем ПР205(второго поколения) этот блок отсутствует. Вместо него предлагают макрос. С горем пополам я выгрузил этот макрос из библиотеки(первый раз в первый класс...) и теперь главный вопрос:
    -Как подтянуть значения реального времени и даты в этот макрос. В общем как заставить этот макрос работать?
    Помогите люди добрые. Без вас не справлюсь...(
    При чем мне надо это обьяснить как полному чайнику. С пошаговой инструкцией иначе не додумаюсь.
    Последний раз редактировалось Atlas3242; 18.09.2026 в 07:58.

  2. #2

    По умолчанию

    В макрос не надо время подтягивать, надо задать время включения и выключения и день недели. В заданный промежуток включится выход.
    Когда задаёте вопрос, выкладывайте скрин с проблемой или проект.

    А вот получение времени в симуляции можно взять отсюда
    Дата, Время и День недели через DT с 2000г. ____________ https://owen.ru/forum/showthread.php?t=40116#4
    Последний раз редактировалось kondor3000; 18.09.2026 в 08:24.

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

    По умолчанию

    Вы можете вместо блока CLOCK WEEK из библиотеки для ПРок предыдущей линейки, воспользоваться одноименным блоком на ST
    https://docs.owen.ru/product/program...6#topic-122518

    Или, можно самому написать макрос уже со временем внутри, например
    Код:
    ///<GroupName>Таймеры</GroupName>
    ///<Description>Недельный таймер</Description>
    
    function_block ClockWeek 
    
        var_input
            Tm_On: udint;            // Время включения в секундах
            TM_Off: udint;           // Время выключения в секундах
            bm_WeekDay: udint := 0;  // Выбор рабочих дней, битовая маска (бит_0 = Пн., бит_1 = Вт... бит_6 = Вс). 
                                     // Если битовая маска равна нулю, то считаем, что все дни рабочие
            Enable: bool;            // Разрешение на работу       
        end_var
    
        var_output
            Q : bool;
        end_var
        
        var        
            cur: udint;
            day: udint;
            weekday : udint;
        end_var
       
        if Enable then
            cur := dt_to_udint(get_date_time()); // Дата и Время текущее в формате UnixTime от 01.01.2000
            weekday := (cur / 86400 + 5) mod 7;  // Определение дня недели (0 = Пн, ... 6 = Вс)
            cur := cur mod 86400; // Текущее время (в секундах)        
            if bm_WeekDay = 0 then bm_WeekDay := 127; end_if // Все дни рабочие;       
            if Tm_On < Tm_Off then //Если время включения меньше выключения
                day := shr(bm_WeekDay, weekday); // Перемещаем в маске рабочих дней текущий день недели в нулевой бит
                Q := cur >= Tm_On and cur < Tm_Off and day.0;                
            else // Если время включения больше времени выключения, то учитываем переход через полночь
                bm_WeekDay := shl(bm_WeekDay, 1); //Освобождаем нулевой бит для воскресенья
                bm_WeekDay.0 := bm_WeekDay.7;    
                day := shr(bm_WeekDay, weekday); //В маске рабочих дней: текущий день (1-й бит) и вчерашний день (0-й бит)
                Q := (cur >= Tm_On and day.1) or (cur < Tm_Off and day.0);
            end_if
        else
            Q := false;
        end_if
        
    end_function_block

  4. #4
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    9,895

    По умолчанию

    Цитата Сообщение от Atlas3242 Посмотреть сообщение
    Всем доброго времени суток. Я человек малоопытный в этой теме, но нужда по работе вынуждает. Поэтому прошу у вас помощи.
    Ситуация:
    1.Есть контроллер ПР205. Необходимо на него поставить Алгоритм работы 7 вытяжных вентиляторов, которые будут срабатывать по времени и дням недели. Для каждого вентилятора свой режим работы.
    2. На контроллерах первого поколения существуют функциональный блок CLOCK WEEK, но на моем ПР205(второго поколения) этот блок отсутствует. Вместо него предлагают макрос. С горем пополам я выгрузил этот макрос из библиотеки(первый раз в первый класс...) и теперь главный вопрос:
    -Как подтянуть значения реального времени и даты в этот макрос. В общем как заставить этот макрос работать?
    Помогите люди добрые. Без вас не справлюсь...(
    При чем мне надо это обьяснить как полному чайнику. С пошаговой инструкцией иначе не додумаюсь.
    Так я 100 раз выкладывал командоаппарат реального времени, он 8-и канальный, один канал будет в запасе:

    Командоаппарат реальногого времени с маской недели на 32 команды 8 канальный_00.owle

    Можно назначить до 32(включительно) уставок времени включения-выключения каналов(команд) с маской дней недели.

    Если купите ПР200, останется только залить проект(кнопочку нажать) и пользоваться!

    ПР200-220.2(4).Х.PNG

    Режим работы вентиляторов(время включения-выключения) не предлагаю, надеюсь сами выберете!
    Последний раз редактировалось Сергей0308; 18.09.2026 в 10:36.
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  5. #5

    По умолчанию

    Может так удобнее:

    function_block ClockWeek_HM_Safe

    var_input
    Hour_On : udint; // Час включения (0...23)
    Min_On : udint; // Минута включения (0...59)

    Hour_Off : udint; // Час выключения (0...23)
    Min_Off : udint; // Минута выключения (0...59)

    // Отдельные входы для каждого дня недели
    Mo: bool; // 1 - Понедельник
    Tu: bool; // 2 - Вторник
    We: bool; // 3 - Среда
    Th: bool; // 4 - Четверг
    Fr: bool; // 5 - Пятница
    Sa: bool; // 6 - Суббота
    Su: bool; // 7 - Воскресенье

    Enable: bool; // Разрешение на работу
    end_var

    var_output
    Q : bool; // Выход управления оборудованием
    ConfigError : bool; // Флаг ошибки: не выбрано ни одного дня недели!
    end_var

    var
    cur: udint;
    day: udint;
    weekday : udint;
    mask : udint; // Внутренняя маска, собранная из входов

    Tm_On : udint; // Рассчитанное время включения в секундах от начала суток
    Tm_Off : udint; // Рассчитанное время выключения в секундах от начала суток
    end_var

    if Enable then
    // 1. Собираем маску из индивидуальных входов BOOL
    mask := 0;
    mask.0 := Mo;
    mask.1 := Tu;
    mask.2 := We;
    mask.3 := Th;
    mask.4 := Fr;
    mask.5 := Sa;
    mask.6 := Su;

    // 2. ЖЕСТКИЙ ДОПУСКОВЫЙ КОНТРОЛЬ НАСТРОЕК
    if mask = 0 then
    ConfigError := true; // Выставляем флаг аварии конфигурации
    Q := false; // Жестко блокируем выход в безопасное состояние!
    RETURN; // Мгновенно прерываем выполнение блока
    else
    ConfigError := false; // Настройки корректны
    end_if;

    // 3. Переводим Часы и Минуты во внутренние секунды суток
    Tm_On := (Hour_On * 3600) + (Min_On * 60);
    Tm_Off := (Hour_Off * 3600) + (Min_Off * 60);

    // Предотвращаем выход за рамки суток (максимум 86399 секунд)
    if Tm_On >= 86400 then Tm_On := 86399; end_if;
    if Tm_Off >= 86400 then Tm_Off := 86399; end_if;

    // 4. Получаем текущее системное время ПЛК
    cur := dt_to_udint(get_date_time()); // Текущий UnixTime от 01.01.2000
    weekday := (cur / 86400 + 5) mod 7; // День недели (0 = Пн, ... 6 = Вс)
    cur := cur mod 86400; // Текущая секунда внутри текущих суток

    // 5. Логика сравнения времени с учетом дней недели
    if Tm_On < Tm_Off then
    // --- Работа внутри одних суток ---
    day := shr(mask, weekday); // Сдвигаем: текущий день встает в нулевой бит
    Q := (cur >= Tm_On) and (cur < Tm_Off) and day.0;
    else
    // --- Работа с переходом через полночь ---

    // Дублируем понедельник (бит 0) в 7-й бит для перехода Вс -> Пн
    if mask.0 then mask.7 := true; else mask.7 := false; end_if;

    day := shr(mask, weekday);
    // day.1 отвечает за ТЕКУЩИЙ день (так как время >= Tm_On)
    // day.0 отвечает за ВЧЕРАШНИЙ день (так как время < Tm_Off, дорабатываем ночную смену)

    Q := (cur >= Tm_On and day.1) or (cur < Tm_Off and day.0);
    end_if
    else
    Q := false;
    ConfigError := false;
    end_if

    end_function_block

Похожие темы

  1. Отсутствуют таймеры CLOCK и CLOCKWEEK
    от rudnik85 в разделе Среда программирования OWEN Logic
    Ответов: 3
    Последнее сообщение: 27.07.2025, 20:58
  2. Ответов: 8
    Последнее сообщение: 22.05.2025, 09:47
  3. макрос для пр 200
    от pt100 в разделе Программируемые реле
    Ответов: 2
    Последнее сообщение: 11.02.2019, 18:06
  4. макрос LT
    от niklud19511 в разделе Среда программирования OWEN Logic
    Ответов: 3
    Последнее сообщение: 08.07.2018, 05:12
  5. Макрос
    от CEkip в разделе Программируемые реле
    Ответов: 11
    Последнее сообщение: 13.04.2012, 20:54

Метки этой темы

Ваши права

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