Счетчики
Счетчики используются для подсчета событий.
CTU — Инкрементный счетчик
Увеличивает значение счетчика при каждом переднем фронте на входе CU.
Входные параметры:
CU(BOOL) — вход увеличения (реагирует на передний фронт)RESET(BOOL) — сброс счетчика в 0PV(WORD) — предельное значение
Выходные параметры:
Q(BOOL) — TRUE, когдаCV >= PVCV(WORD) — текущее значение счетчика
Описание работы:
Блок CTU увеличивает внутреннее значение счетчика на 1 при каждом обнаружении переднего фронта на входе CU. Если вход RESET активен (TRUE), счетчик сбрасывается в 0. Выход Q становится TRUE, когда текущее значение счетчика достигает или превышает предельное значение PV. При этом счетчик продолжает увеличиваться, и Q остается TRUE.
Пример использования:
PROGRAM Example
VAR
ctu1 : CTU;
count_up : BOOL;
reset_count : BOOL;
counter_value : WORD;
reached_limit : BOOL;
END_VAR
ctu1(CU := count_up, RESET := reset_count, PV := 10);
counter_value := ctu1.CV;
reached_limit := ctu1.Q;
END_PROGRAM
|
Внутренняя реализация:
Исходный код блока:
FUNCTION_BLOCK CTU
VAR_INPUT
CU : BOOL;
RESET : BOOL;
PV : WORD;
END_VAR
VAR_OUTPUT
Q : BOOL;
CV : WORD;
END_VAR
VAR
rt : R_TRIG;
V : WORD;
END_VAR
rt(CLK := CU);
IF RESET THEN
V := 0;
ELSE
IF rt.Q THEN
V := V + 1;
END_IF;
END_IF;
Q := V >= PV;
CV := V;
END_FUNCTION_BLOCK
|
CTD — Декрементный счетчик
Уменьшает значение счетчика при каждом переднем фронте на входе CD.
Входные параметры:
CD(BOOL) — вход уменьшения (реагирует на передний фронт)LOAD(BOOL) — загрузка начального значения из PVPV(WORD) — начальное значение
Выходные параметры:
Q(BOOL) — TRUE, когдаCV = 0CV(WORD) — текущее значение счетчика
Описание работы:
Блок CTD уменьшает внутреннее значение счетчика на 1 при каждом обнаружении переднего фронта на входе CD, но только если текущее значение больше 0. Если вход LOAD активен (TRUE), в счетчик загружается начальное значение из PV. Выход Q становится TRUE, когда текущее значение счетчика равно 0. При достижении 0 дальнейшее уменьшение не происходит.
Пример использования:
PROGRAM Example
VAR
ctd1 : CTD;
count_down : BOOL;
load_count : BOOL;
counter_value : WORD;
reached_zero : BOOL;
END_VAR
ctd1(CD := count_down, LOAD := load_count, PV := 10);
counter_value := ctd1.CV;
reached_zero := ctd1.Q;
END_PROGRAM
|
Внутренняя реализация:
Исходный код блока:
FUNCTION_BLOCK CTD
VAR_INPUT
CD : BOOL;
LOAD : BOOL;
PV : WORD;
END_VAR
VAR_OUTPUT
Q : BOOL;
CV : WORD;
END_VAR
VAR
rt : R_TRIG;
V : WORD;
END_VAR
rt(CLK := CD);
IF LOAD THEN
V := PV;
ELSE
IF rt.Q AND V > 0 THEN
V := V - 1;
END_IF;
END_IF;
Q := V = 0;
CV := V;
END_FUNCTION_BLOCK
|
CTUD — Реверсивный счетчик
Может увеличивать и уменьшать значение счетчика.
Входные параметры:
CU(BOOL) — вход увеличения (реагирует на передний фронт)CD(BOOL) — вход уменьшения (реагирует на передний фронт)RESET(BOOL) — сброс счетчика в 0LOAD(BOOL) — загрузка начального значения из PVPV(WORD) — начальное значение / предельное значение
Выходные параметры:
QU(BOOL) — TRUE, когдаCV >= PVQD(BOOL) — TRUE, когдаCV = 0CV(WORD) — текущее значение счетчика
Описание работы:
Блок CTUD объединяет функции инкрементного и декрементного счетчиков. При каждом переднем фронте на входе CU значение увеличивается на 1. При каждом переднем фронте на входе CD значение уменьшается на 1 (если V > 0). Вход LOAD загружает начальное значение из PV. Вход RESET имеет приоритет над LOAD и сбрасывает счетчик в 0. Выход QU становится TRUE, когда CV >= PV. Выход QD становится TRUE, когда CV = 0.
Пример использования:
PROGRAM Example
VAR
ctud1 : CTUD;
count_up : BOOL;
count_down : BOOL;
reset_count : BOOL;
load_count : BOOL;
counter_value : WORD;
up_reached : BOOL;
down_reached : BOOL;
END_VAR
ctud1(CU := count_up, CD := count_down,
RESET := reset_count, LOAD := load_count,
PV := 10);
counter_value := ctud1.CV;
up_reached := ctud1.QU;
down_reached := ctud1.QD;
END_PROGRAM
|
Внутренняя реализация:
Исходный код блока:
FUNCTION_BLOCK CTUD
VAR_INPUT
CU : BOOL;
CD : BOOL;
RESET : BOOL;
LOAD : BOOL;
PV : WORD;
END_VAR
VAR_OUTPUT
QU : BOOL;
QD : BOOL;
CV : WORD;
END_VAR
VAR
rt_UP : R_TRIG;
rt_DOWN : R_TRIG;
V : WORD;
END_VAR
rt_UP(CLK := CU);
rt_DOWN(CLK := CD);
IF LOAD THEN
V := PV;
ELSE
IF rt_DOWN.Q AND V > 0 THEN
V := V - 1;
END_IF;
END_IF;
IF RESET THEN
V := 0;
ELSE
IF rt_UP.Q THEN
V := V + 1;
END_IF;
END_IF;
QU := V >= PV;
QD := V = 0;
CV := V;
END_FUNCTION_BLOCK
|
См. также
Встроенные типы данных - для информации о числовых типах данных.
Обнаружение фронтов - для детекторов фронтов.