Zeitfunktionen programmieren
In der SPS-Programmiersoftware Step7 hat man grundsätzlich zwei Möglichkeiten, Zeitfunktionen zu programmieren. Wenn man nach der Programmiernorm 61131-3 programmieren möchte, verwendet man die Systemfunktionsbausteine SFB2 (TP), SFB3 (TON) und SFB4 (TOF). Man kann aber auch auf die firmenspezifischen Zeitfunktionen SA, SE, SI, SS und SV zugreifen. Diese haben einen größeren Funktionsumfang und sind einfacher im Handling. Beispielsweise besitzen alle Zeitfunktionen Rücksetzeingänge.
In welcher Darstellungsart man die Zeitfunktion programmiert, spielt im Grunde keine Rolle, da alle Zeitfunktionen über dieselben Eingangs- und Ausgangsvariablen verfügen. Die Zeitglieder sind in einem Speicherbereich im Systemspeicher der CPU's abgelegt. Wieviele Zeitglieder in einem Programm verwendet werden können, hängt davon ab, welche CPU man benutzt. Hier muss man im Referenzhandbuch des Geräts nachschauen, um Näheres zu erfahren. Sofern in einem Programm mehr Zeitglieder benutzt wurden, als die CPU zur Verfügung stellt, wird eine Fehlermeldung (synchroner Fehler) erzeugt und OB121 wird gestartet.
Zeitfunktionen bzw. TIMER gehören zu den Parametertypen und haben die Größe von 16 Bits (2 Bytes, 1 Wort).
Aufbau eines Zeitglieds
Ein Zeitglied ist wie auf Bild abgebildet aufgebaut. Die Eingangs- und Ausgangsoperanden haben dabei folgende Bedeutung:
- Tx: Bezeichnung für das Zeitglied. Hier muss man anstelle von x eine Nummer für den Zeitoperanden vergeben, z.B. T1.
- T-Funktion: Hier steht der Typ des Zeitglieds, z.B. SA, SE usw.
- S: Setzeingang des Zeitglieds. Über ein binäres Signal (0 oder 1) wird das Zeitglied gesetzt und die festgelegte Zeit beginnt, abzulaufen.
- TW: Die Zeitdauer, die festgelegt werden soll. Belegt die Größe von 16 Bits (1 Wort, 2 Bytes).
- R: Rücksetzeingang. Das Zeitglied kann mit dem binären Signal 1 rückgesetzt werden.
- DUAL: Hier wird der Restwert der ablaufenden Zeit dualcodiert angezeigt. Kann ausgelesen werden, wofür 16 Bits benötigt werden.
- DEZ: Hier wird der Restwert der ablaufenden Zeit BCD-codiert angezeigt (S5TIME). Kann ebenfalls ausgelesen werden und hat ebenfalls eine Größe von 16 Bits.
- Q: Ausgang des Zeitglieds. Solange das Zeitglied gesetzt ist, ist Q = 1.
Verwendung von Datentypen und Operanden für Ein- und Ausgänge von Zeitgliedern
Folgende Operanden und Datentypen werden für die Ein- und Ausgänge verwendet:
- Tx: Operand T, Datentyp TIMER.
- S: Operanden E, A, M, DBX, L, T, und Z, Datentyp Bool.
- TW: Konstante, EW, AW, MW, DBW und LW, Datentyp S5TIME.
- R: E, A, M, DBX, L, T, und Z, Datentyp Bool.
- DUAL: EW, AW, MW, DBW und LW, Datentyp WORD.
- DEZ: EW, AW, MW, DBW und LW, Datentyp WORD.
- Q: E, A, M, DBX und L, Datentyp Bool.
Starten eines Zeitglieds
Eine Zeitfunktion wird über den Setzeingang gestartet. Hierbei kommt es darauf an, welchen Typ man gewählt hat. Bei SE, SI, SS und SV wird das Zeitglied über eine positiven Flanke gesetzt. Bei SA wird das Zeitglied mit einer negativen Flanke gesetzt. Mit dem Setzen des Zeitglieds beginnt die am Eingang TW eingestellte Zeitdauer abzulaufen.
Eingabe der Zeitdauer am Eingang TW
Am Eingang TW erfolgt die Eingabe der Zeitdauer. Diese kann in Step7 auf zwei verschiedene Art und Weisen eingegeben werden. Einmal als Variable mit Hilfe des BCD-Codes oder als Konstante. Für die Eingabe der Zeitdauer ist etwas Hintergrundwissen erforderlich. Denn, das hat Auswirkungen sowohl für die Eingabe als Konstante als auch für die Eingabe als Variable. Die Bitbelegung für S5TIME sieht wie folgt aus:
Die Zeitdauer mit dem Datentypen S5TIME wird im Akku als BCD-Zahl abgelegt und belegt dabei 16 Bits (1 Wort, 2 Bytes). Eine Ziffernfolge von 4 Bits entspricht im BCD-Code einer Tetrade. Mit einer Tetrade kann man die Zahlen 0 - 9 darstellen. Die erste Tetrade entspricht dabei den Einern, die zweite den Zehnern und die dritte den Hundertern. Im Datentypen S5TIME sind die ersten 12 Bits (Bit 0 bis Bit 11) für den Zeitwert reserviert und das sind genau 3 Tetraden. Da man mit jeder Tetrade maximal die Zahl 9 darstellen kann, kann man einen maximalen Zeitwert von 999 darstellen.
Die Bits 12 und 13 sind für die Zeiteinheit reserviert. Mit diesen 2 Bits kann man umgerechnet einen Dezimalwert von 0 - 3 darstellen. Für die Darstellung der Zeiteinheit im Datentypen S5TIME gilt folgendes:
- 0 entspricht einer Zeiteinheit von 0,01 Sekunden (1/100 Sekunde)
- 1 entspricht einer Zeiteinheit von 0,1 Sekunden (1/10 Sekunde)
- 2 entspricht einer Zeiteinheit von 1 Sekunde
- 3 entspricht einer Zeiteinheit von 10 Sekunden
Die Bits 14 und 15 können ignoriert werden, sie werden nicht bzw. mit 0 belegt.
Das bedeutet, für eine Zeitdauer von z.B. 20ms hätte man folgendes Bitmuster:
- 00 00 0000 0000 0010
Erläuterung von links nach rechts:
- Die ersten 2 Bits werden ignoriert.
- Die nächsten 2 Bits sind 00, also die Zahl 0. Entspricht der Zeiteinheit 0,01 Sekunden.
- Die übrigen 12 Bits (3 Tetraden) entsprechen der Zahl 2.
- 2 · Zeiteinheit, also 2 · 0,01 Sekunden = 0,02 Sekunden oder 20ms.
Maximale Zeitdauer
Dadurch wird klar, dass man für ein Zeitglied nur eine maximale Zeitdauer von 10s x 999 = 9990 Sekunden eingeben kann. Das entspricht einer Zeitdauer von genau 2 Stunden, 46 Minuten und 30 Sekunden.
Rundungen bei der Eingabe der Zeitdauer
Es kann der Fall eintreten, dass nicht die exakte Zeitdauer übernommen wird.
Hierfür ein Beispiel für die Zeitdauer 3 Minuten und 25,3 Sekunden = 205,3 Sekunden. Das Bitmuster hierfür wäre:
- 00 10 0010 0000 0101
Erläuterung (von links nach rechts):
- Die ersten 00 werden ignoriert.
- Die nächsten 2 Bits entsprechen der Zahl 2, also ist die Zeiteinheit 1 Sekunde.
- Die nächsten 12 Bits (3 Tetraden) entsprechen der Zahl 205.
- 205 · 1 Sekunde = 205 Sekunden.
- Die 0,3 Sekunden wurden gerundet
Die Ursache hierfür ist, dass man mit der Zeiteinheit 1 (0,1 Sekunden) bei 3 Tetraden eine Zahl von 2053 bräuchte, um 205,3 Sekunden exakt darstellen zu können (2053 x 0,1 = 205,3 Sekunden). Da man mit den 3 Tetraden aber nur Zahlen bis 999 eingeben kann, wurde automatisch die nächsthöhere Zeiteinheit genommen und es musste gerundet werden. Die Rundung erledigt das Programm übrigens auch automatisch.
Innerhalb folgender Bereiche kann eine exakte Zeitdauer eingegeben werden
Zeiteinheit | Zeitdauer |
---|---|
0,01s | 10ms bis 9990ms (9s990ms) |
0,1s | 100ms bis 99900ms (1min 39s 900ms) |
1s | 1s bis 999s (16min 39s) |
10s | 10s bis 9990s (2h 46min 30s) |
Eingabe der Zeit als Konstante
Die Eingabe einer konstanten Zeitdauer erfolgt in folgender Form:
- S5T#wHxxMyySzzzMS
- Beispiel: S5T#5S
Nicht benutzte Einheiten können dabei entfallen. Das w steht für Stunden (H, Hours), das xx für die Minuten (M, Minutes), yy für die Sekunden (S, Seconds) und zzz für die Millisekunden (MS, Milliseconds).
Die Umwandlung der Zahl in ein 16 Bit breites Bitmuster mit Auswahl der Zeiteinheit und Darstellung des Zeitwerts erledigt das Programm automatisch im Hintergrund.
Eingabe der Zeitdauer in BCD
Die Eingabe der Zeitdauer als Variable mit Hilfe der BCD-Zahl erfolgt in der Form:
- W#16#zttt
- Beispiel: W#16#3999
Das z steht dabei für die Zeiteinheit und ttt für den Zeitwert.
Zeitglieder rücksetzen
Ein Vorteil der Zeitfunktionen in Step7 gegenüber den Zeitfunktionen gemäß Programmiernorm 6113-3 ist, dass diese einen Rücksetzeingang haben. Mit einem Signal 1 über den Rücksetzeingang (R) können diese rückgesetzt werden. Die ablaufende Zeit wird gestoppt und das Zeitglied kann erst wieder gestartet werden wenn kein Signal 1 am Rücksetzeingang anliegt und wenn am Setzeingang das Signal 1 anliegt. Wenn das Zeitglied nicht aktiviert ist, hat das Signal 1 am Rücksetzeingang keinerlei Auswirkungen auf die Ausgänge DUAL, DEZ und Q. Würde man den Zeitoperanden oder die Restzeitwerte abfragen, würde man den Wert 0 erhalten.
Restlaufzeit abfragen
Die Restlaufzeit einer ablaufenden Zeit kann über Ladebefehle im Funktionsplan FUP mit dem Übergabeparameter MOVE und in SCL über eine Wertzuweisung ( : = ) abgefragt werden. Mit Hilfe der Anweisungen L Tx (dualcodiertes laden des Restzeitwertes) und LC Tx (BCD-codiertes Laden des Restzeitwertes) kann der Restzeitwert in den Akku geladen werden. Bei einem dualcodiertem Laden der Restlaufzeit gehen die beiden Bits für die Zeiteinheit verloren. Das bedeutet, Bit 12 und Bit13 erhalten im Akku den Wert 0. Übrig bleiben Bit 0 bis Bit 11. Das entspricht einer positiven Ganzzahl des Zahlenformats INT und man kann den Wert bei Vergleichsfunktionen nutzen. Wird die Restlaufzeit BCD-codiert geladen, gehen die Bits 12 und 13 nicht verloren und bleiben im Akku erhalten. So kann man den Wert erneut nutzen, um z.B. eine andere Zeitfunktion zu starten und den Eingang TW mit der Restlaufzeit zu belegen.
Zeitoperanden Tx abfragen
Ebenso wie Eingänge, Ausgänge oder Merker können auch die Zeitoperanden Tx über binäre Abfragen wie UND, ODER, NAND, NOR oder XOR abgefragt werden. Bei der mehrmaligen Abfrage von einem Zeitoperanden in einem SPS-Programm ist es empfehlenswert, die Zeitoperanden einem Hilfsoperanden zuzuweisen und den Hilfsoperanden statt den Zeitoperanden abzufragen. Dadurch kann einer Fehlfunktion vorgebeugt werden, weil ein Zeitoperand während der Abarbeitung unterschiedliche Werte haben kann. Als Hilfsoperanden können beispielsweise Merker benutzt werden.