Die Zähler | ||||
Zähloperationen werden für verschiedene Belange in der Steuerungstechnik gebraucht, z.B. zum Erfassen von Stückzahlen oder Impulsen. In der Siemens SPS-Familie gibt es zwei Arten von Zähler (englisch Counter): Die S7-Zähler, auch Simatic-Zähler genannt und IEC-Counter. Beide Arten sind sowohl in den (alten) S7-300/400 Steuerungen als auch in den neuen S7-1500er programmierbar. In den S7-1200er CPUs sind hingegen nur IEC-Counter programmierbar. S7-Zähler sind in der CPU-Firmware eingebettet und in der Menge begrenzt. Je nach CPU ist die Anzahl an verfügbaren Zählern unterschiedlich. Dagegen ist die Anzahl an IEC-Counter nur durch die Speichergröße der SPS begrenzt. S7-Zähler haben einen stark eingeschränkten Zählbereich (0 - 999), während der Bereich des IEC-Counter wesentlich größer ist. (z.B. bei Datentyp Integer (INT) -32.768 bis +32.767). IEC-Zähler sind in der Firmware der CPU eingebettete System-Funktionsbausteine (SFB). Der Aufruf des IEC-Zählers erfolgt als Instanz.
Zähler-Arten | ||||
S7-Zähler | ||||
S7-Zähler werden über eine Nummer absolut adressiert. Durch diese Nummernabhängigkeit sind Programmbausteine mit S7-Zähler nicht mehrfach verwendbar.
Der Zählbereich ist auf 0 - 999 begrenzt. Die Ausgabe des aktuellen Zählwertes erfolgt im BCD-Code und Hexadezimal, die Statusausgabe Q des Zählers als Bool.
15 | Bit | 8 | 7 | Bit | 0 | ||||||||||
x | x | x | x | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
nicht | 1 | 4 | 3 | ||||||||||||
relevant | Zählwert im BCD-Format |
15 | Bit | 8 | 7 | Bit | 0 | ||||||||||
x | x | x | x | x | x | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
nicht | 143 | ||||||||||||||
relevant | Zählwert im HEX-Format |
Die Eingabe des Zählwertes (ZW) erfolgt im Word-Format (C#0 bis C#999). Für die Zähleingänge ZV (Vorwärts) und ZR (Rückwärts) sollten immer exakte Signale, z.B. mit positiver Flankenauswertung angewendet werden.
IEC-Zähler | ||||
Die IEC-Zähler verfügen gegenüber den S7-Zählern über eine bessere Performance und einem wesentlich größeren Zählbereich. IEC-Zähler werden in dem Programmbaustein, in dem sie aufgerufen bzw. gebraucht werden deklariert. Jeder Zähler braucht eine Datenbausteinstruktur um die Daten zu speichern. Wird ein IEC-Zähler programmiert, erstellt Step 7 bzw. TIA-Portal automatisch den für den Zähler erforderlichen Instanz-DB.
Die Eingabe des Zählwertes (PV) erfolgt mit 16-Bit-Ganzzahlen im Datenformat Integer. Für die Zähleingänge CU (count up) Vorwärts und CD (count down) Rückwärts sollten immer exakte Signale, z.B. mit positiver Flankenauswertung angewendet werden.
Das Datenformat Integer für den Zählwert PV ist für alle Steuerungen der S7-Familie gültig. Bei den neuen 1200/1500er-CPUs können aber noch weitere Datenformate, z.B. 32-Bit-Ganzzahlen Double Integer (Dint) oder Unsingned Double Integer (UDint) frei gewählt werden.
Int | -32.768 bis +32.767 |
Uint | 0 bis 65535 |
Dint | -2147483648 bis +2147483647 |
UDint | 0 bis 4294967295 |
S7-Zähler | ||||
Parameter | ||||
Parameter: | <Zähler_nr> * |
Deklaration: | Ein/Aus |
Datentyp: | Counter |
Funktion: | Zähler der Anweisung |
Parameter: | DUAL |
Deklaration: | Ausgang |
Datentyp: | Word,S5Time/Date |
Funktion: | Aktueller Zählwert * |
Parameter: | DEZ |
Deklaration: | Ausgang |
Datentyp: | Word,S5Time/Date |
Funktion: | Aktueller Zählwert * |
Parameter: | Q |
Deklaration: | Ausgang |
Datentyp: | BOOL |
Funktion: | Status des Zählers |
Parameter: | ZW |
Deklaration: | Eingang |
Datentyp: | Word |
Funktion: | Einstellung Zählwert * |
Parameter: | S |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Zähler voreinstellen |
Parameter: | R |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Zähler rücksetzen |
Parameter: | ZV |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Vorwärtszähleingang |
Parameter: | ZR |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Rückwärtszähleingang |
Vorwärtszähler | ||||
Wenn der Signalzustand am Eingang S von „0“ auf „1“ wechselt, wird der Zählwert auf den Wert von Parameter ZW gesetzt. Ändert sich der Signalzustand am Zähleingang ZV von „0“ auf „1“ (positive Signalflanke), wird der aktuelle Zählwert um den Faktor eins erhöht. An den Ausgängen DUAL und DEZ wird der aktuelle Zählwert hexadezimal bzw. BCD-codiert ausgegeben. Der Signalzustand am Ausgang Q ist logisch „1“ wenn der Zählwert größer Null ist. Ist der Zählwert gleich Null, wird der Signalzustand am Ausgang Q logisch „0“. Der Zählwert wird auf Null gesetzt, wenn der Rücksetzeingang R von „0“ auf „1“ wechselt. Steht an Rücksetzeingang R immer „1“ an, sind die Eingänge ZV und S wirkungslos.
Rückwärtszähler | ||||
Der Rückwärtszähler funktioniert im Prinzip wie der Vorwärtszähler mit dem Unterschied, dass bei Änderung des Signalzustandes von „0“ auf „1“ (positive Signalflanke) am Zähleingang ZR der aktuelle Zählwert um den Faktor eins vermindert wird. Der Signalzustand am Ausgang Q ist logisch „1“ wenn der Zählwert ungleich Null ist. Ist der Zählwert gleich Null, wird der Signalzustand am Ausgang Q logisch „0“. Der Zählwert wird auf Null gesetzt, wenn der Rücksetzeingang R von „0“ auf „1“ wechselt. Liegt ständig „1“-Signal am Rücksetzeingang R an, sind die Eingänge ZR und S ohne Funktion.
Vor-/Rückwärtszähler | ||||
Der Vorwärts- und Rückwärtszähler erhöht den Zählwert um den Faktor eins, wenn der Signalzustand am Zähleingang ZV von „0“ auf „1“ (positive Signalflanke) wechselt und vermindert den Zählwert um den Faktor eins, wenn am Zähleingang ZR der Signalzustand von „0“ auf „1“ (positive Signalflanke) wechselt. Das Verhalten des Ausgang Q ist analog zu den Zählern mit nur einer Zählfunktion. Der Signalzustand am Ausgang Q ist „1“ wenn der Zählwert größer Null ist. Ist der Zählwert gleich Null, liefert der Ausgang Q logisch „0“. Der Zählwert wird auf Null gesetzt, wenn der Rücksetzeingang R von „0“ auf „1“ wechselt. Liegt ständig „1“-Signal am Eingang R an, sind ZV, ZR und S ohne Funktion.
Das Signalzustandsdiagramm verdeutlicht die Funktionsweise aller Zähler, also Vorwärts-, Rückwärts- sowie Vor-/Rückwärtszähler .
Parallel zu den „fertigen“ Zählern kann man die Einzelkomponenten eines Counters auch separat, quasi in Einzelteile zerlegt, programmieren. Der aktuelle Zählerstand kann bei dieser Variante nur mit einer Lade- und Transferfunktion ermittelt und verarbeitet werden.
Bei den Programmierern sind/waren die S7-Zähler eher unbeliebt und werden/wurden kaum verwendet. Der eingeschränkte Zählbereich (0-999) und die beschränkte Anzahl an Zähler sind/waren sicherlich Gründe, aber auch das Verhalten von Ausgang Q ist nicht unbedingt Nobelpreiswürdig, denn dieser liefert ein „0“-Signal wenn er noch nicht gesetzt wurde und zusätzlich dazu auch bei Erreichen des Zählwertes. Mit anderen Funktionen der SPS (Addition, Subtraktion, Lade- und Transferfunktionen) konnten eigene, besser funktionierende Zähler programmiert werden.
IEC-Zähler | ||||
Parameter | ||||
Parameter: | CU |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Vorwärtszähleingang |
Parameter: | CD |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Rückwärtszähleingang |
Parameter: | R |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Rücksetzeingang |
Parameter: | LD |
Deklaration: | Eingang |
Datentyp: | BOOL |
Funktion: | Ladeeingang |
Parameter: | PV |
Deklaration: | Eingang |
Datentyp: | Ganzzahlen |
Funktion: | Zähler voreinstellen |
Parameter: | CV |
Deklaration: | Ausgang |
Datentyp: | Ganzzahlen, CHAR, WCHAR, DATE |
Funktion: | Aktueller Zählwert |
Parameter: | Q |
Deklaration: | Ausgang |
Datentyp: | BOOL |
Funktion: | Status des Zählers |
Parameter: | QU |
Deklaration: | Ausgang |
Datentyp: | BOOL |
Funktion: | Status Vorwärtszähler |
Parameter: | QD |
Deklaration: | Ausgang |
Datentyp: | BOOL |
Funktion: | Status Rückwärtszähler |
Vorwärtszähler | ||||
Der Zähler zählt um jeweils 1 vorwärts, wenn der Signalzustand am Eingang CU von „0“ auf „1“ (positive Signalflanke) wechselt.
Ist der aktuelle Zählwert CV größer oder gleich dem Wert am Eingang PV, ist das Signal am Ausgang Q logisch „1“.
Wechselt der Wert des Rücksetzeingangs R von „0“ nach „1“, wird der aktuelle Zählwert auf 0 zurückgesetzt.
Wie auch schon bei den IEC-Zeiten erstellt Step 7 bzw. TIA-Portal auch bei den IEC-Zählern automatisch einen Datenbaustein (DB), wahlweise ein Instanz- oder Multi-Instanz-DB. Die DB-Nummer kann frei gewählt werden oder die nächste freie, nicht genutzte DB-Nummer wird von Step 7/TIA-Portal verwendet. Das hier gezeigte Beispiel verwendet den „%DB7“. Sinnvoller ist aber auch hier die Vergabe eines symbolischen Namen für den Counter. Im Eigenschaftfenster von Zähler %DB7 erkennt man den DB7 als Instanz-DB von SFB0.
TON_SFB[SFB0] ist ein System Function Block, ein in der Firmware der CPU eingebetteter Funktionsbaustein (FB), in dem alle Funktionen des Vorwärtszählers enthalten sind. Ein Zähler ist also „nur“ der Aufruf eines FB's.
Der Aufruf eines Funktionsbausteins (FB) wird als Instanz bezeichnet. Im Beispiel wird dem Funktionsbaustein SFB0, dem IEC-Vorwärtszähler, ein eigener Instanz-DB, der DB7 zugeordnet. Diese Zuordnung wird als Einzelinstanz bezeichnet. Vorteilhaft ist die Wiederverwendbarkeit der Funktionsbausteine und die gute Strukturmöglichkeit für einfache Programme.
Die Daten, mit denen die Instanz arbeitet, werden in dem Instanz-Datenbaustein gespeichert. Die Struktur des Instanz-DBs wird von der Schnittstelle des dazugehörigen FB bestimmt. Die Deklarationstabelle zeigt die Bausteinparameter mit den Abschnitten Input, Output und InOut. Statische Lokaldaten im Abschnitt Static dienen zum dauerhaften Speichern von Zwischenergebnissen über den aktuellen Programmzyklus hinaus. Der Offset bestimmt den Versatz der Bit- oder Byte-Adresse für die Parameter innerhalb des Datenbausteins. Es beginnt bei Bitadresse 0.0 für den Parameter „CU“ und Bitadresse 0.1 für den Rücksetzeingang „R“. Parameter „PV“ beginnt bei Adresse 2.0 und hat eine Länge von 2 Byte (Byte 2.0 und Byte 3.0). Ausgang „Q“ belegt die Bytes 4.0 und 5.0. Die jeweiligen Anfangsadressen werden beim Anlegen automatisch von Step 7/TIA-Portal vergeben. Die jeweiligen Datentypen der Parameter werden vom Funktionsbaustein vorgegeben, in diesem Beispiel also vom System-Funktionsbaustein SFB0.
Rückwärtszähler | ||||
Der Zähler zählt um jeweils 1 rückwärts, wenn der Signalzustand am Eingang CD von „0“ auf „1“ (positive Signalflanke) wechselt.
Ist der aktuelle Zählwert CV größer oder gleich 0, so ist der Zählerausgang Q logisch „1“.
Wechselt der Wert am Ladeeingang LD von „0“ nach „1“ wird der Wert des Parameters PV als neuer, aktueller Zählwert CV geladen.
Der CPU-interne Funktionsbaustein ist der SFB1 (CTD_SFB).
Vor-/Rückwärtszähler | ||||
Der Zähler zählt um jeweils 1 vorwärts, wenn der Signalzustand am Eingang CU von „0“ auf „1“ (positive Signalflanke) wechselt.
Er zählt um jeweils 1 rückwärts, wenn der Signalzustand am Eingang CD von „0“ auf „1“ (positive Signalflanke) wechselt.
Das Signalzustandsdiagramm zeigt die Funktionsweise bei einem ganzzahligen Zählwert ohne Vorzeichen und PV = 99.
Ist der Wert des Parameters CV größer oder gleich dem Wert des Parameters PV, dann ist der Signalzustand am Zählerausgang QU = 1.
Ist der Wert des Parameters CV kleiner oder gleich 0, dann ist der Signalzustand am Zählerausgang QD = 1.
Wechselt der Wert von Parameter LD von „0“ nach „1“, wird der Wert an Parameter PV als neuer CV-Wert in den Zähler geladen.
Wechselt der Wert des Rücksetzparameters R von von „0“ nach „1“, wird der aktuelle Zählwert CV auf 0 zurückgesetzt.
Der CPU-interne Funktionsbaustein für den Vor-/Rückwärtszähler ist der SFB2 (CTUD_SFB).
Einen kleinen Haken haben haben diese Zähler aber doch und sollte beim Programmieren tunlichst beachtet werden. Wird im Programmeditor Step 7 bzw. TIA-Portal eine Zähleranweisung mit der Standardeinstellung übernommen, so wird ein Instanz-DB zugewiesen der nicht als remanent definiert werden kann. Bei einem Stop der CPU bzw. ein Neuanlauf der SPS wären die gespeicherten Zählerstände "verloren". Um dies zu vermeiden muss entweder ein globaler DB oder ein Multi-Instanz-DB genutzt werden.