Übungsaufgaben zur SPS-Programmierung in ST

https://bildung.social/@oerinformatik/

https://oer-informatik.de/sps-programmierung-st-uebungsaufgaben

Strukturierter Text, Funktionsbaustein, Instanz, CASE-Anweisung, Laufzeitüberwachung, Simulation, Interface, Vererbung, KI-Assistent, virtuelle SPS, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (Bearbeitungszeit insgesamt 51 min, mehrere Aufgaben): Zwei Übungsaufgaben zur SPS-Programmierung in Strukturiertem Text – von den Bewässerungsschiebern einer Baumschule mit eigenem Funktionsbaustein, Laufzeitüberwachung, Betriebsarten mit CASE und einem Testprotokoll für die Simulation bis zu einer Bausteinbibliothek für die Rührwerke einer Biogasanlage mit Interface und Vererbung, KI-erzeugtem Code zum Prüfen und der Frage, ob die Steuerung als virtuelle SPS laufen soll. Zu jeder Teilaufgabe lässt sich eine Beispiellösung einblenden [AI-Assisted]. (Zuletzt geändert am 11.11.2026)

Diese Übungsaufgaben gehören zum Artikel SPS-Programmierung in Strukturiertem Text: Funktionen, Funktionsbausteine und objektorientierte Erweiterungen. Zeiten, Speicher und KOP/FUP stehen im Artikel SPS-Grundlagen, Schrittketten im Artikel Ablaufsteuerungen mit GRAFCET.

Wortwolke mit den Fachbegriffen der Übungsaufgaben zur SPS-Programmierung in Strukturiertem Text (mit KI erstellt)

Hinweise zur Bearbeitung: Von EGS wird erwartet, dass ihnen Aufgaben auf Profilkompetenz-Ebene (Aufgabe 3.1) keine Probleme bereiten. Aufgaben auf Expertise-Ebene (Aufgabe 4.1) gehen darüber hinaus. Die Beispiellösungen sind immer gleich aufgebaut: Unter Geg. steht, was gegeben ist (bei mehreren Teilaufgaben gemeinsam in der ersten), unter Ges., was gesucht ist. Jede Formel steht zuerst in ihrer Grundform; Umstellungen sind Äquivalenzumformungen, deren Rechenschritt grau rechts neben dem senkrechten Strich steht (Division mit „:“). Einfache Formeln werden römisch nummeriert und ineinander eingesetzt („I in II“), längere Rechnungen nacheinander mit drei signifikanten Stellen. Ergebnisse stehen mit drei signifikanten Stellen doppelt unterstrichen, gerundete mit \approx; wurde mit gerundeten Zwischenergebnissen gerechnet, steht das Ergebnis ohne Rundung darunter. Programme schreibst Du in Strukturiertem Text nach IEC 61131-3 mit Deklarationsteil und Kommentaren; die Namen der Variablen darfst Du anders wählen, wenn Du sie erklärst. Eine Variable mit dem Wert 1 bedeutet „meldet“ bzw. „betätigt“, unabhängig davon, ob der Geber als Schließer oder Öffner angeschlossen ist. Bei „nennen“ genügen Stichworte, bei „beschreiben“, „erklären“, „begründen“ und „beurteilen“ antwortest Du in ganzen Sätzen. Schreib Deine Lösung zuerst vollständig auf, bevor Du die Beispiellösung einblendest.

Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?

Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.

Erstelle neue Übungsaufgaben zum Thema „SPS-Programmierung in ST“.

Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.

Fachliche Grundlage:
- https://oer-informatik.de/sps-programmierung-st
- https://oer-informatik.de/sps-grundlagen
- https://oer-informatik.de/ablaufsteuerung-grafcet
- https://oer-informatik.de/steuerungssicherheit
- Stilbeispiel: https://oer-informatik.de/sps-programmierung-st-uebungsaufgaben

Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- Strukturierter Text
- Funktionsbaustein
- Instanz
- CASE-Anweisung
- Laufzeitüberwachung
- Simulation
- Interface
- Vererbung
- KI-Assistent
- virtuelle SPS

Kompetenzstufe: Profilkompetenz (alternativ: Basiskompetenz, Kernkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan

Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
   abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
   zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
   Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
   Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
   Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
   danach frage.

Aufgabe 3.1: Bewässerungsschieber einer Baumschule (Profilkompetenz)

(ca. 29 min Bearbeitungszeit)

Eine Baumschule bewässert ihre Containerflächen über drei Bewässerungskreise. Jeder Kreis wird über einen Absperrschieber mit elektrischem Spindelantrieb freigegeben; die beiden Drehrichtungen des Antriebs schalten zwei gegeneinander verriegelte Schütze. Je Schieber melden zwei Endschalter die Stellungen „offen“ und „zu“. Ein Regenmelder und ein Bodenfeuchtesensor (Analogeingang) sind für alle Kreise gemeinsam. Die bisherige Zeitschaltuhr-Steuerung soll durch eine SPS ersetzt werden, die Du in ST programmierst.

Variablen der Bewässerungssteuerung
Variable Bedeutung Wert 1 bzw. Inhalt
axTastAuf[1..3], axTastZu[1..3] Handtaster je Schieber Taster betätigt
axEndAuf[1..3], axEndZu[1..3] Endschalter je Schieber Stellung erreicht
xRegen Regenmelder Regen erkannt
xQuittTaster Quittiertaster betätigt
iBetriebsart Wahlschalter (INT) 0 = Hand, 1 = Automatik
iAI_Feuchte Rohwert des Bodenfeuchtesensors (INT) 0 bis 32 767 für 0 % bis 100 %
axMotorAuf[1..3], axMotorZu[1..3] Ausgänge für die Schütze je Schieber Schütz angesteuert

a) Für die neue Steuerung sind drei Teilaufgaben zu programmieren: (1) den Rohwert des Bodenfeuchtesensors in Prozent umrechnen, (2) einen Schieber mit Endlagen und Laufzeitüberwachung ansteuern, (3) Betriebsarten, Regen und alle drei Schieber zusammenführen. Ordne jeder Teilaufgabe die passende Programmorganisationseinheit zu und begründe Deine Wahl. (3 Punkte)

Je Teilaufgabe 1 Punkt (Zuordnung mit Begründung):

  • (1) Umrechnung: Funktion (FUNCTION FC_Feuchte : REAL). Das Ergebnis hängt nur vom Rohwert ab; der Baustein braucht kein Gedächtnis und liefert einen Rückgabewert.

  • (2) Schieber: Funktionsbaustein (FUNCTION_BLOCK FB_Schieber). Er muss sich die Störung und die abgelaufene Laufzeit merken (Instanz von TON); jeder der drei Schieber bekommt eine eigene Instanz mit eigenen Daten.

  • (3) Zusammenführung: Programm (PROGRAM PRG_Bewaesserung). Es wird von der zyklischen Task aufgerufen, liest Betriebsart und Regen und ruft die drei Instanzen und die Funktion auf.

b) Der Spindelantrieb bewegt den Schieber mit 9 mm/s, der Hub zwischen „zu“ und „offen“ beträgt 360 mm. Die Laufzeitüberwachung soll 25 % über der regulären Fahrzeit ansprechen. Berechne die Überwachungszeit und gib sie als TIME-Literal an. (3 Punkte)

Geg.: Hub s = 360\ \mathrm{mm}, Geschwindigkeit v = 9\ \mathrm{mm/s}, Zuschlag z = 25\ \% = 0{,}25

Ges.: Überwachungszeit t_\mathrm{\ddot{U}} als TIME-Literal

\begin{aligned} &\text{(I)} && t_\mathrm{F} = \frac{s}{v} \\ &\text{(II)} && t_\mathrm{\ddot{U}} = t_\mathrm{F} \cdot (1 + z) \end{aligned}

I in II (Fahrzeit 1 Punkt, Überwachungszeit 1 Punkt):

t_\mathrm{\ddot{U}} = \frac{s}{v} \cdot (1 + z) = \frac{360\ \mathrm{mm}}{9\ \mathrm{mm/s}} \cdot 1{,}25 = 40{,}0\ \mathrm{s} \cdot 1{,}25 = \underline{\underline{50{,}0\ \mathrm{s}}}

Als TIME-Literal (1 Punkt): T#50S. Die reguläre Fahrzeit beträgt 40 s; erst wenn ein Motor 10 s länger läuft, ohne dass der Endschalter meldet, gilt der Schieber als blockiert.

