Ну вот в теме блок на 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