Вы можете вместо блока 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