c) Erstelle den Funktionsbaustein FB_Schieber in ST (Deklaration und Anweisungsteil). Anforderungen: Der Motor fährt auf, solange der Befehl „öffnen“ anliegt und die Endlage „offen“ nicht erreicht ist, entsprechend zu. Liegen beide Befehle an, hat „schließen“ Vorrang. Die beiden Motorausgänge dürfen nie gleichzeitig 1 sein. Läuft ein Motor länger als die Überwachungszeit aus b), wird eine Störung gespeichert, die beide Motoren abschaltet. Quittieren ist nur wirksam, wenn kein Befehl anliegt. (10 Punkte)

Beispiellösung (Bewertung: Deklaration mit Eingängen, Ausgängen und statischer TON-Instanz 3 Punkte, Aufruf der Zeit in jedem Zyklus mit Motorlauf als Eingang 2 Punkte, Störspeicher mit Vorrang und Quittierbedingung 2 Punkte, Motorausgänge mit Endlagen und Störung 2 Punkte, Vorrang „schließen“ und gegenseitiger Ausschluss 1 Punkt):

FUNCTION_BLOCK FB_Schieber
// Ansteuerung eines Absperrschiebers mit Endlagen und Laufzeitüberwachung
// Version 1.0
VAR_INPUT
    xOeffnen    : BOOL;            // Befehl öffnen
    xSchliessen : BOOL;            // Befehl schließen (Vorrang)
    xEndAuf     : BOOL;            // Endschalter offen, 1 = erreicht
    xEndZu      : BOOL;            // Endschalter zu, 1 = erreicht
    xQuitt      : BOOL;            // Störung quittieren
    tLaufzeit   : TIME := T#50S;   // Überwachungszeit aus b)
END_VAR
VAR_OUTPUT
    xMotorAuf   : BOOL;            // Schütz "auf"
    xMotorZu    : BOOL;            // Schütz "zu"
    xStoerung   : BOOL;            // Laufzeitstörung gespeichert
END_VAR
VAR
    tonLaufzeit : TON;             // eigene Zeit je Instanz
END_VAR

    // Zeit läuft, solange ein Motor angesteuert ist (Wert aus dem letzten Zyklus)
    tonLaufzeit(IN := xMotorAuf OR xMotorZu, PT := tLaufzeit);

    IF tonLaufzeit.Q THEN
        xStoerung := TRUE;                                   // Vorrang: Störung
    ELSIF xQuitt AND NOT xOeffnen AND NOT xSchliessen THEN
        xStoerung := FALSE;                                  // Quittieren ohne Befehl
    END_IF;

    xMotorZu  := xSchliessen AND NOT xEndZu AND NOT xStoerung;
    xMotorAuf := xOeffnen AND NOT xSchliessen AND NOT xEndAuf AND NOT xStoerung;
END_FUNCTION_BLOCK

Weil xMotorAuf den Term NOT xSchliessen enthält, können beide Ausgänge nie gleichzeitig 1 sein. Die Verriegelung der Schütze über Hilfsöffner bleibt in der Hardware trotzdem bestehen. Andere Lösungen (z. B. mit IF-Zweigen statt Zuweisungen oder mit einer Umschaltpause beim Richtungswechsel) sind gleichwertig, wenn alle Anforderungen erfüllt sind und tonLaufzeit in jedem Zyklus aufgerufen wird.

d) Erstelle das Programm PRG_Bewaesserung, das die drei Schieber über ein Feld von Instanzen und eine Schleife ansteuert. In der Betriebsart Hand folgen die Schieber ihren Handtastern. In der Betriebsart Automatik öffnen alle Schieber, wenn die Bodenfeuchte unter 30 % sinkt, und schließen ab 45 %; dazwischen bleibt der letzte Befehl bestehen. Ein ungültiger Wert der Betriebsart schließt alle Schieber. Meldet der Regenmelder, schließen die Schieber in jeder Betriebsart. Nutze für die Betriebsarten eine CASE-Anweisung; die Umrechnung des Feuchtewerts darfst Du als Funktion FC_Feuchte(iRoh) voraussetzen. (6 Punkte)

