Contador descendente
El bloque de función CTD (contador descendente) permite programar procesos de contaje.
Entrada
contador descendente
el valor de CV se decrementa en 1 en cada flanco de subida de CD, excepto si se activa LD o cuando CV llega a cero.
Carga en el acumulador
si LD pasa a ON, el valor actual se carga con el valor de PV
Valor de preselección
es el valor a partir del que se empieza a descontar en cada flanco del reloj
Salida
señal de salida
se activa si CV = cero
Valor actual
contiene el valor acumulado del contaje (CV = valor actual)
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
initialize_count: BOOL:=TRUE;
(*for setting the current value
to starting value*)
count: BOOL:=FALSE;
(*1 is subtracted from the current
value for each leading edge
detected at count*)
load: BOOL:=FALSE;
(*sets the curr_value back to
set_value, if TRUE*)
set_value: INT:=2;
(*the starting value*)
output_value: BOOL:=FALSE;
(*is set, if the current value is
zero*)
curr_value: INT:=0;
(*the current_value*)
ctd_1: CTD;
(*instance of the counter*)
END_VAR
Si se activa set (estado = TRUE), se carga en current_value (CV), el valor de preset_value (PV). En cada flanco de subida de clock se decrementa en 1 el valor de current_value. Este procedimiento se repite hasta que current_value llegue a cero. Después, signal_output pasará a TRUE.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_FB,CTD!,copy_name,8,2,13,7,,?BCD?BLD?BPV?AQ?ACV);
B(B_VARIN,,output_value,6,5,8,7,);
B(B_VAROUT,,current_value,13,4,15,6,);
B(B_CONTACT,,set,3,4,5,6,);
B(B_CONTACT,,clock,3,2,5,4,);
B(B_COIL,,signal_output,20,3,22,5,);
L(7,4,8,4);
L(1,5,3,5);
L(5,5,8,5);
L(1,3,3,3);
L(5,3,7,3);
L(7,3,7,4);
L(13,4,20,4);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF set THEN (* first cycle *)
load:=TRUE; (* load has to be TRUE,
to set current_value to output_value *)
clock:=FALSE;
END_IF;
copy_name(CD:= clock, LOAD:= set, PV:= output_value, Q=> signal_output, CV=> current_value);
load:=FALSE; (* now current_value got the right value, load doesn't need to be *)
(* TRUE any longer *);