Timer
Die Timer liegen im Speicherbereich T0 .. T639. Die Timer unterteilen sich weiter wie folgt:
- T0 ... T99 - 100 ms Takt, nicht akkumulierend
- T100 ... T199 - 100 ms Takt, akkumulierend
- T200 ... T299 - 10 ms Takt, nicht akkumulierend
- T300 ... T399 - 10 ms Takt, akkumulierend
- T400 ... T499 - 1 ms Takt, nicht akkumulierend
- T500 ... T599 - 1 ms Takt, akkumulierend
- T600 ... T639 - 1 ms Takt, Präzisionstimer
Timer sind in XCPPro einfach zu Programmieren. Ein Eingangskontakt aktiviert den Timer, über OUT T... K... übergebt ihr einen Parameter, der angibt, nach welcher Zeit der Kontakt T... schließen soll. Der Parameter kann auch über ein Datenregister D... übergeben werden. Solange der Eingangskontakt anliegt läuft der Timer. Nach Ablauf der eingestellten Zeit schließt der Kontakt T.... In unserem Beispiel rechts schließt T0 wenn X0 100 x 100 ms anliegt, also nach 10 Sekunden.
Der Unterschied zwischen nicht akkumulierenden und akkumulierenden Timern ist, dass die nicht akkumulierenden zurück auf 0 gesetzt werden, sobald der Eingangskontakt nicht mehr anliegt. Die akkumulierenden dagegen stoppen und laufen weiter, wenn der Eingang wieder anliegt. Die Timer T0 bis T599 sind lineare 16 Bit Timer, die bis 32767 zählen und dann stehen bleiben, solange sie nicht zurückgesetzt werden.
Es gibt zwei Möglichkeiten einen Timer zu starten, einmal über OUT (z.B. OUT T0 K100) oder TMR (z.B. TMR T0 K100). Während ein Timer, der mit OUT aktiviert wurde sofort losläuft, startet der mit TMR aktivierte Timer erst am Anfang des nächsten SPS-Zyklus. Ein Unterschied von wenigen Millisekunden, der manchmal relevant sein kann. Mit RST kann ein Timer jederzeit zurückgesetzt werden.
Über die Adresse DT... habt ihr direkten Zugriff auf den aktuellen Stand des Timers als Word. DT0 ist also der aktuelle Stand von Timer T0. Diese Adresse kann auch problemlos über das HMI ausgelesen werden.
Im Unterschied zu den normalen 16 Bit Timern im Bereich T0 bis T599 sind die Präzisionstimer im Bereich T600 bis T639 32 Bit Timer. Sie belegen daher auch zwei Adressen pro Timer, also T600 und T601 für Präzisionstimer 1. Sie arbeiten im 1 Millisekundentakt und können bis 2.147.483.647 zählen, das sind etwas mehr als 24 Tage. Die Präzisionstimer können wie normale Timer verwendet werden, haben aber zusätzlich einen eigenen Befehlssatz. Über eine Flanke auf STR T6xx Kxx wird der Timer als Präzisionstimer gestartet. Der Parameter kann statt über K auch über die Register D übergeben werden, da es sich um einen 32 Bit Timer handelt, nimmt sich die SPS zwei Register für den Parameter, also bei Übergabe von D0 den Inhalt von D0 und D1. Bei erreichen der voreingestellten Zeit bleibt der Timer stehen und schließt seinen Kontakt T6xx. Eine erneute Flanke auf den Präzisionstimer löst automatisch einen Reset aus. Während der Timer läuft kann mit STRR T6xx der aktuelle Stand des Timers ausgelesen werden, er wird in TD6xx abgelegt. STRS T6xx stoppt den Timer vor erreichen der eingestellten Zeit. Mit RST kann man ihn manuell zurücksetzen.
Zähler
Die Zähler liegen im Speicherbereich C0 .. C639. Sie unterteilen sich weiter wie folgt:
- C0 ... C299 - 16 Bit vorwärts zählend
- C300 ... C499 - 32 Bit vorwärts / rückwärts zählend; Achtung, ein 32 Bit Zähler belegt zwei Adressen, Zähler C300 also C300 und C301, daher in diesem Bereich immer nur gerade Zähleradressen nutzen
- C500 ... C599 - 32 Bit vorwärts zählend; Achtung, ein 32 Bit Zähler belegt zwei Adressen, Zähler C500 also C500 und C501, daher in diesem Bereich immer nur gerade Zähleradressen nutzen
- C600 ... C619 - 32 Bit einphasige schnelle Zähler (HSC)
- C620 ... C629 - 32 Bit schnelle Zähler mit Richtungseingang (HSC)
- C630 ... C639 - 32 Bit zweiphasige AB Zähler (HSC)
Auch Zähler sind einfach zu implementieren. Schließt ein Eingangskontakt, zählt der Zähler um eins hoch. Aktiviert werden Zähler wie auch Timer über OUT C... K... oder OUT C... D.... Ihr übergebt direkt als K... oder indirekt über ein D Register einen Parameter, der angibt, bei welchem Zählerstand der Kontakt C... schließen soll. Für OUT C0 K10 schließt Kontakt C0 nachdem sein Eingang 10 mal geschlossen wurde.
16 Bit Zähler zählen bis 32.767 und bleiben dann stehen. Sie werden über RST zurückgesetzt. In der Standardeinstellung sind die Zähler ab C320 batteriegepuffert. Dieser Wert kann über die Einstellung der remanenten Bereiche (siehe Kapitel 3) angepasst werden, bei Bedarf könnt ihr sogar alle Zähler als remanent konfigurieren.
32 Bit Zähler können Werte zwischen -2.147.483.648 und +2.147.483.647 annehmen. Denkt dran, dass zwei D-Register als Parameter übergeben werden, OUT C300 D0 übergibt also D0 und D1 als Parameter. Zähler C300 bis C498 können über Systembit M8238 zwischen rückwärts und vorwärtszählend umgeschaltet werden. M8238=0 ist voreingestellt und bedeutet vorwärts zählend, M8238=1 entsprechend rückwärts zählend. Die Einstellung gilt für alle Zähler in diesem Bereich. Die 32 Bit Zähler C500 bis C599 bleiben davon unbeeindruckt. Die 32 Bit Zähler sind Schleifenzähler und springen nach erreichen von +2.147.483.647 auf -2.147.483.648 über und zählen weiter. Bei Rückwärtszählern entsprechend umgekehrt.
Zähler können über RST zurückgesetzt werden. Die Zähler werden dann auf 0 gesetzt und die Zählerausgänge geöffnet.
Übung
Implementiert einen akkumulierenden Timer, der nach einer Sekunde schließt und von Merker M1 aktiviert wird. Bei erreichen der Sekunde wird der Timer mit RST zurückgesetzt. Ein Zähler zählt, wie oft der Timer eine Sekunde akkumuliert hat und nach 3 akkumulierten Sekunden schaltet er Ausgang Y2.