kostenfreier technischer Support

  kostenfreier Versand in DE

  kostenfreie Softwaredownloads

  für Geschäftskunden

Immer dieser SPS-Zyklus


Er ist eines der Dinge, die SPS-Programmieranfänger und auch viele fortgeschrittene Anwender (mich eingeschlossen) schon mal in den Wahnsinn treiben: der SPS-Zyklus. Er tut eigentlich meist genau das, was er soll. Nur rechnet oft niemand damit. So ein SPS-Zyklus führt die Logik, die der SPS-Programmierer im Programm erstellt hat, immer wieder nacheinander aus, so schnell die SPS eben kann. Bei heutigen Prozessoren bedeutet das, der Zyklus wird 100 Mal oder auch 1.000 Mal oder mehr in der Sekunde ausgeführt. Das bedeutet auch, dass oft Befehle, die man eigentlich im Programm nur einmal ausführen wollte, dann eben 100 oder 1.000 Mal pro Sekunde ausgeführt werden, mit allen Folgen.


Einige Beispielprogramme zum SPS-Zyklus

Probiert es einfach aus. Hier ist ein einfaches Beispiel eines Zählers, der nicht über die Zählerfunktion sondern über den SPS-Befehl INC ausgeführt wird. INC kommt auch in anderen Programmiersprachen vor und zählt einfach eine Variable um Eins hoch. Im Gegensatz zum klassischen Zähler in der SPS wird INC aber in jedem Programmzyklus einmal ausgeführt, solange seine Eingangsbedingung wahr (also 1) ist. Probiert es aus, setzt den Eingang mit dem Taster auf 1 und beobachtet den Wert der hochgezählten Variable.

Programm 1 (ohne Flanke)

So sieht das Programm im Kontaktplan in der XCPpro-Software für die Thinget SPS aus:

Zähler in der SPS mit INC-Befehl

Klickt auf den Button und seht, wie das Programm reagiert:


Variable D0: 0


Programm 2 (mit Flanke)

Wollt ihr dieses Verhalten verhindern und den Befehl nur einmal ausführen, so müsst ihr statt den Eingang als Bedingung zu wählen, eine positive Flanke des Eingangs als Eingangsbedingung nutzen (Befehl LDP in XCPpro oder Pfeil nach oben). Eine positive Flanke überwacht nicht den Zustand des Eingangs, sondern eine Zustandsänderung von OFF zu ON. So sieht das Programm dann in XCPpro aus: Zähler über positive Flanke in der SPS mit INC-Befehl

Klickt auf den Button und seht, wie das Programm nun reagiert:


Variable D0: 0


Programm 3 (mit negativer Flanke)

Es gibt in der SPS auch sogenannte negative Flanken, bei Thinget ist das der Befehl LDF in XCPpro oder Pfeil nach unten. Eine negative Flanke überwacht nicht eine Zustandsänderung von OFF zu ON sondern umgekehrt von ON zu OFF. So sieht das Programm dann in XCPpro aus: Zähler über negative Flanke in der SPS mit INC-Befehl

Klickt auf den Button und seht, wie das Programm nun reagiert:


Variable D0: 0


Programm 4 (mit Zähler)

In der Programmiersoftware der SPS sind sind einige Funktionen und Befehle schon so ausgelegt, dass sie automatisch vereinzelt werden, also auf eine Zustandsänderung reagieren und nicht permanent ausgeführt werden. Das ist aber die Ausnahme, nicht die Regel.. Bei Thinget ist das zum Beispiel der Zählerbefehl OUT Cn Km. Damit wird ein Zähler Cn (z.B. C1) immer dann hochgezählt, wenn der Eingang seinen Zustand von OFF zu ON ändert. Zähler über negative Flanke in der SPS mit Zähler

Klickt auf den Button und seht, wie das Programm nun reagiert:


Variable CD0 (aktueller Wert des Zählers C0): 0

Warum ist der SPS-Zyklus eigentlich wie er ist?

Warum ist der SPS-Zyklus eigentlich so wie er ist? Das liegt in der Familie. Das hat der SPS-Zyklus von seinem älteren Bruder, der festverdrahteten Logik. Logische Schaltungen für Maschinen und Anlagen sind ja auch ohne SPS möglich. Dabei werden verschiedene Eingangssignale fest in logischen Schaltungen mit Ausgängen verbunden. Bei einem bestimmten Eingangsmuster ergibt sich damit auch ein dazugehöriger logischer Zustand der Ausgänge. Ändern sich die Eingänge, dann ändert sich abhängig von der verdrahteten Logik auch der Zustand der Ausgangssignale. In festverdrahteten Schaltungen passiert diese Zustandsänderung dabei sofort, jedenfalls für den menschlichen Betrachter. Mit Lichtgeschwindigkeit breiten sich die elektrischen Signale in den Leitern aus und ändern so unmittelbar den Endzustand aller Ausgänge.

Die Anfänge der SPS als Ersatz für festverdrahtete Logiken

Als Ende der sechziger Jahre Richard Morley und Odo J. Struger (Quelle: Wikipedia, ich kenne die beiden nicht persönlich. Als sie an den ersten SPS arbeiteten, war ich noch nicht einmal geboren. :)) die Halbleitertechnik (Computer), die in der Datenverarbeitung immer breiter angewendet wurde, auch auf industrielle Logiken übertragen wollten, mussten sie eine vergleichbar schnelle Übertragung der Eingangslogik auf die Ausgangslogik sicherstellen. Die Schnelligkeit von Computern bot dabei eine einfache Lösung an: den SPS-Zyklus. Alle Eingänge wurden vom Programm in der SPS eingelesen, im Programm verarbeitet und an die Ausgänge übertragen, wie in einer festverdrahteten Schaltung. Sobald das Programm diese Logik einmal abgearbeitet hat, könnte es sich natürlich auch beenden, die Logik wurde ja bereits übertragen. Allerdings bekäme so ein Programm dann Änderungen der Eingangslogik nicht mit. Also entschlossen sich die Entwickler, das Programm in einer Endlosschleife sofort wieder auf Anfang zu schicken, um die Logik noch einmal abzuarbeiten. Durch die Schnelligkeit der Prozessoren, tut eine SPS dies mehrmals pro Sekunde (meist sogar 100 mal pro Sekunde und mehr). Die SPS kann also mehrmals pro Sekunde die Logik neu verarbeiten und Eingangsänderungen auf die Ausgangslogik übertragen. In der Funktion war sie damit vergleichbar mit einer festverdrahteten Schaltung.

Übrigens: Auch die Programmiersprache Kontaktplan (KOP) für die SPS-Programmierung wurde festverdrahteten Logiken in einem klassischen Schaltplan nachempfungen. Wer also mit solchen Schaltplänen umgehen kann, findet auch in die Kontaktplan-Programmierung sehr schnell hinein.

Herausforderung Ausgangs- und Eingangsänderung während des Abarbeitens der Logik

Noch ein Problem stellte sich den SPS-Pionieren. Die Logik des SPS-Programms musste ja der Reihe nach abgearbeitet werden. Dabei konnte es passieren, dass ein Ausgang von einer Eingangslogik gesetzt wurde (1 oder ON) und von einem anderen Programmteil zurückgesetzt wurde (0 oder OFF). Das Ausgang würde also in so einem Fall im Millisekundentakt ständig seinen Zustand ändern, nur um am Ende wieder einen Endzustand erreichen, der bei vollständigem einmaligem Durchlauf der SPS-Logik der letzte Zustand des Ausgangs ist. Gleichzeitig konnte es passieren, dass während der Abarbeitung des Programms einer der Eingänge seinen Zustand plötzlich mittendrin ändert und das ganze Programm sich völlig unberechenbar verhält, je nachdem, an welcher Stelle im Programm sich der Zustand ändert.

Die Lösung: Ein Abbild der Ein- und Ausgangszustände im Speicher

Um diese Probleme zu vermeiden, musste das Abarbeiten der Logik von den echten Ein- und Ausgangssignalen getrennt werden. Dazu erstellten die SPS-Erfinder im Speicher Ihres Gerätes am Anfang des SPS-Programms ein Abbild der Eingänge, das dann auch nicht während des Programms durch Eingangsänderungen beeinflusst werden konnte. Auch ein Abbild der Ausgänge wird gleichzeitig am Anfang des Programms im Speicher hinterlegt. Auf dieses Abbild der Ausgänge wird dann die Logik Zeile für Zeile des Programms angewendet. Die Ausgänge des Abbilds könnten sich also falls in der Logik vorgesehen in jeder Zeile ändern, ohne das der echte Ausgang von diesem logischen “Eiertanz” irgendetwas mitbekommt.

Am Ende des SPS-Programms werden dann die finalen Zustände der Ausgänge an die echten Ausgänge übertragen. Und damit das Programm auf Änderungen der Eingangslogik reagieren kann, wird das Programm am Ende einfach wieder am Anfang fortgesetzt. Der SPS-Zyklus, so wie wir ihn heute kenne, war geboren. Heutige SPS verarbeiten die Logik des SPS-Programms mehrere Hundert- oder sogar Tausendmal pro Sekunde. Zusätzlich wurden im Zyklus mit der Zeit weitere Programmteile eingefügt, wie z.B. das Abarbeiten von Kommunikationsbefehlen zur Kommunikation mit dem Programmiergerät (z.B. Steuerbefehle wie Stop und Start), mit dem HMI oder anderen angeschlossenen Geräten.

Der SPS-Zyklus in der Thinget SPS

Auch in der Thinget-SPS gibt es einen SPS-Zyklus, der das Programm hundertfach pro Sekunde abarbeitet. Ihr seht ihn, oder vielmehr seine Zykluszeit, wenn ihr mit der SPS verbunden seid, rechts unten in der Programmiersoftware. Zusätzlich gibt es drei interner Variablen, die Auskunft über die aktuelle Zykluszeit geben und im Programm zur Überwachung des Zyklus genutzt werden können. Diese Systemvariablen sind: D8010 = aktuelle Zykluszeit in 0,1 ms (10 = 1 ms), D8011 = minimale Zykluszeit in 0,1 ms und D8012 maximale Zykluszeit in 0,1 ms.

Den SPS-Zyklus umgehen

Manchmal ist es im Programm notwendig unabhängig vom SPS-Zyklus sofort zu reagieren. Dazu gibt es einige Möglichkeiten innerhalb der Programmlogik auch sofort zu reagieren. Dies können Sie über sogenannte Interrupts verwirklichen. Es gibt dabei mehrere Arten von Interrupts. Diese unterbrechen den normalen Programmfluss und reagieren sofort innerhalb des Zyklus. Das kann nach einer festgelegten Zeit in Millisekunden (Timed Interrupt) oder bei Änderung eines so überwachten Eingangs (I/O-Interrupt) passieren. Mehr Informationen dazu findet ihr im Programmierhandbuch von Thinget oder per Email von uns support@spstiger.de.