Вход

Просмотр полной версии : Таймеры



Атаман
03.10.2015, 10:58
Здравствуйте.

Не пойму, почему так таймеры работают? Хочу померить время между началом и концом процесса.
Пишу:

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
вот хорошая тема с примерами

Атаман
03.10.2015, 11:21
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

Атаман
03.10.2015, 12:43
spectrum48k:


В вашем коде добавляется дополнительная проверка условия и запуск таймера, которые будут выполняться на протяжении всего процесса. Неужели без этого нельзя обойтись? С точки зрения загрузки контроллера может лучше тогда добавить повторно строчку, как в первом посте написано. Но как то это коряво выглядит...

petera
03.10.2015, 13:33
Здравствуйте.

Не пойму, почему так таймеры работают? Хочу померить время между началом и концом процесса.
Пишу:

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:


В вашем коде добавляется дополнительная проверка условия и запуск таймера, которые будут выполняться на протяжении всего процесса. Неужели без этого нельзя обойтись? С точки зрения загрузки контроллера может лучше тогда добавить повторно строчку, как в первом посте написано. Но как то это коряво выглядит...

А куда "Спасибо" подевалось после редактирования? Вы, смотрю, очень грамотный специалист. Без моих советов разберетесь ))

petera
03.10.2015, 14:01
Как вариант при первом вызове таймера сразу назначить 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

petera
03.10.2015, 14:16
Только для "Хочу померить время между началом и концом процесса" фиксировать конец процесса нужно с помощью детектора фронта 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

Атаман
03.10.2015, 14:20
spectrum48k:
Не, я вообще не специалист )

Всем спасибо, за помощь! )

Атаман
03.10.2015, 14:23
а так у Вас значение 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

petera
03.10.2015, 14:40
Почему на время одного цикла? Постоянно есть значение 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 суток и если макс. время процесса заранее не известно.

ЗЫ. А на счет таймера, то перед анализом состояния таймера его всегда перед этим нужно вызывать.

Атаман
03.10.2015, 14:52
А как правильно сделать в таком случае.

добавляется еще одна строка 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 секунда, например.