Abwärtszähler
Mit dem Funktionsbaustein CTD (count down) können Sie Zählvorgänge programmieren.
Eingang
Abwärtszähler
bei jeder steigenden Flanke an CD wird der Wert 1 vom aktuellen Wert in CV abgezogen, außer LD ist gesetzt oder CV hat den Wert Null erreicht
Lade Akkumulator
mit LD wird der Zählerstand auf PV zurückgesetzt
Sollwert
ist der Wert, von dem beim ersten Zählvorgang abgezogen wird
Ausgang
Signalausgang
wird gesetzt, wenn CV = Null
Aktueller Wert
enthält das aktuelle Subtraktionsergebnis (CV = current value)
Der Wert kann während des Zählens geändert werden, indem aus dem Programmiereditor heraus in die Variable geschrieben wird.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
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
Wenn set gesetzt ist (Status = TRUE), wird preset_value (PV) in den current_value (CV) geladen. Jedesmal, wenn an clock eine steigende Flanke anliegt, wird von current_value der Wert 1 abgezogen. Dieser Vorgang wird so oft wiederholt, bis current_value kleiner/gleich Null ist. Dann wird signal_output gesetzt.
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 *);
Wenn Sie den Funktionsbaustein in einer Anweisungsliste (AWL-Editor) aufrufen möchten, geben Sie folgendes ein: