CTUD

Auf-/Abwärtszähler

Mit dem Funktionsbaustein CTUD (count up/down) können Sie Zählvorgänge (auf- und abwärts) programmieren.

  • Aufwärtszählen (CU auf TRUE gesetzt)

    Der Zähler zählt von null bis zum Maximalwert 32767 aufwärts. Bei jeder steigenden Flanke an CU wird der aktuelle Wert CV (current value) um 1 erhöht.

  • Abwärtszählen (CD auf TRUE gesetzt)

    Der Zähler zählt von null bis zum Minimalwert -32768 abwärts. Bei jeder steigenden Flanke an CD wird der aktuelle Wert CV (current value) um 1 verringert.

Parameter

Eingang

CU (BOOL)

Aufwärtszähler

bei jeder steigenden Flanke an CU wird der Wert 1 zum aktuellen CV addiert, außer R und/oder LD ist/sind gesetzt

CD (BOOL)

Abwärtszähler

bei jeder steigenden Flanke an CD wird der Wert 1 vom aktuellen Wert in CV abgezogen, außer R und/oder LD ist/sind gesetzt

Wenn CU und CD gleichzeitig auf TRUE gesetzt sind, wird kein Zählvorgang durchgeführt.

R (BOOL)

Zurücksetzen

Bei jeder steigenden Flanke an R wird CV auf null zurückgesetzt und der Zählvorgang beendet. Der Ausgang QU/QD wird auf FALSE gesetzt.

Bei der nächsten fallenden Flanke an R wird der Zählvorgang neu gestartet.

LD (BOOL)

Lade Akkumulator

wenn LD gesetzt ist, wird PV in CV geladen und QU auf TRUE gesetzt. Das gilt nicht, wenn R gleichzeitig gesetzt wird. In diesem Fall wird LD ignoriert.

PV (INT)

Sollwert

enthält den Sollwert, der bei der Addition bzw. Subtraktion erreicht werden soll.

Wenn kein Sollwert eingestellt oder der Sollwert null ist, wird der Ausgang QU unmittelbar nach dem Start des Zählvorgangs auf TRUE gesetzt.

Ausgang

QU (BOOL)

Signalausgang - Aufwärtszähler

wird auf TRUE gesetzt, wenn CV größer/gleich PV

wird auf FALSE gesetzt, wenn eine steigende Flanke an R anliegt

QD (BOOL)

Signalausgang - Abwärtszähler

wird auf TRUE gesetzt, wenn CV = Null

wird auf FALSE gesetzt, wenn eine steigende Flanke an R anliegt

CV (INT)

Aktueller Wert

  • ist das Additions-/Subtraktionsergebnis

  • Aufwärtszählen:

    Wenn CV den Sollwert PV erreicht, wird der Ausgang QU auf TRUE gesetzt, der Zähler zählt jedoch weiter, bis der obere Grenzwert von 32767 erreicht ist.

  • Abwärtszählen:

    Wenn CV den Wert null erreicht, wird der Ausgang QD auf TRUE gesetzt, der Zähler zählt jedoch weiter, bis der untere Grenzwert von -32768 erreicht ist.

  • Der Wert kann während des Zählens geändert werden, indem aus dem Programmiereditor heraus in die Variable geschrieben wird.

Zeitdiagramm

Beispiel

POE-Kopf

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
		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

POE-Rumpf

Aufwärtszählen:

Wenn bReset gesetzt ist, wird iCurrentValue (CV) zurückgesetzt. Wenn bCountUp gesetzt ist, wird der Wert 1 zu iCurrentValue addiert. Dieser Vorgang wird bei jeder steigenden Flanke an bCountUp so oft wiederholt, bis iCurrentValue größer/gleich iPresetValue ist. Dann wird bUpCounting_PV_reached gesetzt. Der Vorgang wird nicht durchgeführt, wenn bReset und/oder bLoad gesetzt ist/sind.

Abwärtszählen:

Wenn bReset gesetzt ist (status = TRUE), wird iPresetValue (PV = preset value) in iCurrentValue geladen. Wenn bCountDown gesetzt ist, wird der Wert 1 von iPresetValue subtrahiert. Dieser Vorgang wird bei jeder steigenden Flanke so oft wiederholt, bis iCurrentValue kleiner/gleich Null ist. Dann wird bDownCounting_zero_reached auf TRUE gesetzt. Wenn bReset und/oder bLoad gesetzt ist/sind, wird kein Zählvorgang durchgeführt. Wenn CU und CD gleichzeitig gesetzt sind, wird kein Zählvorgang durchgeführt.

KOP-Rumpf

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

ST-Rumpf

CTUD1(CU := bCountUp, CD := bCountDown, R := bReset, LD := bLoad, 
	  PV := iPresetValue, QU => bUpCounting_PV_reached,
	  QD => bDownCounting_zero_reached, CV => iCurrentValue);

AWL-Rumpf

Letzte Änderung am: 2021-09-27Feedback zu dieser SeitePanasonic Hotline