PDA

Просмотр полной версии : Вопрос по таймеру



evgeni293
09.11.2016, 10:58
имеется регулятор в котором при сложении или вычитании установлена пауза в 1 с. Может ли переполниться таймер и как это избежать? Объект будет работать без перерывов.

Какие последствия будут в случае переполнения
и каким образом работает задержка в 1 с.


IF (TIMER+T#1S) TIMER:=TIME();
CHASTOTA_AUTO:=CHASTOTA_AUTO+1;

FUNCTION_BLOCK REGULIATOR
VAR_INPUT
REAL_DAVLENIE:REAL;
ON_OFF:BOOL;
USTAVKA_DAVLENIEL:REAL;
MIN_DAVLENIE:REAL;
MAX_DAVLENIE:REAL;
MIN_CHASTOTA:REAL;
MAX_CHASTOTA:REAL;
SBROS:BOOL;
END_VAR
VAR_OUTPUT
CHASTOTA_AUTO:REAL;
END_VAR
VAR
TIMER: TIME;
END_VAR

Сам код
IF ON_OFF=TRUE THEN
IF REAL_DAVLENIE>=USTAVKA_DAVLENIEL THEN
IF (TIMER+T#1S) TIMER:=TIME();
CHASTOTA_AUTO:=CHASTOTA_AUTO+1;
END_IF
ELSE IF REAL_DAVLENIE<=USTAVKA_DAVLENIEL THEN
IF (TIMER+T#1S) TIMER:=TIME();
CHASTOTA_AUTO:=CHASTOTA_AUTO-1;
END_IF
END_IF
END_IF
IF CHASTOTA_AUTO<=MIN_CHASTOTA THEN CHASTOTA_AUTO:=MIN_CHASTOTA;

END_IF
IF CHASTOTA_AUTO>=MAX_CHASTOTA THEN CHASTOTA_AUTO:=MAX_CHASTOTA;
END_IF

IF SBROS=TRUE THEN CHASTOTA_AUTO:=0;

END_IF
ELSE IF ON_OFF=FALSE THEN CHASTOTA_AUTO:=0;
END_IF
END_IF

Осинский Алексей
10.11.2016, 10:34
IF (TIMER+T#1S) TIMER:=TIME();
CHASTOTA_AUTO:=CHASTOTA_AUTO+1;


Дело в том, что эта конструкция не работоспособна в CODESYS.

По поводу переполнения:
Типа TIME хватит на 49 дней 17 часов 2 минут 47 секунд непрерывного подсчета.
Если нужно больше - используйте тип DATE_AND_TIME, его будет достаточно до 2106го года

Но если задача стоит: просто увеличивать что-либо раз в секунду, то решить задачу можно с применением таймера не боясь переполнения:


PROGRAM PLC_PRG
VAR
// Таймер для задержки
fb_tonIncreaseDelay : Standard.TON;
// Значение частоты
rAutoFrequency : REAL;
END_VAR

// Задержка между запуском таймера и срабатыванием
fb_tonIncreaseDelay.PT := T#1S;
// Запускаю отсчет
fb_tonIncreaseDelay.IN := TRUE;
fb_tonIncreaseDelay();
// Если таймер сработал
IF fb_tonIncreaseDelay.Q THEN
// Увеличиваю счетчик
rAutoFrequency := rAutoFrequency + 1;
// Сбрасываю таймер
fb_tonIncreaseDelay.IN := FALSE;
fb_tonIncreaseDelay();
END_IF

evgeni293
10.11.2016, 16:40
[QUOTE=Осинский Алексей;226774]Дело в том, что эта конструкция не работоспособна в CODESYS.

По поводу переполнения:
Типа TIME хватит на 49 дней 17 часов 2 минут 47 секунд непрерывного подсчета.
Если нужно больше - используйте тип DATE_AND_TIME, его будет достаточно до 2106го года


А каким образом она работает тогда? Пауза в вычислении выдерживается.

Осинский Алексей
11.11.2016, 10:40
А каким образом она работает тогда? Пауза в вычислении выдерживается.
Честно говоря не знаю. Пришлите, пожалуйста, проект для CODESYS в котором запись


IF (TIMER+T#1S) TIMER:=TIME();
CHASTOTA_AUTO:=CHASTOTA_AUTO+1;

работает, посмотрю как так получается.

На сколько я вижу в ней 2 ошибки:
не хватает THEN после IF
и условие (TIMER + T#1S) имеет тип TIME, а для работы условного оператора должно иметь тип BOOL
Например так:


IF (TIMER + T#1S) > 0 THEN
CHASTOTA_AUTO:=CHASTOTA_AUTO+1;
END_IF

evgeni293
11.11.2016, 12:20
вот проект