Contador ascendente/descendente
El bloque de función CTUD (contador ascendente/descendente) permite programar procesos de contaje.
Contador ascendente (CU está a TRUE)
El contador comienza en cero hasta que se alcanza el valor máximo 32767. Cada flanco de subida en el contador ascendente CU aumenta el valor actual CV en 1.
Contador descendente (CD está a TRUE)
El contador comienza en cero hasta que se alcanza el valor mínimo -32768. Cada flanco de subida en el contador descendente CD reduce el valor actual CV en 1.
Entrada
contador ascendente
En cada flanco de subida de CV, aumenta en 1 el valor de CU, excepto si se activa las entradas R y/o LD.
contador descendente
En cada flanco de subida de CD, se resta 1 del valor de CV, excepto si se activa R y/o LD.
Si CU y CD pasa a TRUE al mismo tiempo, no se realiza ninguna operación de contaje.
Reset
CV se pone a cero en cada flanco de subida de R y el contaje se detiene. La salida QU/QD pasa a FALSE.
El siguiente flanco descendente de R reinicia el contaje.
Carga en el acumulador
si se activa LD, el valor de PV se copia en CV y QU pasa a TRUE. No obstante, esto no se aplica si R se activa simultáneamente. En este caso, se ignorará LD.
Valor de preselección
define el valor de preselección en el caso de incrementar o el valor inicial si se produce el decremento
Si no se establece ningún valor de preselección o si el valor de preselección es cero, la salida QU pasa a TRUE inmediatamente después de iniciarse el contaje.
Salida
señal de salida - contaje ascendente
pasa a TRUE si el valor de CV es mayor o igual que PV
pasa a FALSE cuando se detecta el flanco de subida en R.
señal de salida - contaje descendente
pasa a TRUE si CV = cero
pasa a FALSE cuando se detecta el flanco de subida en R.
Valor actual
es el resultado de la suma/resta
contaje ascendente:
Si CV alcanza el valor de preselección PV, la salida QU pasa a TRUE, pero el contaje continúa hasta que se alcanza el límite máximo de 32767.
contaje descendente:
Si CV llega a cero, la salida QD pasa a TRUE, pero el contaje continúa hasta que se alcanza el límite mínimo de -32768.
El valor se puede cambiar durante la operación de contaje escribiendo en la variable desde el editor de programación.
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU. Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.
VAR
CTUD1: CTUD;
bCountUp: BOOL:=FALSE;
(*increments CV if TRUE*)
bCountDown: BOOL:=FALSE;
(*decrements CV if TRUE*)
bReset: BOOL:=FALSE;
(*sets CV to zero if TRUE*)
bLoad: BOOL:=FALSE;
(*sets CV to PV if TRUE*)
iPresetValue: INT:=3;
(*if CV reaches this value,
output QU is set*)
bUpCounting_PV_reached: BOOL:=FALSE;
(*is set, if CV reaches PV*)
bDownCounting_zero_reached: BOOL:=FALSE;
(*is set, if CV reaches zero*)
iCurrentValue: INT:=0;
(*contains the current value*)
END_VAR
Contador ascendente:
Si bReset está a ON (estado = TRUE), se reseteará el valor actual de contaje iCurrentValue (CV). Si se activa bCountUp, se incrementa en 1 el valor de iCurrentValue. Este procedimiento se repite en cada flanco de subida de bCountUp hasta que el valor de iCurrentValue sea mayor o igual que iPresetValue. Después bUpCounting_PV_reached pasa a TRUE. El procedimiento no se lleva a cabo, si bReset y/o bLoad están activados.
Contador descendente:
Si se activa bReset (estado = TRUE), se carga en iCurrentValue (CV), el valor de iPresetValue (PV). Si se activa bCountDown, se resta 1 del valor de iPresetValue. Este procedimiento se repite en cada flanco de subida hasta que el valor de iCurrentValue sea minor o igual a cero Después bDownCounting_zero_reached pasa a TRUE. El procedimiento no se lleva a cabo, si bReset y/o bLoad están activados. Si se activan CU y CD al mismo tiempo, no se realiza ninguna operación de contaje.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 14 ;
NETWORK_BODY
B(B_CONTACT,,bCountUp,5,3,7,5,);
B(B_CONTACT,,bCountDown,5,5,7,7,);
B(B_FB,CTUD!,CTUD1,12,4,18,11,,?BCU?BCD?BR?BLD?BPV?AQU?AQD?ACV);
B(B_COIL,,bUpCounting_PV_reached,25,5,27,7,);
B(B_CONTACT,,bReset,5,7,7,9,);
B(B_COIL,,bDownCounting_zero_reached,25,8,27,10,);
B(B_CONTACT,,bLoad,5,9,7,11,);
B(B_VAROUT,,iCurrentValue,20,10,22,12,);
B(B_VARIN,,iPresetValue,7,11,9,13,);
L(1,0,1,14);
L(1,4,5,4);
L(7,4,10,4);
L(10,4,10,6);
L(1,6,5,6);
L(7,6,9,6);
L(10,6,12,6);
L(18,6,25,6);
L(9,6,9,7);
L(9,7,12,7);
L(18,7,20,7);
L(20,7,20,9);
L(1,8,5,8);
L(7,8,12,8);
L(18,8,19,8);
L(19,8,19,11);
L(9,9,12,9);
L(20,9,25,9);
L(9,9,9,10);
L(1,10,5,10);
L(7,10,9,10);
L(10,10,12,10);
L(10,10,10,12);
L(19,11,20,11);
L(9,12,10,12);
END_NETWORK_BODY
END_NET_WORK
END_BODY
CTUD1(CU := bCountUp, CD := bCountDown, R := bReset, LD := bLoad,
PV := iPresetValue, QU => bUpCounting_PV_reached,
QD => bDownCounting_zero_reached, CV => iCurrentValue);