PDA

Просмотр полной версии : Макрос Clockweek.



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

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

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

Dimensy
18.09.2026, 08:50
Вы можете вместо блока CLOCK WEEK из библиотеки для ПРок предыдущей линейки, воспользоваться одноименным блоком на ST
https://docs.owen.ru/product/programmnoe_obespechenie_owen_logic/986/122456#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

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

Так я 100 раз выкладывал командоаппарат реального времени, он 8-и канальный, один канал будет в запасе:

90393

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

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

90394

Режим работы вентиляторов(время включения-выключения) не предлагаю, надеюсь сами выберете!

Рогов Алексей
18.09.2026, 09:57
Может так удобнее:

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