Спасибо!!!
Вид для печати
Спасибо!!!
Yegor действительно умножать часы на 100 вместо привычных 60 оригинально, получаем как бы привычный вид времени в программе.
Валенок да, очень неудобно в SisLibTime с Воскресеньем, надо оскатовскую проверить, может там лучше будет, пока не смотрел. LimitAlarm тоже смотрел, отлично подходит когда интервал один, уже готовое решение.
amn спасибо, тоже гляну. В вашем примере явно лажа, сравнивать секунды с секундами нет смысла, когда о них и речи нет.
melky, там вроде минуты, а не секунды.
Чесно говоря чуток шутил ))))
Отличное.. Вы же нормально воспримите диапазон типа 23-00 .. 1-00. А оно ? Лучше уж заточите свою функцию например под TOD. Не менее наглядно.
Когда один.. Ну массив с циклом прилепить
Воскресенье .. Уйти на маски
Например:
Код:program clock
var
std : systemtimedate;
now : tod;
..//получили время в std
now := dword_to_tod( ((std.hour*dword#60+std.minute)*60+std.second)*1000 );
fb period
var_input
t0,t1:tod;
maskweek:byte; //маска с очеловеченым видом типа 2#11111_00 для пн..вск
var_output
q : bool;
var_const
w : array[0..6] of byte := 1,64,32,16,8,4,2;
q := (w[clock.std.dayofweek] and maskweek) <> 0;
q := q and sel(t0 >= t1, clock.now >= t0 and clock.now =< t1, clock.now >= t0 or clock.now =< t1);
plc_prg (?)
const
N : word := ..
var
ok : bool;
is : array[1..N] of period :=
(t0 := tod#6:30, t1 := tod#8:30, maskweek := 2#11111_00),
(t0 := tod#18:30, t1 := tod#23:59:59, maskweek := 2#11111_00);
clock();
ok := false;
for i:=1 to N do
is[i](q=>ok);
if ok then exit; end_if
end_for
..
PS
Пардон. Переводить в CFC - не очень хочется
Валенок а для меня ST полутемный лес :) тут в нескольких строчках разбираться и разбираться.
amn out := datetime.Second >= after AND datetime.Second < before; - ну и где тут минуты ? да и сам по себе FB странно работает, но это мне надо с нуля его вписать в ПЛК, чтобы понять...
melky, вы правы, я не тот файл отправил. Исправляюсь.
amn , значит я правильно сообразил, как ваш FB модернизировать :), жалко только, что без контроллера нельзя проверить. Но самое интересное, что фактически это работает точно так же, как и LIMITALARM, только все обработки со временем внутри FB. Хотя может оно и лучше.
Вариант Валенка мне менее понятен, разбираться надо, не все мне там доступно для понимания с наскока.
Вообще-то это творение Егора, а я его применил к вашему случаю. Валенок вообще молодец, додумался, как облегчить ввод данных. Там сложного ничего нет для понимания, просто часы он выделил в целую часть, а минуты в дробную. Выкладываю версию с идеей Валенка.
Вложение 12751
amn у CodeSys действуют правила математики ?
Часы + Минуты / 100.0 или (часы + Минуты)/100.0 - что из этого правильно ? или все выполняется строго последовательно ?
А вообще с точки зрения программирования, если ставить два и более FB interval, на сколько увеличивается цикл программы, учитывая, что постоянно вызывается CurTimeEx ? в некоторой степени выглядит все красиво, но куча повторов.
Правила математики дейстуют как это и положено. А вот по поводу нескольких вызовов ФБ вы правы, стоит вынести CurTimeEx в самостоятельный отдельный блок, так как два блока могут не заработать вместе. Тогда наш ФБ будет состоять из 1 строчки:).
Во вложении два блока один из них get_time нужен для второго. Его просто вставить и ничего к нему подключать не надо.