Beispiellösung (Bewertung: Feld von Instanzen und Schleife 1 Punkt, Zweipunktverhalten mit Hysterese 1 Punkt, CASE mit Hand, Automatik und ELSE-Zweig 2 Punkte, Vorrang Regen 1 Punkt, Aufruf der Instanzen und Zuweisung der Ausgänge 1 Punkt):

PROGRAM PRG_Bewaesserung
VAR
    aSchieber   : ARRAY[1..3] OF FB_Schieber;   // drei Instanzen
    rFeuchte  : REAL;                        // Bodenfeuchte in %
    xAutoAuf  : BOOL;                        // Automatik verlangt "offen"
    xOeff     : BOOL;                        // Befehl für den aktuellen Schieber
    xSchl     : BOOL;
    i         : INT;
END_VAR

    rFeuchte := FC_Feuchte(iRoh := iAI_Feuchte);

    // Zweipunktverhalten: dazwischen bleibt xAutoAuf unverändert
    IF rFeuchte < 30.0 THEN
        xAutoAuf := TRUE;
    ELSIF rFeuchte >= 45.0 THEN
        xAutoAuf := FALSE;
    END_IF;

    FOR i := 1 TO 3 DO
        CASE iBetriebsart OF
            0:  // Hand
                xOeff := axTastAuf[i];
                xSchl := axTastZu[i];
            1:  // Automatik
                xOeff := xAutoAuf;
                xSchl := NOT xAutoAuf;
        ELSE    // ungültige Betriebsart: schließen
                xOeff := FALSE;
                xSchl := TRUE;
        END_CASE;

        IF xRegen THEN          // Vorrang in jeder Betriebsart
            xOeff := FALSE;
            xSchl := TRUE;
        END_IF;

        aSchieber[i](xOeffnen := xOeff, xSchliessen := xSchl,
                   xEndAuf := axEndAuf[i], xEndZu := axEndZu[i],
                   xQuitt := xQuittTaster);
        axMotorAuf[i] := aSchieber[i].xMotorAuf;
        axMotorZu[i]  := aSchieber[i].xMotorZu;
    END_FOR;
END_PROGRAM

Der Befehl „schließen“ darf in der Automatik dauernd anliegen, weil der Baustein den Motor an der Endlage „zu“ abschaltet. Jede Instanz wird in jedem Zyklus genau einmal aufgerufen.

e) Ein Kollege möchte die Bedingung für xMotorAuf aus c) lieber im Funktionsplan sehen. Beschreibe das FUP-Netzwerk für diese Bedingung und vergleiche ST und FUP für den Baustein FB_Schieber mit je einem Vorteil. (4 Punkte)

  • FUP-Netzwerk (2 Punkte): ein UND-Baustein mit vier Eingängen: xOeffnen direkt, xSchliessen, xEndAuf und xStoerung jeweils negiert (Negationskreis am Eingang). Der Ausgang geht auf die Zuweisung xMotorAuf.

  • Vorteil FUP (1 Punkt): Der Signalfluss ist grafisch sichtbar; bei der Fehlersuche sieht die Instandhaltung online sofort, welcher Eingang die Freigabe verhindert.

  • Vorteil ST (1 Punkt): Der ganze Baustein mit Störspeicher, Zeit und beiden Richtungen steht kompakt auf wenigen Zeilen, lässt sich kommentieren, als Text vergleichen und mit einer Schleife für alle Schieber wiederverwenden.

f) Bevor das Programm auf die Anlage geladen wird, testest Du FB_Schieber in einer Simulationsumgebung. Ergänze das Testprotokoll für die Testfälle T2 bis T5. Nenne außerdem zwei weitere Angaben, die in ein Testprotokoll gehören. (6 Punkte)

Testprotokoll für FB_Schieber (Vorgabe)
Nr. Prüfziel Ausgangszustand simulierte Eingaben erwartetes Ergebnis
T1 Normalbetrieb öffnen Schieber zu, keine Störung xOeffnen := 1, nach 40 s xEndAuf := 1 xMotorAuf = 1, nach 40 s xMotorAuf = 0, keine Störung
T2 Vorrang schließen
T3 Laufzeitüberwachung
T4 Quittieren gesperrt
T5 Quittieren wirksam

Je Testfall 1 Punkt, weitere Angaben 2 Punkte:

Testprotokoll für FB_Schieber (Lösung)
Nr. Prüfziel Ausgangszustand simulierte Eingaben erwartetes Ergebnis
T1 Normalbetrieb öffnen Schieber zu, keine Störung xOeffnen := 1, nach 40 s xEndAuf := 1 xMotorAuf = 1, nach 40 s xMotorAuf = 0, keine Störung
T2 Vorrang schließen Schieber halb offen (beide Endschalter 0), keine Störung xOeffnen := 1 und xSchliessen := 1 xMotorZu = 1, xMotorAuf = 0
T3 Laufzeitüberwachung Schieber zu, keine Störung xOeffnen := 1, xEndAuf bleibt 0 bis 50 s xMotorAuf = 1, danach xStoerung = 1 und xMotorAuf = 0
T4 Quittieren gesperrt Störung aus T3, xOeffnen = 1 xQuitt := 1 xStoerung bleibt 1
T5 Quittieren wirksam Störung aus T3 xOeffnen := 0, dann xQuitt := 1 xStoerung = 0, beide Motoren 0

Weitere Angaben (je 1 Punkt, zwei genügen): beobachtetes Ergebnis und Bewertung (i. O./n. i. O.) je Testfall, Datum und Name, Programm- bzw. Bausteinversion, verwendete Simulationsumgebung. Die Erwartungswerte wurden vorab mit einer Nachbildung des Bausteins geprüft (Störung nach 50,0 s, vorher nicht).

Aufgabe 4.1: Bausteinbibliothek für die Rührwerke einer Biogasanlage (Expertise)

(ca. 22 min Bearbeitungszeit)

Ein Anlagenbauer für landwirtschaftliche Biogasanlagen stellt seine Steuerungen auf eine eigene Bausteinbibliothek um. Im Fermenter einer neuen Anlage arbeiten zwei Tauchmotor-Rührwerke mit einer Drehrichtung und ein langsam laufendes Paddelrührwerk, das zum Lösen von Schwimmschichten auch rückwärts laufen soll. Für alle Rührwerke gibt es bereits den Basisbaustein FB_Ruehrwerk mit den öffentlichen Methoden Starten() : BOOL, Stoppen() und Quittieren(), den geschützten Variablen xBefehl und xStoerung und dem Ausgang xMotor. Die Leitung überlegt außerdem, die Steuerung künftig als virtuelle SPS auf einem Industrie-PC im Betriebsgebäude laufen zu lassen.

a) Beschreibe, wie die Bibliothek ein Interface I_Ruehrwerk und Vererbung für die drei Rührwerke nutzen kann, und begründe den Nutzen für die Bibliothek mit zwei Argumenten. (4 Punkte)

  • Einsatz (2 Punkte): I_Ruehrwerk legt die Methoden Starten, Stoppen und Quittieren als Vertrag fest; FB_Ruehrwerk setzt das Interface um (IMPLEMENTS I_Ruehrwerk). Die Tauchmotor-Rührwerke sind zwei Instanzen von FB_Ruehrwerk. Für das Paddelrührwerk entsteht FB_RuehrwerkReversierbar EXTENDS FB_Ruehrwerk, der Überwachung, Störspeicher und Methoden erbt und nur die Rückwärtsrichtung ergänzt.

  • Nutzen (je Argument 1 Punkt): Der geprüfte Basisbaustein wird nicht kopiert und nicht geändert, eine Korrektur wirkt in allen abgeleiteten Bausteinen. Programme, die nur das Interface kennen (z. B. „alle Rührwerke stoppen“ in einer Schleife über ARRAY OF I_Ruehrwerk), funktionieren mit jedem neuen Rührwerkstyp unverändert. Auch genannt werden kann: einheitliche Bedienung und Visualisierung aller Rührwerke, getrennte Tests von Basis- und Zusatzfunktion.

b) Erstelle in ST das Interface I_Ruehrwerk und den Baustein FB_RuehrwerkReversierbar. Er erhält einen zusätzlichen Ausgang für das Rückwärts-Schütz, eine Methode StartenRueck() : BOOL, die nur ohne Störung und nur bei stehendem Vorwärtsbetrieb einen Rückwärtsbefehl speichert, und eine überschriebene Methode Stoppen, die beide Richtungen beendet. (6 Punkte)

Beispiellösung in der Schreibweise der Norm (Bewertung: Interface mit drei Methoden 1 Punkt, EXTENDS mit neuem Ausgang und geschützter Variable 1 Punkt, StartenRueck mit Verriegelung und Rückgabewert 2 Punkte, Stoppen mit OVERRIDE und Aufruf der Basismethode 1 Punkt, Rumpf mit Ansteuerung des Rückwärts-Schützes und Aufruf des Basisrumpfs 1 Punkt):

INTERFACE I_Ruehrwerk
    METHOD Starten : BOOL
    END_METHOD
    METHOD Stoppen
    END_METHOD
    METHOD Quittieren
    END_METHOD
END_INTERFACE

FUNCTION_BLOCK FB_RuehrwerkReversierbar EXTENDS FB_Ruehrwerk
VAR_OUTPUT
    xMotorRueck  : BOOL;          // Schütz rückwärts
END_VAR
VAR PROTECTED
    xBefehlRueck : BOOL;          // gespeicherter Rückwärtsbefehl
END_VAR

    SUPER^();                     // Rumpf des Basisbausteins (Überwachung, xMotor)
    xMotorRueck := xBefehlRueck AND NOT xBefehl AND NOT xStoerung;

    METHOD PUBLIC StartenRueck : BOOL
        IF NOT xStoerung AND NOT xBefehl THEN   // Verriegelung gegen vorwärts
            xBefehlRueck := TRUE;
        END_IF;
        StartenRueck := xBefehlRueck;
    END_METHOD

    METHOD PUBLIC OVERRIDE Stoppen
        xBefehlRueck := FALSE;
        SUPER^.Stoppen();         // vorwärts wie im Basisbaustein beenden
    END_METHOD
END_FUNCTION_BLOCK

SUPER^ ist die Schreibweise verbreiteter Entwicklungsumgebungen (z. B. CODESYS) für den Zugriff auf den Basisbaustein. Damit auch Starten (vorwärts) gegen einen laufenden Rückwärtsbetrieb verriegelt ist, kann es ebenfalls überschrieben werden (zusätzliche Bedingung NOT xBefehlRueck); die Überwachung der Rückmeldung muss beide Richtungen erfassen. Beides wird bei der vollständigen Lösung erwartet, hier aber nicht bepunktet.

c) Für ein kleines Rührwerk in der Vorgrube hat ein Kollege einen KI-Assistenten einen einfachen Baustein ohne Methoden erzeugen lassen. Der Motor soll mit xStart anlaufen, mit dem Aus-Taster oder bei ausgelöstem Motorschutz sofort stoppen und bei fehlender Rückmeldung nach 3 s eine Störung speichern, die den Motor abschaltet. Untersuche den Code: Nenne vier Fehler und gib jeweils eine Korrektur an. (8 Punkte)

FUNCTION_BLOCK FB_RuehrwerkVorgrube
VAR_INPUT
    xStart       : BOOL;     // Ein-Taster
    xAus         : BOOL;     // Aus-Taster (Öffner), 1 = nicht betätigt
    xMotorschutz : BOOL;     // 1 = Motorschutz in Ordnung
    xRueckmeld   : BOOL;     // Hilfskontakt des Schützes
END_VAR
VAR_OUTPUT
    xMotor       : BOOL;
    xStoerung    : BOOL;
END_VAR
VAR
    tonUeberwach : TON;
