Ну вот в теме блок на ST и есть, который работает строго по start и начинает сначала.
Вид для печати
Ну вот в теме блок на ST и есть, который работает строго по start и начинает сначала.
Мне интересно моя реализация блинка имеет право на жизнь или нет? Может я что то не учел? Может есть более тонкая реализация которую я пока не способен осознать с моим уровнем знаний?
http://www.owen.ru/forum/showthread....l=1#post225593
я не силен в ST, но ваш вариант работает так же как в других ПО, то есть при start = true начинается новый отсчет...
Ну да. при старт = 0 . возвращается состояние исходное. при повторном все сначала
Хотя вот заметил если вызывать мой блинк в каком нибудь if или case то отсчет начинается с начала но таймер не останавливается хотя выход у него при страт =0 возвращается в исходное состояние и последующий вызов не вызывает проблем.
если вызов в основном цикле плк как в приложении то таймер останавливается...
Ну это я так понимаю потому что Starttime таймера останавливается
В общем почитал, посмотрел как таймеры устроены, немного напрягся и родил таймер. Проще брать значения времени отсчёта таймера и суммировать с тем ,что было. Запоминаем сколько времени осталось отсчитать и сколько прошло, если таймер не досчитал до конца просто суммируем отработанное время. Можно как вариант привязывать к внутреннему времени, это если брать исходник таймера. А писать таймеры на основе цикла не имеет смысла т.к. неплохо так накапливается ошибка.
R_TRIG1(CLK:=on AND TIME_TO_DWORD(TIME())MOD 1000>500);
IF on AND time_in<>sec AND NOT pause THEN
sec:=sec + BOOL_TO_DWORD(R_TRIG1.Q);
ELSIF on AND time_in<>sec AND pause THEN
sec:=sec;
ELSIF on AND time_in=sec AND NOT pause THEN
sec:=0;
END_IF;
а так не пойдет?
sec:=sec + BOOL_TO_DWORD(R_TRIG1.Q) ,что значит сиё дествие? не понимаю как двойное слово и секунды дружаться:rolleyes:
Dword выбран из за верхнего предела можно DINT поставить sec тоже Dword
вот еще один из вариантов таймера
И я свои пять копеек вставлю
Ранее делал простой как грабли TON - дополнен только входом паузы
Вложение 37942Код:FUNCTION_BLOCK TON_P
VAR_INPUT
IN: BOOL; (*Старт*)
P: BOOL; (*Пауза*)
PT: TIME; (*Уставка времени*)
END_VAR
VAR_OUTPUT
Q: BOOL;
ET: TIME; (*Время работы таймера*)
END_VAR
VAR
clk: BOOL;
StartTime: TIME;
tx: TIME;
END_VAR
x:= TIME();
IF P THEN
StartTime:= tx - ET;
END_IF
IF IN AND NOT clk THEN
StartTime:= tx;
clk:= TRUE;
ELSIF NOT IN THEN
clk:= FALSE;
Q:= FALSE;
ET:= t#0s;
END_IF
IF clk AND NOT Q THEN
ET:= MIN(PT, tx - StartTime);
Q:= ET = PT AND IN;
END_IF
Подниму тему, у кого нибудь остался файл таймера TON с паузой на языке CFC?
Разобрался, спасибо petera :)