Просмотр полной версии : Таймеры
Здравствуйте.
Не пойму, почему так таймеры работают? Хочу померить время между началом и концом процесса.
Пишу:
TIMEdoz: TON;
d: TIME;
IF Knopka= TRUE THEN
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s);
END_IF
IF Datchik = TRUE THEN
d:=TIMEdoz.ET;
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
После нажатия на кнопку и концом процесса первый раз d = 0; второй раз - d = первому времени процесса...
Если добавить перед d:=TIMEdoz.ET еще раз TIMEdoz(IN:=TRUE,PT:=t#100s) , то всё считает. Но так ведь не правильно?
spectrum48k
03.10.2015, 11:04
http://www.owen.ru/forum/showthread.php?t=21977
вот хорошая тема с примерами
spectrum48k:
В той теме не нашел ответа на мой вопрос. Почему TIMEdoz.ET обновляется только при повторном TIMEdoz(IN:=TRUE,PT:=t#100s)?
spectrum48k
03.10.2015, 12:30
TIMEdoz(IN:=TRUE,PT:=t#100s); - чтобы считал должен вызываться не только при нажатии кнопки. Таймер необходимо вызывать, чтобы он обновлял время ET.
Не знаю какая именно у Вас задача, но навскидку это должно быть так?
TIMEdoz: TON;
d: TIME;
IF Knopka= TRUE THEN
OUT := TRUE;
END_IF
IF OUT = TRUE THEN
TIMEdoz(IN:=TRUE,PT:=t#100s);
END_IF
IF Datchik = TRUE THEN
d:=TIMEdoz.ET;
OUT := FALSE;
TIMEdoz(IN:=FALSE);
END_IF
spectrum48k:
В вашем коде добавляется дополнительная проверка условия и запуск таймера, которые будут выполняться на протяжении всего процесса. Неужели без этого нельзя обойтись? С точки зрения загрузки контроллера может лучше тогда добавить повторно строчку, как в первом посте написано. Но как то это коряво выглядит...
Здравствуйте.
Не пойму, почему так таймеры работают? Хочу померить время между началом и концом процесса.
Пишу:
TIMEdoz: TON;
d: TIME;
IF Knopka= TRUE THEN
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s);
END_IF
IF Datchik = TRUE THEN
d:=TIMEdoz.ET;
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
После нажатия на кнопку и концом процесса первый раз d = 0; второй раз - d = первому времени процесса...
Если добавить перед d:=TIMEdoz.ET еще раз TIMEdoz(IN:=TRUE,PT:=t#100s) , то всё считает. Но так ведь не правильно?
Можно перед d:=TIMEdoz.ET просто вызывать таймер без параметров вот так TIMEdoz();
Или даже так
TIMEdoz(ET=>d );
Тогда одна строчка (d:=TIMEdoz.ET) экономится, т.к. больше не нужна.
spectrum48k
03.10.2015, 13:39
spectrum48k:
В вашем коде добавляется дополнительная проверка условия и запуск таймера, которые будут выполняться на протяжении всего процесса. Неужели без этого нельзя обойтись? С точки зрения загрузки контроллера может лучше тогда добавить повторно строчку, как в первом посте написано. Но как то это коряво выглядит...
А куда "Спасибо" подевалось после редактирования? Вы, смотрю, очень грамотный специалист. Без моих советов разберетесь ))
Как вариант при первом вызове таймера сразу назначить ET=>d и обновлять таймер можно вне второго цикла, тогда даже видно изменение d в отладчике
IF Knopka THEN
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s,ET=>d);
END_IF
TIMEdoz();
IF Datchik THEN
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
Только для "Хочу померить время между началом и концом процесса" фиксировать конец процесса нужно с помощью детектора фронта R_TRIG, а так у Вас значение d появляются только на время одного цикла и в остольное время d=0
TIMEdoz: TON;
d: TIME;
R_TR1: R_TRIG;
IF Knopka THEN
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s,ET=>d);
END_IF
TIMEdoz();
R_TR1(CLK:=Datchik);
IF R_TR1.Q THEN
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
spectrum48k:
Не, я вообще не специалист )
Всем спасибо, за помощь! )
а так у Вас значение d появляются только на время одного цикла и в остольное время d=0
Почему на время одного цикла? Постоянно есть значение d.
В целом я понял, что повторно вызывать таймер наоборот необходимо. И такой вариант лучший получается?
TIMEdoz: TON;
d: TIME;
IF Knopka= TRUE THEN
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s);
END_IF
IF Datchik = TRUE THEN
TIMEdoz();
d:= TIMEdoz.ET;
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
Почему на время одного цикла? Постоянно есть значение d.
В целом я понял, что повторно вызывать таймер наоборот необходимо и такой вариант лучший получается?
TIMEdoz: TON;
d: TIME;
IF Knopka= TRUE THEN
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s, ET=>d);
END_IF
IF Datchik = TRUE THEN
TIMEdoz();
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
1. Не используйте IF Knopka= TRUE THEN или IF Datchik = TRUE THEN просто пишите IF Knopka THEN или IF Datchik THEN. Получается масло масляное или так называемый "индусский код".
2. Для "Хочу померить время между началом и концом процесса" можно таймер не использовать, а пользоваться функцией TIME()
VAR
d: TIME;
Datchik: BOOL;
OUT: BOOL;
Knopka: BOOL;
R_TR1: R_TRIG;
R_TR2: R_TRIG;
time_start: TIME;
END_VAR
R_TR1(CLK:=Knopka);
IF R_TR1.Q THEN
time_start:=TIME();
OUT := TRUE;
END_IF
R_TR2(CLK:=Datchik);
IF R_TR2.Q THEN
d:=TIME()-time_start;
OUT := FALSE;
END_IF
Подойде для измерения времени процесса до ~49 суток и если макс. время процесса заранее не известно.
ЗЫ. А на счет таймера, то перед анализом состояния таймера его всегда перед этим нужно вызывать.
А как правильно сделать в таком случае.
добавляется еще одна строка NEWVAR = OLDVAR +1; в первое условие:
TIMEdoz: TON;
d: TIME;
IF Knopka= TRUE THEN
NEWVAR = OLDVAR +1;
OUT := TRUE;
TIMEdoz(IN:=TRUE,PT:=t#100s);
END_IF
IF Datchik = TRUE THEN
TIMEdoz();
d:= TIMEdoz.ET;
OUT := FALSE;
TIMEdoz.IN := FALSE;
END_IF
NEWVAR, OLDVAR:REAL - это переменные, получаемые при опросе модулей ввода. И пока в модуле не обновится NEWVAR нельзя запускать процесс OUT. То есть нужна задержка между вычислением NEWVAR и запуском OUT 1 секунда, например.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot