SPS-Programmierung #13: Ablaufsteuerungen — Transcript

In diesem Video erklärt Christian Stöcker die Planung und Implementierung von Ablaufsteuerungen mit UML-Zustandsdiagrammen und SPS-Programmierung.

Key Takeaways

  • Ablaufsteuerungen steuern sequenzielle Prozesse in Anlagen und sind essenziell in der Automatisierung.
  • UML-Zustandsdiagramme bieten eine klare und standardisierte Methode zur Modellierung von Steuerungsabläufen.
  • Aktionen können beim Eintritt, während des Zustands oder beim Verlassen ausgeführt werden.
  • SPS-Programmiersprachen wie strukturierter Text und Ablaufsprache bieten unterschiedliche Vorteile für die Implementierung.
  • Komplexe Abläufe lassen sich durch zusammengesetzte Zustände mit parallelen Teilabläufen abbilden.

Summary

  • Einführung in Ablaufsteuerungen und deren Bedeutung in Automatisierungsprozessen.
  • Beispiele für Ablaufsteuerungen: Ampelsteuerung und Aufzugtürsteuerung.
  • Erklärung der UML-Zustandsdiagramm-Notation als Standardwerkzeug für den Entwurf.
  • Beschreibung von Zuständen, Zustandsübergängen und deren Bedingungen.
  • Erläuterung der Aktionen in Zuständen (ENTRY, DO, EXIT) und bei Übergängen.
  • Vorstellung komplexer Zustände mit parallelen Abläufen durch zusammengesetzte Zustände.
  • Demonstration der Umsetzung eines Entwurfs in strukturierte Textsprache (ST) und Ablaufsprache (AS).
  • Vergleich der Implementierungsmöglichkeiten in ST und AS gemäß IEC 61131.
  • Praxisbeispiel: Steuerung der Aufzugtür mit Zustandsdiagramm und Timersteuerung.
  • Ziel: Ingenieursmäßiger Entwurf und praktische Umsetzung von Ablaufsteuerungen.

Full Transcript — Download SRT & Markdown

00:00
Speaker A
Als Automatisierungstechniker werdet ihr häufig vor die Aufgabe gestellt, eine Steuerung zu entwerfen, die in einem Prozess oder in einer Anlage eine bestimmte Sequenz von Aktionen ausführen soll.
00:12
Speaker A
Ein sehr einfaches Beispiel dafür ist eine Ampel, die also nacheinander die Signale grün, gelb, rot, rot, gelb und dann wieder grün ausgeben soll.
00:21
Speaker A
Ein zweites Beispiel ist die Tür in einem Aufzug, die also auf Anforderung aufgefahren werden soll, dann für eine gewisse Zeit auf bleibt und wieder automatisch zugefahren werden soll.
00:32
Speaker A
Steuerungen, die also einen solchen Ablauf in einer Anlage realisieren, heißen Ablaufsteuerungen oder ihr kennt es vielleicht auch als Schrittkette.
00:41
Speaker A
In diesem Video zeige ich euch erstens, wie man Ablaufsteuerungen Ingenieursmäßig entwirft und zweitens dann implementiert.
00:49
Speaker A
Ein Entwurf oder auch Modell einer Ablaufsteuerung ist so etwas wie ein Plan oder ein Konzept, das beschreibt, wie sich diese Steuerung verhalten soll.
01:05
Speaker A
Und das Tool, das zum Standard für den Entwurf solcher Steuerung geworden ist, ist das UML-Zustandsdiagramm.
01:45
Speaker A
Damit ihr also nachvollziehen könnt, wie solch ein Entwurf funktioniert, werde ich hier auch noch in einem Crashkurs die Notationselemente von UML-Zustandsdiagramm einführen.
01:55
Speaker A
So und der Entwurf einer solchen Steuerung ist dann also die Grundlage oder die Basis für die Implementierung.
02:10
Speaker A
Man kann also den Entwurf in ST-Code übersetzen und wie diese Übersetzung funktioniert, zeige ich euch hier dann auch.
02:31
Speaker A
Wenn ihr vielleicht schon ein paar Vorerfahrungen in SPS-Programmierung habt, würdet ihr sagen, dass strukturierter Text vielleicht nicht die intuitive Wahl für die Implementierung einer Ablaufsteuerung oder einer Schrittkette ist, denn dafür bietet die IEC 61131 eine eigene Sprache an und das ist die sogenannte Ablaufsprache oder kurz AS. Und damit ihr mal einen Vergleich habt zwischen den Implementierungen einer Steuerung in Ablaufsprache oder strukturiertem Text, werde ich das Beispiel, dass ich hier anwende, in beiden Sprachen implementieren und dann einmal vergleichend gegenüberstellen.
03:26
Speaker A
So ein UML-Zustandsdiagramm beschreibt also eine Abfolge von Schritten, wobei die Schritte hier jetzt als Zustände bezeichnet werden.
03:34
Speaker A
Den Einstiegspunkt in ein Zustandsdiagramm markiert dieser ausgefüllte Kreis. Ausgehend von diesem Kreis zeigt dann ein Pfeil auf den ersten Zustand.
03:50
Speaker A
Der Pfeil ist hier im Grunde schon ein Zustandsübergang, aber dazu erkläre ich gleich noch mehr. Schauen wir jetzt erstmal auf die Notation eines Zustands.
04:10
Speaker A
Der wird also als so ein Quadrat dargestellt mit einer Kopfzeile, in die der Name des Zustands geschrieben wird.
04:20
Speaker A
Das sollte also ein Bezeichner sein, der den Zustand des Systems möglichst gut beschreibt.
04:30
Speaker A
Bei einer Ampel könnte das zum Beispiel Phase Grün sein.
04:40
Speaker A
In dem Zustand werden dann Aktionen ausgeführt, also zum Beispiel wird die Ansteuerung eines Aktors verändert.
04:56
Speaker A
Und den Zeitpunkt der Ausführung dieser Aktion kann man noch genauer eingrenzen, nämlich ob eine Aktion beim Eintreten in den Zustand ausgeführt wird.
05:10
Speaker A
Oder während der Zustand aktiv ist oder beim Verlassen des Zustands.
05:22
Speaker A
Diese Zeitpunkte werden durch das Voranstellen der Wörter ENTRY, DO bzw. EXIT spezifiziert.
05:36
Speaker A
Dahinter kommt dann nach einem Schrägstrich immer der Name der Aktion.
05:46
Speaker A
Nachher im Programm werdet ihr sehen, dass eine Aktion so etwas ähnliches wie ein Skript ist.
05:57
Speaker A
Also eine Reihe von Anweisungen und diese Aktion kann man also einen Namen geben, den man dann hier im Diagramm einträgt.
06:08
Speaker A
Es muss nicht für jede Phase des Zustands eine Aktion definiert werden, es kann ja durchaus Zustände geben, in denen nichts passieren soll.
06:24
Speaker A
In den einzelnen Phasen und dann würde man hier im Diagramm eben keine Aktion angeben und die Zeile hinter dem ENTRY, DO oder EXIT eben leer lassen.
06:35
Speaker A
So, natürlich besteht ein Zustandsdiagramm nicht nur aus einem Zustand, sondern aus mehreren.
06:46
Speaker A
Und zwischen diesen Zuständen gibt es Zustandsübergänge, die durch diese Pfeile hier markiert sind.
06:56
Speaker A
Ein Zustandsübergang passiert aber nicht zufällig, sondern wenn eine bestimmte Bedingung eintritt und diese Bedingung wird hier in eckigen Klammern an den Zustandsübergang geschrieben.
07:12
Speaker A
So eine Bedingung könnte also sein, dass ein Timer abgelaufen ist oder dass ein Taster betätigt wurde.
07:22
Speaker A
Ganz allgemein ist diese Bedingung hier ein logischer Ausdruck und wenn dieser logische Ausdruck den Wahrheitswert TRUE hat, dann erfolgt der Zustandsübergang.
07:38
Speaker A
Ein boolscher Wert ist natürlich der einfachste logische Ausdruck, es können aber auch andere Bedingungen formuliert werden, wie Vergleiche mit größer, kleiner, kleiner gleich und so weiter.
07:52
Speaker A
Oder logische Verknüpfung mit und, oder und anderen Operatoren.
08:00
Speaker A
Das UML-Zustandsdiagramm gibt auch die Möglichkeit, dass bei einem Zustandsübergang Aktionen ausgeführt werden, die dann hier hinter diesem Schrägstrich wieder angegeben werden.
08:15
Speaker A
Und hier gilt das gleiche wie bei den Aktionen in einem Zustand, ein Zustand Übergang muss keine Aktion haben.
08:27
Speaker A
Und auch nicht jede Implementierungssprache bietet die Möglichkeit, diese Aktion zu implementieren.
08:34
Speaker A
Wenn es also keine Aktion gibt bei einem Übergang, wird hier einfach nichts eingetragen.
08:40
Speaker A
So, hier seht ihr jetzt zwei Zustände mit einem Zustandsübergang.
08:52
Speaker A
Es kann aber auch sein, dass es von einem Zustand aus mehrere Zustandsübergänge zu unterschiedlichen Folgezuständen gibt, wie jetzt hier dargestellt.
09:07
Speaker A
Für diese beiden Zustandsübergänge hier muss es natürlich unterschiedliche Bedingungen geben, weil immer nur ein Zustand aktiv sein kann.
09:19
Speaker A
Und wenn man jetzt hier dieselbe Bedingung hätte, wäre erstmal unklar, welcher Folgezustand eingenommen werden soll.
09:30
Speaker A
So, es müssen also unterschiedliche und unabhängige Bedingungen sein an diesen Zustandsübergängen.
09:43
Speaker A
Also zum Beispiel hier Taster gedrückt und da unten Timer abgelaufen.
09:50
Speaker A
Es gibt Ablaufsteuerungen, die niemals verlassen werden, wo also immer ein Zustand aktiv ist.
10:05
Speaker A
Es gibt aber auch Ablaufsteuerungen, die zu einem Ende kommen, wo also eine bestimmte Sequenz abgearbeitet wurde und die Steuerung dann beendet wird.
10:19
Speaker A
Und so ein Ende wird dann durch einen umrandeten Kreis gekennzeichnet.
10:26
Speaker A
Okay, das sind also erstmal die wichtigsten Notationselemente, um eine Abfolge von Zuständen zu modellieren.
10:40
Speaker A
So, und manchmal ist es noch so, dass in einem System sehr komplexe Zustände auftreten, wo also mehrere Sachen parallel passieren.
10:56
Speaker A
Und um solche komplexen Abläufe zu modellieren, gibt es den zusammengesetzten Zustand.
11:10
Speaker A
Das ist also ein Zustand, in dem wiederum zwei oder sogar noch mehr eigene Zustandsdiagramme zusammengefasst sind.
11:26
Speaker A
Hier in diesem Beispiel seht ihr in dem zusammengesetzten Zustand zwei Bereiche und wenn eben dieser Zustand aktiv wird.
11:40
Speaker A
Dann starten sozusagen die Zustandsdiagramme, die hierin eingebettet sind.
11:52
Speaker A
Der Übersichtlichkeit halber habe ich jetzt hier keine Bedingungen und Aktionen eingetragen, aber für den Ablauf dieser Zustandsdiagramme gelten dieselben Regeln, die ich gerade schon erklärt habe.
12:12
Speaker A
So und wenn dann alle Zustandsdiagramme hierin abgearbeitet sind und jeweils die Endzustände eingenommen werden.
12:20
Speaker A
Dann ist auch der zusammengesetzte Zustand abgearbeitet und es kann dann eine Transition, also ein Übergang zu einem nachfolgenden Zustand stattfinden.
12:30
Speaker A
Die durch diesen Pfeil hier wieder markiert ist.
12:37
Speaker A
So, jetzt habt ihr also einen groben Überblick über die Notationselemente von UML-Zustandsdiagramm bekommen.
12:45
Speaker A
Damit ihr aber ein Verständnis davon entwickeln könnt, wie man denn Ablaufsteuerung tatsächlich damit auch entwirft.
13:00
Speaker A
Demonstriere ich das mal an einem Beispiel.
13:06
Speaker A
Ich nehme dafür ein auf den ersten Blick sehr einfaches Beispiel, nämlich die Steuerung der Tür für einen Aufzug.
13:17
Speaker A
Wenn die Steuerung eine Anforderung von außen bekommt, dann sollen die Türen geöffnet werden.
13:26
Speaker A
Und dazu muss ein Antrieb eingeschaltet werden.
13:34
Speaker A
Sobald die Tür komplett geöffnet ist, wird das zum Beispiel über einen Endlagenschalter erfasst.
13:42
Speaker A
Dann wird der Antrieb ausgeschaltet und es wird dann ein Timer gestartet.
13:50
Speaker A
Und nach einer bestimmten Zeit soll die Tür dann wieder geschlossen werden.
13:59
Speaker A
Dazu muss der Antrieb erneut gestartet werden, aber in die andere Laufrichtung.
14:07
Speaker A
Sobald die Türen dann wieder zu sind, wird das auch wieder über einen Endlagenschalter erkannt.
14:17
Speaker A
Und der Antrieb wird ausgeschaltet.
14:23
Speaker A
Soweit so gut.
14:29
Speaker A
Jetzt möchte ich aber noch zwei Erweiterungen einbringen.
14:34
Speaker A
Erstens soll es einen Taster geben, mit dem die Tür geschlossen werden kann, noch bevor der Timer abgelaufen ist.
14:47
Speaker A
Und zweitens soll nur beim Zufahren der Tür das Signal einer Lichtschranke berücksichtigt werden.
15:05
Speaker A
Wenn also während des Zufahrens der Tür diese Lichtschranke durchbrochen wird, soll die Tür sofort wieder aufgefahren werden.
15:12
Speaker A
Dann startet der Timer erneut oder es wird eben wieder der Taster zum Zufahren betätigt.
15:20
Speaker A
So, das Verhalten ist klar, aber wie beschreibt man das jetzt im UML-Zustandsdiagramm?
15:26
Speaker A
Ich starte zunächst einmal mit einem Startknoten, der auf einen Zustand führt, den ich idle nenne.
15:37
Speaker A
Die Tür macht hier also erstmal nichts.
15:42
Speaker A
Statt idle könnte man den Zustand auch init nennen und dann wird klar, was hier passieren könnte, nämlich irgendwelche Initialisierungen.
15:54
Speaker A
Da fällt mir jetzt aber nichts konkretes ein, also passiert hier einfach gar nichts.
16:04
Speaker A
Und es wird auf ein Signal bInit gewartet.
16:10
Speaker A
So soll jetzt die Tür in einen definierten Zustand überführt werden, indem sie geschlossen ist.
16:20
Speaker A
Und dazu muss das Schließen der Tür zunächst einmal eingeleitet werden.
16:30
Speaker A
Und das passiert in dem Zustand closing.
16:37
Speaker A
In der Aktion driveClose_On wird also der Antrieb zum Schließen der Tür eingeschaltet.
16:49
Speaker A
Und es wird darauf gewartet, dass die Endlage erreicht wird.
16:58
Speaker A
Diese Endlage wird hier über das Signal bLimitSwitchClosed erfasst.
17:07
Speaker A
Wenn also diese Transitionsbedingung wahr ist, dann wird der Zustand closing verlassen.
17:17
Speaker A
Aber vor dem Verlassen wird noch die Aktion driveClose_Off ausgeführt, bei der der Antrieb ausgeschaltet wird.
17:30
Speaker A
Wenn also dieser Zustandsübergang dann ausgeführt wurde, dann befindet sich das System im Zustand isClosed.
17:40
Speaker A
Also die Türen sind jetzt geschlossen.
17:47
Speaker A
Wenn dieser Zustand eingenommen wird, soll ein Flag gesetzt werden.
17:57
Speaker A
Und das passiert in der Aktion setDoneFlag.
18:05
Speaker A
Das ist also nur eine boolsche Variable, die angibt, dass die Tür jetzt wieder ordentlich zugefahren wurde.
18:17
Speaker A
Jetzt wird darauf gewartet, dass ein Signal zum Öffnen der Tür kommt und das ist dieses bOpen.
18:27
Speaker A
Wenn also diese Anforderung kommt, wird beim Verlassen des Zustands isClosed das Flag in der Exit-Aktion resetDoneFlag zurückgesetzt und das System geht über in den Zustand opening.
18:44
Speaker A
Da wird ähnlich wie beim Zustand closing der Antrieb in der Aktion driveOpen_On angeschaltet.
18:59
Speaker A
Und wenn der Endlagenschalter bei geöffneter Tür dann anspricht, wird wieder eine Transition ausgeführt.
19:10
Speaker A
Vorher wird noch der Motor ausgeschaltet in der Exit-Aktion driveOpen_Off und das System wechselt dann in den Zustand isOpen.
19:22
Speaker A
Dort wird dann der Timer gestartet und die Bedingung für das Verlassen des Zustands ist dann, dass der Timer abgelaufen ist.
19:30
Speaker A
Oder dass das Signal bClose zum Schließen der Tür kommt.
19:40
Speaker A
Das letzte, was im Zustand isOpen noch passiert, ist dann das Zurücksetzen des Timers.
19:50
Speaker A
Damit der beim nächsten Mal auch wieder ordentlich gestartet werden kann.
19:58
Speaker A
So und dann ist das System wieder im Zustand closing, den ich gerade schon erklärt habe.
20:05
Speaker A
Eine Sache habe ich jetzt hier noch nicht im Modell, nämlich das Signal der Lichtschranke.
20:19
Speaker A
Wenn ihr beim Schließen der Tür die Lichtschranke durchbrochen wird, soll die Tür sofort wieder aufgefahren werden.
20:30
Speaker A
Das ist also ein Zustandsübergang von closing nach opening, der unter der Bedingung ausgeführt wird.
20:40
Speaker A
Dass die Lichtschranke durchbrochen ist und das wird eben hier durch das Signal bLightBarrier repräsentiert.
20:49
Speaker A
So, ich hoffe, dass ihr jetzt erkennt, dass dieses UML-Zustandsdiagramm zu der Spezifikation der gesteuerten Tür passt, die ich zuvor bildlich erklärt habe.
21:00
Speaker A
Dieses Modell ist damit jetzt die Grundlage für die Implementierung der Ablaufsteuerung in ST.
21:10
Speaker A
Und das Tolle ist, wie ich finde, dass man dieses UML-Zustandsdiagramm fast Kochrezeptartig in ST-Code übersetzen kann.
21:21
Speaker A
Und wie das geht, zeige ich euch jetzt.
21:25
Speaker A
Ich starte zunächst einmal damit, einen Aufzählungsdatentypen, also ein Enum anzulegen.
21:35
Speaker A
Indem ich nur die Bezeichner der Zustände speichere.
21:42
Speaker A
Diesen Datentyp nenne ich E_DcState.
21:48
Speaker A
Das E steht für Enum, DC für DoorControl und State ist eben der Zustand.
21:56
Speaker A
So die Attribute, die in diesem Enum standardmäßig vorgegeben sind, lasse ich erstmal drin.
22:04
Speaker A
Wenn ihr euch fragt, was diese Attribute bedeuten, findet ihr dazu eine Erklärung in dem Video, dass ich hier oben verlinkt habe.
22:12
Speaker A
Okay, wie angekündigt, trage ich in diesem Enum also nur die Bezeichner meiner Zustände des Zustandsdiagramms ein.
22:20
Speaker A
Das Ganze mache ich, weil ich in meiner Steuerung gleich eine Variable von diesem Enum-Datentypen anlegen werde.
22:30
Speaker A
Die sozusagen ein Merker für den aktiven Zustand ist.
22:38
Speaker A
So und weil diese Merker-Variable eben keine anderen Werte annehmen kann, als die, die ich in diesem Enum definiert habe.
22:50
Speaker A
Kann ich damit sicherstellen, dass sich die Steuerung auch nur in Zuständen befindet.
22:59
Speaker A
Die im Zustandsdiagramm vorkommen.
23:06
Speaker A
Das Anlegen von diesem Enum ist also ein vorbereitender Schritt.
23:13
Speaker A
So, dann beginne ich jetzt mit der eigentlichen Implementierung der Steuerung.
23:20
Speaker A
Und dazu lege ich erst einmal einen Funktionsbaustein an, den ich FB_DoorCtrl nenne.
23:28
Speaker A
Zuerst deklariere ich jetzt die Ein- und Ausgangsvariablen und die internen Variablen.
23:34
Speaker A
Die Eingangsvariablen sind in diesem Beispiel hier jetzt alle Signale, um die Bedingungen an den Zustandsübergängen zu überprüfen.
23:48
Speaker A
Also bInit, dann die Signale für die Anforderung zum Öffnen und Schließen der Tür, bOpen und bClose.
23:57
Speaker A
Die Endlagenschalter bLimitSwitchOpen und bLimitSwitchClosed und das Signal von der Lichtschranke bLightBarrier.
24:07
Speaker A
Als Ausgangssignal definiere ich nur das Flag bDone.
24:14
Speaker A
Das also gesetzt wird, wenn die Tür zu ist.
24:20
Speaker A
Und sonst aber false ist.
24:23
Speaker A
So, vielleicht fragt ihr euch jetzt, was denn mit den Signalen zum Ansteuern des Antriebs ist.
24:31
Speaker A
Die müssten ja eigentlich auch Ausgangssignale der Steuerung sein.
24:38
Speaker A
Das löse ich jetzt aber anders und zwar füge ich noch eine weitere Eingangsvariable fbDrive hinzu.
24:50
Speaker A
Und die ist vom Typ Referenz auf eine Einzelsteuerfunktion, die ich in dem Video erklärt habe, dass hier oben wieder verlinkt ist.
25:01
Speaker A
Die Ansteuerung des Antriebs passiert also nicht direkt aus der Steuerung, sondern über diese Einzelsteuerfunktion.
25:15
Speaker A
Womit ich also schon ein bisschen eine Unabhängigkeit zwischen dieser Steuerung und der eingesetzten Hardware erreiche.
25:22
Speaker A
So und hier kommen jetzt die internen Variablen der Steuerung.
25:27
Speaker A
Als erstes brauche ich ein Enum vom Typ E_DcState, den ich eState nenne und in dem also der aktive Zustand der Steuerung gespeichert wird.
25:38
Speaker A
Den initialisiere ich auch gleich noch mit dem Wert idle und das entspricht auch dem Zustandsdiagramm, nachdem idle eben der Startzustand ist.
25:48
Speaker A
Der TON-Baustein fbTimerOpen wird verwendet zur Bestimmung der Dauer, die die Tür geöffnet ist, bevor sie automatisch wieder zugefahren wird.
26:00
Speaker A
Und für die Zeit, die die Tür offen bleiben soll, lege ich auch noch eine Variable tDoorOpen an.
26:09
Speaker A
Die Zeit von 3 Sekunden ist von mir jetzt willkürlich gewählt.
26:16
Speaker A
Um den Funktionsbaustein der Steuerung noch flexibler einsetzen zu können.
26:25
Speaker A
Könnte man diese Zeit auch als Eingangsvariable deklarieren.
26:33
Speaker A
Ich habe mich jetzt aber hier für diese Variante mit der fest eingestellten Zeit entschieden.
26:40
Speaker A
So, dann gehe ich jetzt zum Anweisungsteil und damit also zur eigentlichen Logik der Ablaufsteuerung.
26:49
Speaker A
Und das Interessante ist jetzt hier, wie das UML-Zustandsdiagramm in ST-Code übersetzt wird.
26:59
Speaker A
Das Grundgerüst dafür ist diese Case-Anweisung, in der der Zustand eState abgefragt wird.
27:06
Speaker A
In dieser Case-Anweisung werden jetzt die einzelnen Zustände mit den Aktionen und den Zustandsübergängen ausprogrammiert.
27:12
Speaker A
Ich starte jetzt hier mit dem Zustand idle.
27:19
Speaker A
Gemäß dem Zustandsdiagramm gibt es hierin ja keine Aktion.
27:25
Speaker A
Also passiert hier auch nichts.
27:30
Speaker A
Aber es gibt eine Transition, also einen Übergang in den Zustand closing, der ausgeführt wird, wenn das Signal bInit true ist.
27:42
Speaker A
Und diesen Übergang realisiere ich durch diese If-Anweisung.
27:50
Speaker A
Hier kann man jetzt schon den Zweck der Variablen eState erkennen.
27:59
Speaker A
Wenn also die Bedingung in dem If-Statement erfüllt ist, das heißt also bInit den Wert true hat.
28:10
Speaker A
Dann wird der Wert von eState auf closing gesetzt.
28:20
Speaker A
Und im nächsten Zyklus der SPS wird dann im Case-Statement der Wert von eState wieder abgefragt.
28:30
Speaker A
Und es wird dann eben der Fall closing abgearbeitet.
28:38
Speaker A
Die Programmabarbeitung bleibt dann also so lange in dem Fall closing, bis eState wieder auf einen anderen Wert gesetzt wird.
28:48
Speaker A
So und um das klarer zu machen.
28:51
Speaker A
Mache ich jetzt mit der Implementierung des nächsten Zustands closing weiter.
29:00
Speaker A
Hier gibt es eine Aktion, die ich im Zustandsdiagramm driveClose_On genannt habe.
29:10
Speaker A
Darin wird also der Antrieb zum Öffnen der Tür eingeschaltet.
29:20
Speaker A
Und das realisiere ich durch diesen Aufruf dieser Einzelsteuerfunktion von fbDrive.
29:28
Speaker A
Auf diese Weise wird der Antrieb eingeschaltet und es wird eine Fahrtrichtung und eine Geschwindigkeit gewählt.
29:38
Speaker A
So, mehr passiert nicht in der Aktion.
29:42
Speaker A
Dann kümmere ich mich um die Zustandsübergänge, von denen es in diesem Zustand zwei gibt.
29:50
Speaker A
Der erste in den Zustand isClosed, wenn der Endlagenschalter bLimitSwitchClosed aktiv ist.
30:00
Speaker A
Und der zweite in den Zustand opening, wenn die Lichtschranke bLightBarrier durchbrochen ist.
30:12
Speaker A
Diese Übergänge werden also wieder durch diese If-Statements umgesetzt.
30:17
Speaker A
In diesem Beispiel hier ist es eigentlich physikalisch ausgeschlossen, dass beide Bedingungen der If-Statements erfüllt wären.
30:32
Speaker A
Denn wenn die Tür komplett geschlossen ist und der Endlagenschalter dies anzeigt, wäre ja kein Platz mehr da, um noch die Lichtschranke zu durchbrechen.
30:45
Speaker A
Aber es kann ja andere Beispiele geben, wo es ausgehend aus einem Zustand zwei mögliche Zustandsübergänge gibt.
30:58
Speaker A
Deren Bedingungen gleichzeitig erfüllt sein könnten.
31:08
Speaker A
Die Frage ist also, welcher der beiden Nachfolgezustände soll eingenommen werden.
31:18
Speaker A
Wenn beide Übergangsbedingungen wahr sind.
31:28
Speaker A
Und hier müsst ihr als Automatisierer einfach eine Priorität festlegen.
31:35
Speaker A
Und das macht ihr durch die Reihenfolge der If-Statements.
31:44
Speaker A
In meinem Fall hat der Übergang in den Zustand opening die höhere Priorität.
31:53
Speaker A
Würden nämlich beide If-Statements abgearbeitet, würde zunächst eState auf den Wert isClosed gesetzt.
32:02
Speaker A
Aber im zweiten If-Statement würde dieser Wert mit opening überschrieben werden.
32:10
Speaker A
Und im nächsten Zyklus der SPS wird dann in diesem Case-Statement wieder in den Fall opening gesprungen.
32:19
Speaker A
So, der Zustand closing ist aber noch nicht vollständig implementiert.
32:26
Speaker A
Denn unabhängig davon, welcher Zustandsübergang erfolgt, ist in dem Zustandsdiagramm noch modelliert.
32:37
Speaker A
Dass es eine Aktion driveClose_Off gibt, nämlich wenn der Zustand closing verlassen wird.
32:45
Speaker A
Und in dieser Aktion soll der Antrieb ausgeschaltet werden.
32:53
Speaker A
Diese Aktion implementiere ich dann also als Anweisung in den If-Statements.
33:02
Speaker A
Egal welcher Zustandsübergang erfolgt, wird also diese Aktion einmal ausgeführt und dann wird der Zustand verlassen.
33:14
Speaker A
So, auf dieselbe Weise wie diese beiden Zustände werden auch die restlichen Zustände implementiert.
33:20
Speaker A
Und da gehe ich jetzt nicht mehr im Detail auf alle Codezeilen ein.
33:25
Speaker A
Hier im Zustand isOpen wird in der Aktion runTimer der Timer durch diese Anweisung gestartet.
33:34
Speaker A
Und in der Bedingung für den Zustandsübergang in den Zustand closing wird dann also der Ausgang Q des Timers abgefragt.
33:47
Speaker A
Und hier seht ihr auch noch ein Beispiel, dass diese Übergangsbedingung eine logische Verknüpfung sein kann.
34:01
Speaker A
Denn wenn vor Ablauf des Timers das Signal bClose gesetzt wird, ist durch diese Oder-Verknüpfung die Übergangsbedingung eben auch erfüllt.
34:13
Speaker A
Wichtig ist hier jetzt noch, dass in der Ausgangsaktion der Timer zurückgesetzt wird.
34:20
Speaker A
Damit dieser das nächste Mal, wenn der Zustand ist Open angenommen wird, eben wieder durch eine steigende Flanke erneut gestartet werden kann.
34:30
Speaker A
So, das wäre also die vollständige Implementierung des UML-Zustandsdiagramms in ST-Code.
34:39
Speaker A
An einer Stelle habe ich aber ein bisschen geschummelt, nämlich im Zustand isClosed.
34:50
Speaker A
Gemäß dem Zustandsdiagramm gibt es hier eine Eingangsaktion setDoneFlag, mit der die Variable bDone auf true gesetzt werden soll.
35:06
Speaker A
Das mache ich in meinem Programm auch.
35:12
Speaker A
Allerdings nicht nur einmal, wie in der Eingangsaktion definiert ist.
35:20
Speaker A
Sondern eben in jedem Zyklus, in dem der Zustand aktiv ist.
35:28
Speaker A
Das heißt, ich behandle hier diese Entry-Aktion wie eine Do-Aktion.
35:32
Speaker A
In diesem Beispiel hat das keine Auswirkung, aber es ist eben nicht ganz korrekt.
35:40
Speaker A
Also ändere ich die Programmierung noch einmal, um euch zu zeigen.
35:48
Speaker A
Wie man diese Entry-Aktion korrekt implementieren kann.
35:55
Speaker A
Dazu deklariere ich noch eine weitere interne boolsche Variable bEntryAct_isClosed.
36:05
Speaker A
Und initialisiere die mit false.
36:09
Speaker A
Diese Initialisierung ist zwar nicht zwingend nötig, weil der Default-Wert von Bool-Variablen ohnehin false ist.
36:20
Speaker A
Aber ich mache das jetzt, um vollständige Klarheit zu schaffen.
36:26
Speaker A
So im Zustand isClosed frage ich dann als erstes ab, ob diese Variable nicht true ist.
36:40
Speaker A
Und wenn das zutrifft, dann wird die Aktion setDoneFlag ausgeführt und zusätzlich wird dann diese neue Variable auf true gesetzt.
36:53
Speaker A
Das heißt also, wenn der Zustand isClosed eingenommen wird, wird dieses If-Statement nur einmal ausgeführt.
37:03
Speaker A
Und damit eben auch alle Anweisungen, die hierin enthalten sind.
37:09
Speaker A
Ganz wichtig ist jetzt noch, dass diese Variable bEntryAct_isClosed wieder auf false gesetzt wird, wenn der Zustand verlassen wird.
37:19
Speaker A
Denn nur so kann ich ja sicherstellen, dass diese Entry-Aktion das nächste Mal, wenn der Zustand eingenommen wird.
37:29
Speaker A
Eben auch wieder ausgeführt wird.
37:33
Speaker A
Okay, damit ist also die Steuerung wirklich vollständig implementiert.
37:40
Speaker A
Und die setze ich jetzt ein, um euch an meinem Demosystem das Verhalten der gesteuerten Tür praktisch und anschaulich zu demonstrieren.
37:50
Speaker A
Dazu habe ich dieses kleine Main-Programm hier geschrieben.
37:56
Speaker A
Zunächst deklariere ich hier einige Variablen und Funktionsbausteine.
38:03
Speaker A
IDF_Stepper ist eine Einzelsteuerfunktion zur Ansteuerung des Schrittmotors.
38:17
Speaker A
Und bStepperEn und nStepperVal sind Variablen, die ich mit den Signalen der Klemme des Motors verbunden habe.
38:33
Speaker A
Und das ist eben ein Freigabesignal und die Vorgabe der Geschwindigkeit.
38:40
Speaker A
bCallOpen, bCallClose und bCallInit sind die Eingänge in die Steuerung für die Anforderung zum Öffnen und Schließen der Tür bzw. zur Initialisierung.
38:56
Speaker A
Und diese Signale habe ich mit diesen Tastern hier verknüpft.
39:05
Speaker A
So bLSOpen_sim und bLSClosed_sim sind dann die Signale der Endlagenschalter.
39:18
Speaker A
Richtige Endlagenschalter habe ich hier nicht, aber ich nutze hier diese Näherungssensoren dafür.
39:30
Speaker A
Und die Tür selber wird durch diesen roten Block dargestellt, der gleich also auf dem Transportband hin und her gefahren wird.
39:43
Speaker A
Und dadurch eben das Öffnen und das Schließen der Tür nachahmt.
39:50
Speaker A
So und dann gibt's ja noch das Signal der Lichtschranke, das habe ich hier bLB_sim genannt.
40:00
Speaker A
Und mit diesem Taster ganz rechts hier verbunden.
40:07
Speaker A
bDone_loc ist das Fertigsignal der Steuerung.
40:14
Speaker A
Dass ich mit dieser LED hier verknüpft habe.
40:20
Speaker A
So und schließlich deklariere ich hier noch den Funktionsbaustein der Steuerung, den ich FB_myDoor nenne.
40:28
Speaker A
Im Anweisungsteil rufe ich dann den Funktionsbaustein der Steuerung auf, übergebe die entsprechenden Variablen.
40:39
Speaker A
Und mache dann noch die Zuweisung der Signale aus der Einzelsteuerfunktion zu den Signalen der Motorklemme.
40:47
Speaker A
Okay, und dann kann die Demo auch starten.
40:50
Speaker A
Zu Beginn liegt der Block irgendwo zwischen den beiden Endlagenschalter, was also bedeutet, dass die Tür halb geöffnet ist.
41:00
Speaker A
Also einen nicht definierten Zustand hat gemäß dem Zustandsdiagramm.
41:09
Speaker A
Dann betätige ich den Taster zur Initialisierung und dann wird die Tür zugefahren.
41:18
Speaker A
Der Block also hier nach rechts geschoben, bis die Endlage erreicht ist.
41:26
Speaker A
Wenn der Block ganz rechts angekommen ist, leuchtet die LED und zeigt damit an, dass das Signal bDone gesetzt ist.
41:36
Speaker A
Und die Steuerung sich im Zustand isClosed befindet.
41:44
Speaker A
Jetzt wartet die Steuerung dann auf eine Anforderung zum Öffnen der Tür.
41:52
Speaker A
Und die gebe ich durch Drücken dieses Tasters hier.
41:59
Speaker A
Dann öffnet sich die Tür, bis die Endlage hinten erreicht ist.
42:06
Speaker A
Dann startet der Timer mit der Zeit von 3 Sekunden.
42:10
Speaker A
Und dann wird die Tür wieder zugefahren, bis eben wieder die Endlage zu erreicht wird.
42:19
Speaker A
So, jetzt öffne ich die Tür noch ein zweites Mal.
42:26
Speaker A
Und wenn die Tür dann wieder zufährt, simuliere ich durch Drücken dieses Tasters eine Durchbrechung der Lichtschranke.
42:37
Speaker A
Jetzt seht ihr, dass die Tür die Fahrtrichtung wechselt und wieder auffährt.
42:45
Speaker A
Und wenn die Tür jetzt ganz geöffnet ist, gebe ich das Signal zum Schließen der Tür.
42:55
Speaker A
Jetzt wird die Tür also geschlossen, noch bevor der Timer abgelaufen ist.
43:03
Speaker A
Okay, damit habe ich jetzt das Verhalten der Steuerung in allen Zuständen und Zustandsübergängen an dieser Demonstration einmal praktisch gezeigt.
43:07
Speaker A
Zu Beginn dieses Videos habe ich ja schon erwähnt, dass die IEC 61131 speziell für die Implementierung von Ablaufsteuerung eine eigene Sprache anbietet, nämlich die Ablaufsprache.
43:20
Speaker A
Wie genau ihr in dieser Ablaufsprache programmiert, werde ich hier nicht thematisieren.
43:29
Speaker A
Dazu findet ihr in der Literatur oder auch auf YouTube andere Kanäle und Videos, die das ganz gut erläutern.
43:34
Speaker A
Ich werde jetzt hier nur einmal die vollständig in der Ablaufsprache implementierte Türsteuerung vorstellen.
43:41
Speaker A
Um euch die Analogie zum UML-Zustandsdiagramm zu zeigen.
43:46
Speaker A
Für diese zweite Art der Implementierung der Steuerung habe ich im Projektmappen-Explorer wieder einen Funktionsbaustein angelegt und der heißt auch wieder FB_DoorControl, aber mit dem Zusatz _AS.
43:59
Speaker A
Und als Sprache für die Implementierung habe ich hier natürlich die Ablaufsprache gewählt.
44:06
Speaker A
Okay, der Deklarationsteil dieses FBs ist mit Ausnahme des Namens fast komplett identisch.
44:16
Speaker A
Mit dem Funktionsbaustein, den ich zuvor in ST implementiert habe.
44:25
Speaker A
Eine interne Variable habe ich jetzt hier aber nicht, die ich bei der Umsetzung in ST hatte.
44:36
Speaker A
Nämlich den Merker für den Zustand vom Typ E_DcState.
44:44
Speaker A
Aber bezüglich der Ein- und Ausgaben ist dieser Funktionsbaustein also gleich mit der Realisierung in ST.
44:55
Speaker A
Was auch gleich noch mal für die Verwendung im Main-Programm wichtig ist.
45:00
Speaker A
Jetzt gehe ich auf den Anweisungsteil ein und der ist eben in dieser Blockorientierten Sprache programmiert.
45:09
Speaker A
Jeder Block entspricht also einem Zustand aus dem Zustandsdiagramm und die Blöcke haben auch Namen, die mit den Bezeichnungen aus dem Modell übereinstimmen.
45:22
Speaker A
Der Block idle hat einen doppelten Rahmen.
45:29
Speaker A
Und ist damit als Einstiegszustand definiert.
45:36
Speaker A
Die Übergänge zwischen den Zuständen sind durch diese Linien hier markiert.
45:43
Speaker A
Und die Bedingungen für die Transition seht ihr an diesen Balken angetragen.
45:50
Speaker A
Und diese Bedingungen entsprechen eben auch wieder den Angaben im Zustandsdiagramm.
45:58
Speaker A
Bei der letzten Transition hier ganz unten seht ihr dann noch einen Pfeil, das ist eine sogenannte Sprungmarke.
46:08
Speaker A
Wenn die Steuerung an dieser Stelle angekommen ist, springt sie also in den hier angegebenen Zustand, also in closing.
46:19
Speaker A
Was man aus der Darstellung in der Ablaufsprache nicht unmittelbar entnehmen kann ist, welche Aktion in dem jeweiligen Zustand ausgeführt werden.
46:30
Speaker A
Allerdings sieht man, dass Aktionen ausgeführt werden.
46:40
Speaker A
Ein E in der linken unteren Ecke eines Zustands bedeutet, dass eine Entry-Aktion ausgeführt wird.
46:53
Speaker A
Das X heißt, dass es hier eine Exit-Aktion gibt.
47:01
Speaker A
Und diese ausgefüllte Ecke hier oben rechts heißt, dass eine Do-Aktion definiert ist.
47:09
Speaker A
Diese Aktionen könnt ihr einem FB hinzufügen, wenn ihr mit Rechtsklick auf den FB klickt.
47:18
Speaker A
Und dann hinzufügen Aktionen wählt.
47:22
Speaker A
Dann müsst ihr der Aktion einen Namen geben.
47:30
Speaker A
Am besten Fall ist das derselbe wie der, den ihr im Zustandsdiagramm gewählt habt.
47:38
Speaker A
Und dann könnt ihr wieder auswählen, in welcher Sprache diese Aktion implementiert werden soll.
47:46
Speaker A
In meinem Beispiel habe ich da immer die Sprache ST gewählt.
47:50
Speaker A
So und wie diese Aktionen bei der Türsteuerung aussehen, zeige ich euch einmal im Schnelldurchlauf.
47:59
Speaker A
In closing gibt es also eine Do-Aktion, in der der Motor gestartet wird.
48:10
Speaker A
Und in der Exit-Aktion wird der Motor gestoppt.
48:17
Speaker A
Wenn die Tür zugefahren ist, gibt es in isClosed eine Entry-Aktion, in der das Done-Flag gesetzt wird.
48:27
Speaker A
Und in der Exit-Aktion wird das Flag wieder zurückgesetzt.
48:30
Speaker A
Der Zustand opening verhält sich ähnlich wie closing.
48:36
Speaker A
Da wird also wieder der Antrieb eingeschaltet.
48:41
Speaker A
Und beim Verlassen des Zustands wird der Antrieb ausgeschaltet.
48:48
Speaker A
Und in is_Open wird dann der Timer gestartet, um beim Verlassen wieder zurückgesetzt.
48:58
Speaker A
So, das ist also die Steuerung in der Ablaufsprache.
49:05
Speaker A
Und die kann ich jetzt auch wieder in meinem Main-Programm ganz einfach einbinden.
49:12
Speaker A
Weil nämlich die Deklaration der Steuerung hinsichtlich der Ein- und Ausgangssignale identisch ist mit der vorherigen Implementierung in ST.
49:26
Speaker A
Daher kann ich jetzt einfach in der Deklaration des FBs in Main den Datentypen ändern.
49:34
Speaker A
Und dazu ergänze ich hier ein _AS.
49:39
Speaker A
So, das ist auch schon alles.
49:42
Speaker A
Auf eine praktische Demo zu dieser Implementierung verzichte ich jetzt aber, weil ihr da überhaupt keinen Unterschied sehen würdet.
49:55
Speaker A
Im Vergleich zu dem, was ich euch vorher schon gezeigt habe.
50:00
Speaker A
So, mit der Ablaufsprache habe ich euch also eine alternative Möglichkeit für die Implementierung von Ablaufsteuerung aufgezeigt.
50:10
Speaker A
Bleibt dann die Frage, welche Sprache man denn jetzt für die Implementierung von Ablaufsteuerung wählen sollte.
50:16
Speaker A
Darauf kann man keine allgemeingültige Antwort geben.
50:22
Speaker A
Wenn diese Wahl wirklich frei und nicht durch andere Rahmenbedingungen.
50:30
Speaker A
Also z.B. aus einem Projekt oder Vorgaben von Kundenseite vorgegeben ist.
50:38
Speaker A
Entscheiden die Präferenzen des Programmierers.
50:42
Speaker A
Die Ablaufsprache hat den Vorteil, dass man die Struktur der Schrittkette auf einen Blick erfassen kann.
50:50
Speaker A
Andererseits sind die Implementierung der Aktion ziemlich verteilt.
50:57
Speaker A
So dass man eben nicht so schnell nachvollziehen kann, welcher Code denn wirklich in welchem Zustand abgearbeitet wird.
51:07
Speaker A
Das wiederum ist der Vorteil bei der Implementierung in ST.
51:17
Speaker A
Hier hat man nämlich die gesamte Implementierung der Steuerung in einer Datei.
51:27
Speaker A
Vom Aufzählungsdatentypen mal abgesehen.
51:30
Speaker A
Und man hat mehr Freiheiten, um z.B. auch Transitionsabhängige Aktionen zu programmieren.
51:36
Speaker A
Die es in der Ablaufsprache nicht gibt.
Topics:SPS-ProgrammierungAblaufsteuerungUML-ZustandsdiagrammAutomatisierungstechnikSchrittketteIEC 61131strukturierter TextAblaufspracheAufzugsteuerungAmpelsteuerung

Frequently Asked Questions

Was ist eine Ablaufsteuerung und wofür wird sie verwendet?

Eine Ablaufsteuerung ist eine Steuerung, die eine bestimmte Sequenz von Aktionen in einem Prozess oder einer Anlage ausführt. Sie wird verwendet, um Abläufe wie Ampelschaltungen oder Aufzugtürsteuerungen zu realisieren.

Wie werden Zustände und Zustandsübergänge in einem UML-Zustandsdiagramm dargestellt?

Zustände werden als Rechtecke mit einem Namen dargestellt, Zustandsübergänge als Pfeile zwischen Zuständen. Übergänge erfolgen nur, wenn eine definierte Bedingung erfüllt ist, die in eckigen Klammern angegeben wird.

Welche Programmiersprachen werden für die Implementierung von Ablaufsteuerungen in SPS verwendet?

Die Implementierung erfolgt häufig in strukturierter Textsprache (ST) oder in der Ablaufsprache (AS), die speziell für Ablaufsteuerungen gemäß IEC 61131 entwickelt wurde. Beide Sprachen werden im Video verglichen.

Get More with the Söz AI App

Transcribe recordings, audio files, and YouTube videos — with AI summaries, speaker detection, and unlimited transcriptions.

Or transcribe another YouTube video here →