END_VAR

    IF xStart THEN
        xMotor := TRUE;
    ELSIF NOT xAus OR NOT xMotorschutz THEN
        xMotor := FALSE;
    END_IF;

    IF xMotor AND NOT xRueckmeld THEN
        tonUeberwach(IN := TRUE, PT := T#3S);
    END_IF;
    IF tonUeberwach.Q THEN
        xStoerung := TRUE;
    END_IF;

    WHILE xMotor AND NOT xRueckmeld DO
        xStoerung := xStoerung;     // auf Rückmeldung warten
    END_WHILE;
END_FUNCTION_BLOCK

Je Fehler 1 Punkt, je passender Korrektur 1 Punkt:

  1. Falscher Vorrang: xStart steht im ersten Zweig und gewinnt. Bei gedrücktem Ein-Taster läuft der Motor, obwohl der Aus-Taster betätigt oder der Motorschutz ausgelöst ist (setzdominant). Korrektur: Abschaltbedingung zuerst prüfen (IF NOT xAus OR NOT xMotorschutz OR xStoerung THEN xMotor := FALSE; ELSIF xStart THEN xMotor := TRUE; END_IF;).

  2. Zeitglied nur bedingt aufgerufen: tonUeberwach wird nur im IF-Zweig und immer mit IN := TRUE aufgerufen. Kommt die Rückmeldung, wird die Zeit nie zurückgesetzt; beim nächsten Fehlerfall ist sie schon abgelaufen oder wird falsch weitergezählt. Korrektur: in jedem Zyklus aufrufen, tonUeberwach(IN := xMotor AND NOT xRueckmeld, PT := T#3S); (besser xMotor XOR xRueckmeld, dann wird auch ein verschweißter Kontakt erkannt).

  3. Störung ohne Wirkung und ohne Rücksetzen: xStoerung schaltet den Motor nicht ab und wird nie zurückgesetzt. Korrektur: xStoerung in die Abschaltbedingung aufnehmen (siehe 1.) und einen Quittiereingang ergänzen, der die Störung nur ohne Startbefehl zurücksetzt.

  4. Warteschleife auf einen Eingang: Die WHILE-Schleife wartet innerhalb eines Zyklus auf xRueckmeld. Das Prozessabbild ändert sich während des Zyklus nicht; die Schleife endet nie, und die Zykluszeitüberwachung stoppt die CPU. Korrektur: Schleife ersatzlos streichen; das Warten übernimmt das Zeitglied, das in jedem Zyklus neu abgefragt wird.

Vor dem Einsatz wird der korrigierte Baustein mit eigenen, aus den Anforderungen abgeleiteten Testfällen in der Simulation getestet; die KI-Ausgabe ersetzt diese Prüfung nicht.

d) Beurteile, ob die Steuerung der Biogasanlage als virtuelle SPS auf dem Industrie-PC laufen sollte. Gehe auf zwei Chancen, zwei Grenzen und auf die sicherheitsgerichteten Funktionen der Anlage (z. B. Gaswarnanlage, Überdrucksicherung) ein und gib eine Empfehlung. (6 Punkte)

Beispielhafte Beurteilung (je Chance und Grenze 1 Punkt, Sicherheitsfunktionen 1 Punkt, begründete Empfehlung 1 Punkt):

  • Chancen: Die Hardware ist austauschbar und kann zentral gesichert und aktualisiert werden; die Bausteinbibliothek läuft in derselben Laufzeitumgebung wie beim Test in der Simulation; Betriebsdaten (Rührzeiten, Störungen, Gasertrag) lassen sich ohne zusätzliche Kopplung auswerten; mehrere Anlagenteile können auf einem Rechner laufen.

  • Grenzen: Die Echtzeit hängt von Rechner, Virtualisierung und Netzwerk ab; Ein- und Ausgänge im Fermenterbereich laufen über einen Feldbus, dessen Ausfall die ganze Anlage betrifft; der Industrie-PC muss gepatcht und gegen Angriffe geschützt werden, was IT-Wissen beim Betreiber verlangt; im landwirtschaftlichen Betrieb ist Personal für die Störungsbehebung oft nicht sofort verfügbar.

  • Sicherheitsfunktionen: Gaswarnanlage, Überdrucksicherung und NOT-HALT müssen unabhängig von der Prozesssteuerung wirken und bleiben auf zertifizierter Sicherheitstechnik (Sicherheitsschaltgerät, Sicherheits-SPS bzw. zugelassene virtuelle Sicherheitssteuerung) sowie auf mechanischen Sicherungen. Sie gehören nicht in die Bausteinbibliothek der Prozesssteuerung.

  • Empfehlung (Beispiel): Die Prozesssteuerung der Rührwerke kann als virtuelle SPS laufen, wenn eine Ersatzhardware und eine geprüfte Sicherung bereitstehen, der Feldbus redundant bzw. überwacht ist und Zuständigkeiten für IT-Sicherheit geklärt sind. Die Sicherheitsfunktionen bleiben getrennt. Auch eine begründete Ablehnung (z. B. wegen fehlender IT-Betreuung) ist richtig.


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zur SPS-Programmierung in ST” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/sps-programmierung-st-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/elektrotechnik/steuerungstechnik. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 11.11.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: