V-SPS – Structured Text, IF, CASE und Simulation
Simulationslogik Schritt für Schritt erstellen: IF- und CASE-Blöcke an der Cursorposition einfügen, Befehle ergänzen und den Ablauf mit Start, Pause, Weiter und Stop testen.
ST: hier beginnen
Die V-SPS verwendet ausschließlich Structured Text (ST). Unterstützt wird ein begrenzter, an IEC 61131-3 angelehnter Umfang mit zusätzlichen Simulationsbefehlen. Die Variablen stammen aus der SPS-Tabelle; eine Variablendeklaration im Programm ist nicht erforderlich.
- V-SPS-Eigenschaften öffnen und V-SPS-Logik einstellen wählen.
- Neues ST-Programm erzeugt
PROGRAM V_SPS, eine freie Zeile undEND_PROGRAM. Der bisherige Editorinhalt wird ersetzt. Strg+Z macht das Ersetzen rückgängig. - Den Cursor auf eine freie Zeile innerhalb des Programmgerüsts setzen. Für einen weiteren unabhängigen Block eine Zeile zwischen den vorhandenen Blöcken wählen.
- Befehl einfügen → Neuer IF-Block oder CASE … OF (Select Case) auswählen, die Felder ausfüllen und die Vorschau prüfen.
- Nach Einfügen steht der Cursor in der ersten freien Aktionszeile. Dort die benötigten Aktionen ergänzen.
- Im Haupteditor Übernehmen wählen, die Objekteigenschaften bestätigen und das Projekt speichern.
Einfügen erstellt zunächst eine Vorlage. Leere IF- oder CASE-Zweige sind noch kein ausführbares Programm. Der Name im Befehlsdialog erscheint als // Kommentar; er legt keine Variable an.
Alte Texte mit NETWORK und END_NETWORK werden im Editor nicht mehr akzeptiert. Vorhandenen Text bei Bedarf sichern und ein neues ST-Programm erstellen; eine automatische Umwandlung findet nicht statt.
Was macht die V-SPS?
Die virtuelle SPS prüft im Playmodus wiederholt Bedingungen und verändert zugeordnete Simulationswerte. Im ersten Beispiel bedeutet das: Wenn die Freigabe eingeschaltet ist, kopiere den Sollwert in die Zahlenanzeige.
- Projekt ohne ausgewählten Kommunikationstreiber: Die V-SPS arbeitet mit lokalen Simulationswerten. Dafür ist kein externer Testserver erforderlich. Diese Betriebsart steht auch für lokale Demo-Übungen zur Verfügung.
- Projekt mit ausgewähltem Kommunikationstreiber: Der lokale Projektsimulator muss aktiviert und online sein. Die verwendeten Symbole müssen zum lokalen Simulator gehören; beliebige entfernte SPS-Verbindungen erfüllen diese Voraussetzung nicht.
F5 öffnet den Playmodus. Anschließend die V-SPS mit ihrem eigenen Start-Button starten. Die Auswahl einer Play-Startseite startet die V-SPS nicht automatisch. Beispiele: Demo-Kreuzung und Tankdemo.
V-SPS einfügen
Wählen Sie Struktur → V-SPS. Öffnen Sie die Objekteigenschaften. Das Beispiel verwendet X = 20, Y = 130, Breite = 420 und Höhe = 170. Unter Text / Startwert steht „Simulationslogik“.
Öffnen Sie V-SPS-Logik einstellen. Ein neu eingefügtes Objekt benötigt zuerst gültige Symbole und ein übernommenes ST-Programm.
Befehle mit Vorlagen einfügen
Der Dialog enthält 13 Vorlagen. Über Symbol öffnen Sie die Variablenliste mit Suche und Filtern. Ein Doppelklick übernimmt das Symbol in das Freigabe-, Quell- oder Zielfeld. SPS-Symbol einfügen im Haupteditor setzt den Symbolnamen direkt an die Cursorposition.
Die Einfügestelle bestimmen
Neue IF- und CASE-Blöcke werden an der aktuellen Cursorposition eingefügt. Setzen Sie den Cursor deshalb vor dem Öffnen des Dialogs auf eine freie Zeile an der gewünschten Stelle. Der Editor verschiebt neue Blöcke nicht mehr automatisch vor END_PROGRAM. In einem ganz leeren Editor wird das Programmgerüst mit angelegt.
Für eine Aktion den Cursor in den passenden IF- oder CASE-Zweig setzen. Eine leere Zeile wird mit der Aktion gefüllt; steht dort bereits Text, wird eine neue Zeile darunter eingefügt. Zum Einfügen von WAIT vor einer vorhandenen Aktion zuerst eine freie Zeile oberhalb dieser Aktion anlegen. Die Einfügeprüfung ersetzt nicht die Prüfung des vollständigen Programms mit Übernehmen.
| Vorlage | Felder und erzeugter ST-Text |
|---|---|
| Neuer IF-Block | Name und Freigabesymbol; erzeugt IF Symbol = 1 THEN, eine freie Aktionszeile und END_IF;. |
| CASE … OF (Select Case) | Name und Quellvariable als Auswahlwert; erzeugt die Zweige 0:, 1:, ELSE und END_CASE;. |
| WRITE | Zielvariable und Wert: Ziel := 25;. Die Zahl kann auch in einem IF-Zweig zugewiesen werden. |
| INC / DEC | Ziel, Schrittweite, Zeitabstand in ms, Minimum, Maximum. Vorbelegt: 1, 500 ms, 0 bis 100. |
| INC_ONCE / DEC_ONCE | Ziel, Schrittweite und Grenzen; genau ein Schritt pro Aktivierung, ohne Zeitfeld. |
| WAIT | Zeit in ms: WAIT(T#500ms);. Vor eine passende Aktion setzen. |
| RND | Ziel, Minimum, Maximum: Ziel := RND(1, 10);. In einem IF-Zweig verwenden. |
| MOVE | Quellvariable und Zielvariable: MOVE(Quelle, Ziel);. |
| COPY_WORDS | Quelle, Ziel und Anzahl zusammenhängender 16-Bit-Wörter. |
| SET / RESET | Ziel und Bitnummer: erzeugt Ziel := TRUE; bzw. Ziel := FALSE;. Bit −1 gilt für ein ganzes BOOL-Symbol, eine Bitnummer für ein Wort. |
Alle sichtbaren Felder müssen ausgefüllt sein. Zahlen, Zieltypen und Schreibrechte werden bei Aktionsvorlagen geprüft; bei Übernehmen folgt die Prüfung des gesamten Programms. Die Standardwerte sind Vorschläge: Grenzen und Zeitabstände passend zum Projekt einstellen.
Das Beispielprogramm eingeben
Der zuerst angezeigte Befehlsvorrat enthält Platzhaltersymbole. Ersetzen Sie den gesamten Mustertext durch dieses kurze Programm:
PROGRAM Sollwert_Kopieren
IF Anlage_Freigabe = 1 THEN
Anlage_Zahlenwert := Anlage_Sollwert;
END_IF;
END_PROGRAMDie folgenden Symbole müssen in der Kommunikationstabelle vorhanden sein. In diesem Projekt gehören sie zum lokalen Modbus_Testserver und verwenden UINT16:
| Symbol | Adresse |
|---|---|
| Anlage_Freigabe | 40004 |
| Anlage_Sollwert | 40007 |
| Anlage_Zahlenwert | 40008 |
Über SPS-Symbol einfügen können Sie vorhandene Projektsymbole auswählen und an der Cursorposition einfügen. Für dieses Beispiel werden keine neuen Symbole benötigt.
Klicken Sie auf Übernehmen. Dabei werden Syntax und verwendete Symbole geprüft. Bestätigen Sie auch die Objekteigenschaften und speichern Sie das Projekt.
Jede Zeile einfach erklärt
| Befehl / Zeichen | Bedeutung |
|---|---|
| PROGRAM Sollwert_Kopieren | Hier beginnt das Programm. Sollwert_Kopieren ist sein frei gewählter Name. |
| IF | Bedeutet „wenn“ und beginnt eine Bedingung. |
| Anlage_Freigabe = 1 | Prüft, ob das Symbol Anlage_Freigabe den Wert 1 hat. Das Gleichheitszeichen vergleicht und verändert keinen Wert. |
| THEN | Bedeutet „dann“: Die folgende Anweisung wird ausgeführt, wenn die Bedingung stimmt. |
| Anlage_Zahlenwert := Anlage_Sollwert; | Kopiert den Wert rechts in das Ziel links. Anlage_Sollwert ist die Quelle, Anlage_Zahlenwert das Ziel. Die Quelle bleibt unverändert. |
| := | Eine Zuweisung: Schreibe den rechten Wert in das linke Ziel. |
| ; | Beendet die Anweisung, ähnlich wie ein Punkt einen Satz beendet. |
| END_IF; | Beendet die Wenn-Dann-Anweisung. |
| END_PROGRAM | Beendet den Programmtext. |
Merksatz: = vergleicht, := weist einen Wert zu. Einrückungen helfen beim Lesen. In diesem Programm gibt es keinen ELSE-Zweig: Bei Freigabe 0 erfolgt keine Zuweisung, der Zahlenwert bleibt erhalten.
Solange die V-SPS läuft, prüft sie die Bedingung wiederholt. Die Freigabe wirkt hier als dauerhafte Erlaubnis zum Kopieren, nicht nur als einmaliger Auslöser.
Bedienelemente für den Versuch
Ordnen Sie auf der Seite einen Freigabeschalter für Anlage_Freigabe an, der zwischen 0 und 1 umschaltet. Verwenden Sie eine Werteingabe für Anlage_Sollwert und eine Wertanzeige für Anlage_Zahlenwert.
Für das Modbus-Beispiel den lokalen Projektsimulator aktivieren und auf Online-Werte warten. In einem Projekt ohne ausgewählten Treiber genügen lokale Simulationswerte. Den Playmodus mit F5 starten. Stellen Sie als Ausgangslage Freigabe 0, Sollwert 60 und Zahlenwert 50 ein. Den Zahlenwert bei Bedarf mit einem zugeordneten Eingabeobjekt oder im lokalen Simulator vorbereiten. Die V-SPS ist zunächst „Gestoppt“.
Die Logik Schritt für Schritt testen
| Schritt | Aktion | Ergebnis |
|---|---|---|
| 1 | V-SPS mit Start einschalten, Freigabe bleibt 0 | Läuft zyklisch – keine Bedingung erfüllt; Zahlenwert bleibt 50. |
| 2 | Freigabe auf 1 schalten | Sollwert 60 wird kopiert; Zahlenwert wird 60. |
| 3 | Sollwert auf 80 ändern und mit Enter bestätigen | Bei aktiver Freigabe folgt der Zahlenwert auf 80. |
| 4 | Freigabe auf 0 schalten, dann Sollwert auf 60 ändern | Zahlenwert bleibt 80; die Bedingung ist nicht mehr erfüllt. |
„Keine Bedingung erfüllt“ ist hier kein Fehler. Die V-SPS läuft und wartet auf Freigabe. „RUN · Aktiv: ST-Netzwerk 1: MOVE“ zeigt die Kopieraktion. MOVE bedeutet hier Wertkopie.
Start, Pause, Weiter und Stop
- Start: startet die zyklische Ausführung.
- Pause: hält die Ausführung an und setzt die zugeordneten Ausgänge auf LOW/0. Interne Werte und Ablaufposition bleiben erhalten.
- Weiter: setzt am aktuellen Stand fort, ohne die Pausezeit nachzuholen. Das Programm setzt seine Ausgänge wieder.
- Stop: beendet die Ausführung und setzt die zugeordneten Ausgänge auf LOW/0. Interne Werte bleiben erhalten.
Im V-SPS-Editor legen Sie unter Bei Pause/Stop auf 0 setzen fest, welche Signale Aktoren ansteuern. Signal zum Abschalten auswählen … öffnet die bekannte Variablenliste. Einträge mit Semikolon trennen. Ein ganzer Symbolname setzt den gesamten Wert zurück; Symbol.0 setzt ausschließlich Bit 0 zurück. Alle anderen Bits bleiben erhalten. Diese Ausgänge werden bei Pause/Stop immer abgeschaltet; es gibt keine Option zum Halten der Ausgänge.
Tankbeispiel: TANK_VALVE; TANK_PUMP.0. Das Ventil schließt und die Pumpenfreigabe fällt ab; Füllstand, Ablaufphase und Pumpenstatusbits bleiben erhalten. Interne Werte wie den Füllstand nicht als Ausgang zuordnen. Bei älteren Projekten werden bisherige SET/ASSIGN-Bitausgänge vorgeschlagen; numerische Aktorausgänge ausdrücklich ergänzen. Ein Seitenwechsel stoppt die laufende V-SPS und schaltet ebenfalls deren Ausgänge ab. Manuelle Eingaben bleiben nach Pause/Stop möglich.
Weiter und erneuter Start unterscheiden: Weiter behält die laufenden Zeit- und Einmalzustände bei. Stop beendet diese Zustände; ein erneuter Start beginnt die Ausführung frisch. Die gespeicherten Prozess- und Schrittwerte werden dabei nicht pauschal auf ihre Tabellen-Anfangswerte zurückgesetzt.
Was macht „Signal zum Abschalten auswählen …“?
Der Button öffnet die SPS-Symbolauswahl. Wählen Sie dort ein vorhandenes Symbol und übernehmen Sie es. Sein Name wird an die Liste Bei Pause/Stop auf 0 setzen angehängt. Er wird weder als neue Variable angelegt noch als Befehl in den ST-Text eingefügt. Mit Übernehmen und anschließendem Speichern wird die Zuordnung zum V-SPS-Objekt gespeichert.
AMPEL_NS; AMPEL_OW bedeutet: Bei Pause oder Stop beide vollständigen Werte auf 0 setzen. AMPEL_NS.0 würde nur Bit 0 löschen; die übrigen Bits blieben erhalten. Tragen Sie dort die abzuschaltenden Ausgangssignale ein. Interne Ablaufwerte wie PHASE gehören nicht in die Liste, wenn ihr Stand erhalten bleiben soll.
Die Ausgangsliste darf nur vorhandene Symbolnamen enthalten. Fragezeichen oder andere ungültige Einträge entfernen. Beispiel: AMPEL_NS; AMPEL_OW. Abbrechen der Symbolauswahl verändert die Liste nicht.
Mehrere Fälle unterscheiden: CASE
CASE mit dem Befehlsdialog anlegen
- Den Cursor auf eine freie Zeile innerhalb des Programms setzen, außerhalb eines vorhandenen IF- oder CASE-Blocks.
- Befehl einfügen → CASE … OF (Select Case) auswählen.
- Einen Namen für den Kommentar eintragen. Über Quellvariable → Symbol das ganzzahlige Auswahl-Symbol wählen, zum Beispiel Anlage_Betriebsart.
- Die Vorschau prüfen und Einfügen wählen. Der Block erscheint an der Cursorposition; der Cursor wechselt zur freien Aktionszeile unter
0:. - Unter
0:mit WRITE den Wert 0 ins Ziel schreiben. Unter1:mit MOVE den Sollwert ins Ziel kopieren. Unter ELSE eine passende Ersatzaktion eintragen, zum Beispiel WRITE mit Wert 0. - Weitere Werte, Listen und Bereiche bei Bedarf im Text ergänzen. Jeder Zweig benötigt eine Aktion. Anschließend Übernehmen und das Projekt speichern.
Die Vorlage liefert zunächst 0, 1 und ELSE. Der folgende vollständige Versuch ergänzt die Liste 2, 3 sowie den Bereich 10..20:
Das aus anderen Sprachen bekannte Select Case heißt hier CASE … OF … END_CASE. Während IF eine Bedingung prüft, wählt CASE passend zum Wert eines Symbols einen Zweig aus. Stellen Sie sich einen Wahlschalter mit mehreren Stellungen vor.
Dieses zweite Beispiel verwendet Anlage_Betriebsart an Adresse 40003 als Auswahl. Ersetzen Sie für den Versuch das bisherige Programm vollständig durch dieses Programm, damit nicht zwei Logiken denselben Zahlenwert schreiben:
PROGRAM Betriebsart_Auswahl
CASE Anlage_Betriebsart OF
0:
Anlage_Zahlenwert := 0;
1:
Anlage_Zahlenwert := Anlage_Sollwert;
2, 3:
Anlage_Zahlenwert := 50;
10..20:
Anlage_Zahlenwert := 80;
ELSE
Anlage_Zahlenwert := 0;
END_CASE;
END_PROGRAM| Schreibweise | Einfach erklärt |
|---|---|
| CASE Anlage_Betriebsart OF | Lies die Betriebsart und wähle den passenden Fall. |
| 0: | Bei Wert 0: Schreibe 0 in den Zahlenwert. Der Doppelpunkt beginnt die Anweisungen dieses Falls. |
| 1: | Bei Wert 1: Kopiere den aktuellen Sollwert. |
| 2, 3: | Eine Liste: Bei Wert 2 oder 3 wird 50 geschrieben. |
| 10..20: | Ein Bereich: Bei jedem ganzzahligen Wert von 10 bis einschließlich 20 wird 80 geschrieben. |
| ELSE | Der Ersatzfall für alle nicht genannten Werte, beispielsweise 4 oder 21. Hier wird 0 geschrieben. |
| END_CASE; | Beendet die Fallunterscheidung. Ein zusätzlicher BREAK-Befehl ist nicht erforderlich. |
Die Zweige werden nicht nacheinander wie eine Ablaufkette durchlaufen. Ausschlaggebend ist der aktuelle Wert von Anlage_Betriebsart. Das Beispiel verändert die Betriebsart nicht selbst und verwendet keine Freigabebedingung.
Zum Ausprobieren: Stoppen Sie die V-SPS, ersetzen und übernehmen Sie das Programm, speichern Sie und starten Sie die Simulation erneut. Lassen Sie Anlage_Sollwert auf 60 und stellen Sie über eine Werteingabe für Anlage_Betriebsart oder im lokalen Simulator an 40003 nacheinander 0, 1, 2, 3, 10, 20 und 21 ein. Erwartete Zahlenwerte: 0, 60, 50, 50, 80, 80 und 0.
Freigabe innerhalb eines CASE-Zweigs
Hier darf Betriebsart 1 den Sollwert nur bei Freigabe kopieren. Ohne Freigabe sowie bei anderen Betriebsarten wird 0 geschrieben. Dieses Programm ersetzt für den Versuch das vorherige:
PROGRAM Freigabe_im_CASE
CASE Anlage_Betriebsart OF
0:
Anlage_Zahlenwert := 0;
1:
IF Anlage_Freigabe = 1 THEN
Anlage_Zahlenwert := Anlage_Sollwert;
ELSE
Anlage_Zahlenwert := 0;
END_IF;
ELSE
Anlage_Zahlenwert := 0;
END_CASE;
END_PROGRAMIF und CASE: unterstützter Umfang
- Unabhängige IF-Blöcke: Genau eine Aktion je THEN- bzw. ELSE-Zweig; davor ist WAIT möglich. Für weitere unabhängige Aktionen weitere IF-Blöcke anlegen.
- CASE: Ganzzahliges Auswahl-Symbol, Einzelwerte, Listen und Bereiche. Jeder angelegte Zweig braucht mindestens eine Aktion. Nicht benötigte Zweige einschließlich ELSE vollständig entfernen oder mit einer sinnvollen Aktion füllen.
- Mehrere Aktionen: Innerhalb eines CASE-Zweigs möglich. Zusätzlich ist dort eine Ebene IF … THEN … ELSE … END_IF; zulässig. IF und CASE können als unabhängige Blöcke nacheinander im Programm stehen.
- Verschachtelung: Kein CASE in CASE, kein CASE in einem normalen IF und kein mehrfach verschachteltes IF. ELSIF und Schleifen gehören nicht zum unterstützten Umfang.
- RND: Im normalen IF-Zweig unterstützt, auch neben einem unabhängigen CASE-Block. Direkt im CASE-Zweig und in dessen innerem IF derzeit nicht unterstützt.
- Vergleiche: Links ein Symbol bzw. Bit, rechts ein fester Zahlenwert oder TRUE/FALSE für BOOL/Bit. Keine Vergleiche zweier Symbolwerte.
Verwenden Sie eindeutige, nicht überlappende CASE-Werte. Bei Kombinationen aus AND und OR rechnet diese V-SPS von links nach rechts; verlassen Sie sich nicht auf eine aus anderen Sprachen bekannte Operatorrangfolge. Für den Einstieg nur AND oder nur OR je Bedingung verwenden. Verschachtelte Klammerausdrücke werden nicht unterstützt.
Neue Blöcke dürfen an der Cursorposition stehen, müssen aber zur erlaubten Struktur passen. Zum Beispiel einen zweiten unabhängigen IF-Block nach END_IF; des ersten Blocks einfügen. Aktionen nicht hinter END_PROGRAM ergänzen.
Ablaufketten: Soll CASE einen Schrittzähler steuern, muss die Logik diesen Wert ausdrücklich ändern. Änderungen am Auswahlwert können bereits nachfolgende Aktionen desselben Durchlaufs beeinflussen; CASE ist hier keine Anweisung, die automatisch einen kompletten Zweig als unteilbare Einheit abarbeitet. Für den Einstieg den Auswahlwert über ein Bedienobjekt setzen und im CASE unverändert lassen.
Befehle nachschlagen
Der ?-Button neben der Dialogüberschrift öffnet diese Anleitung direkt. Der Codeeditor nutzt die volle Breite; Prüfmeldungen erscheinen darunter.
Die folgenden Abschnitte erklären die unterstützten Befehle. Ziel, Quelle, Target und Symbol sind Platzhalter für vorhandene Projektsymbole. Ersetzen Sie sie durch Ihre Symbolnamen. Auslassungspunkte stehen für weggelassenen Programmtext.
PROGRAM, IF, CASE und logische Verknüpfungen
| Befehl | Bedeutung |
|---|---|
| PROGRAM Name / END_PROGRAM | Beginn und Ende eines Programms. Name ist frei wählbar. |
| IF … THEN … ELSE … END_IF; | Wenn die Bedingung stimmt, wird der THEN-Zweig ausgeführt. Andernfalls wird der optionale ELSE-Zweig ausgeführt. Ohne ELSE bleibt die dort nicht beschriebene Änderung aus. |
| CASE … OF … ELSE … END_CASE; | Wählt den passenden Fall anhand eines Wertes. Einzelwerte, Listen und Bereiche sind im CASE-Abschnitt erklärt. |
| AND | UND: Beide Bedingungen müssen stimmen. |
| OR | ODER: Mindestens eine Bedingung muss stimmen; beide dürfen ebenfalls stimmen. |
| NOT | NICHT: Kehrt den Wahrheitswert der folgenden Bedingung um. |
Beispiele mit vorhandenen Zahlensymbolen:
IF Anlage_Freigabe = 1 AND Anlage_Sollwert >= 60 THEN
Anlage_Zahlenwert := Anlage_Sollwert;
END_IF;Hier wird nur kopiert, wenn die Freigabe 1 ist und der Sollwert mindestens 60 beträgt. Mit OR würde bereits eine der beiden Bedingungen genügen. NOT Anlage_Freigabe = 1 bedeutet: Die Freigabe ist nicht gleich 1.
Für den Einstieg verwenden Sie einfache Bedingungen. Der Editor unterstützt nur seinen freigegebenen ST-Umfang; komplexe Klammerung und Verschachtelung dürfen nicht aus beliebigen SPS-Beispielen übernommen werden.
Die sechs Vergleichszeichen
| Zeichen | Bedeutung | Beispiel bei Sollwert 60 |
|---|---|---|
| = | gleich | Anlage_Sollwert = 60 → wahr |
| <> | ungleich | Anlage_Sollwert <> 60 → falsch |
| > | größer | Anlage_Sollwert > 50 → wahr |
| >= | größer oder gleich | Anlage_Sollwert >= 60 → wahr |
| < | kleiner | Anlage_Sollwert < 60 → falsch |
| <= | kleiner oder gleich | Anlage_Sollwert <= 60 → wahr |
Ein Vergleich liefert wahr oder falsch, er schreibt nichts. = ist deshalb etwas anderes als die Zuweisung :=.
TRUE, FALSE und einzelne Bits
TRUE bedeutet wahr/eingeschaltet, FALSE falsch/ausgeschaltet. Diese Angaben verwenden Sie bei BOOL-Symbolen oder einzelnen Bits. Ein Wort kann mehrere solcher Ein/Aus-Informationen enthalten.
Symbol.0 bezeichnet Bit 0 des Symbols, nicht eine Nachkommastelle. Bit 0 hat den Zahlenwert 1, Bit 1 den Wert 2, Bit 2 den Wert 4. Ein Wortwert 5 enthält damit die gesetzten Bits 0 und 2.
Die Kurzliste nennt Bits 0 bis 31. Nutzen Sie nur Bits, die zum tatsächlichen Datentyp passen: UINT16 hat Bits 0 bis 15; ein 32-Bit-Wort hat Bits 0 bis 31.
IF Anlage_Freigabe = 1 THEN
Anlage_Status.0 := TRUE;
ELSE
Anlage_Status.0 := FALSE;
END_IF;Dieses alternative Beispiel setzt Bit 0 von Anlage_Status (40015) bei Freigabe und löscht es sonst. Die übrigen Bits bleiben erhalten. Ohne den ELSE-Zweig würde ein zuvor gesetztes Bit beim Wegfall der Bedingung durch diese Logik nicht ausdrücklich gelöscht. Das ist ein anderes Beispiel als unsere Wortkopie.
Werte zuweisen und verändern
| Schreibweise | Verhalten und Einsatz |
|---|---|
Ziel := Quelle; | Kopiert einen Symbolwert. Quelle und Ziel müssen denselben Datentyp haben; ganze Symbole ohne Bitzugriff verwenden. |
Ziel := 25; | Schreibt einen festen Wert in ein ganzzahliges Ziel. In IF- und CASE-Zweigen unterstützt. Die WRITE-Vorlage erzeugt diese Schreibweise. |
Ziel := Ziel + 1;Ziel := Ziel - 1; | Im CASE-Zweig von Hand eingeben: ein Zählschritt pro Aktivierung. Rechts muss dasselbe Zielsymbol stehen; die Schrittweite muss eine positive ganze Zahl sein. |
Für einen Zählschritt im normalen IF-Zweig verwenden Sie INC_ONCE oder DEC_ONCE. Für wiederholtes Zählen verwenden Sie INC oder DEC. Beliebige Rechenausdrücke werden nicht unterstützt.
PROGRAM Fester_Wert
IF Anlage_Freigabe = 1 THEN
Anlage_Zahlenwert := 25;
END_IF;
END_PROGRAMWRITE hält den vorgegebenen Wert bei aktiver Bedingung aufrecht. Eine manuelle Änderung kann daher wieder überschrieben werden. Soll manuell eingegriffen werden, zuerst die V-SPS stoppen oder die entsprechende Bedingung ausschalten.
WAIT: erst nach einer Wartezeit schalten
WAIT(T#2s); bedeutet eine Verzögerung von zwei Sekunden; WAIT(T#500ms); bedeutet 500 Millisekunden, also eine halbe Sekunde. T# kennzeichnet eine Zeitdauer; s steht für Sekunden, ms für Millisekunden.
PROGRAM Uebung
IF Anlage_Freigabe = 1 THEN
WAIT(T#2s);
Anlage_Zahlenwert := Anlage_Sollwert;
END_IF;
END_PROGRAMDie Freigabe muss zwei Sekunden durchgehend 1 sein, bevor kopiert wird. Wird sie vorher 0, wird die Zeit zurückgesetzt. WAIT pausiert dabei nicht das gesamte Programm, sondern verzögert die Aktion dieses bedingten Netzwerks. Es ist hier eine Einschaltverzögerung und kein periodischer Zwei-Sekunden-Takt für jede spätere Quellwertänderung.
Dieses Muster ist für die gezeigte Kopieraktion gedacht. Für den Zeitabstand zwischen Zählschritten nutzen Sie den Zeitparameter von INC oder DEC.
Die Zeitangabe liegt zwischen 0 und 3.600.000 ms (eine Stunde). WAIT vor SET/RESET, einer Wertzuweisung, MOVE oder COPY_WORDS verwenden; im normalen IF ist auch RND als Folgeaktion möglich. WAIT verzögert Zählbefehle nicht: Für INC/DEC den eigenen Zeitparameter verwenden. In CASE gehört WAIT nur zur unmittelbar folgenden Aktion; mehrere Aktionen erhalten bei Bedarf jeweils ein eigenes WAIT.
INC und DEC: wiederholt zählen
INC(Target, 1, T#500ms, 0, 100); erhöht ein Ziel alle 500 ms um 1, solange die Bedingung stimmt.
| Parameter der Reihe nach | Bedeutung |
|---|---|
| Target | Das zu verändernde Zielsymbol. |
| 1 | Schrittweite: pro Zählschritt um 1 erhöhen. |
| T#500ms | Zeit zwischen den Schritten; hier eine halbe Sekunde. |
| 0 | Untergrenze. |
| 100 | Obergrenze. |
PROGRAM Uebung
IF Anlage_Freigabe = 1 THEN
INC(Anlage_Zahlenwert, 1, T#500ms, 0, 100);
END_IF;
END_PROGRAMBei einem Anfangswert 50 folgen nach Ablauf der Zeit 51, 52, 53 … bis 100. An der Grenze bleibt der Wert stehen; er springt nicht auf 0 zurück. Bei Freigabe 0 hört die Logik auf zu zählen und der letzte Wert bleibt erhalten.
DEC(Target, 2, T#1s, 0, 100); ist die Gegenrichtung: jede Sekunde um 2 verringern, beispielsweise 50, 48, 46 … bis 0. INC und DEC sind für ganzzahliges Zählen vorgesehen.
Die Ausführung wird ungefähr alle 100 ms geprüft. Millisekundenangaben sind deshalb keine Zusage einer millisekundengenauen Echtzeitsteuerung. Während einer Pause wird die Pausezeit nicht als nachzuholende Zählzeit behandelt.
INC_ONCE und DEC_ONCE: einmal pro Aktivierung
INC_ONCE(Target, 1, 0, 100); erhöht einmal um 1, wenn die Bedingung aktiv wird. Die vier Parameter sind Ziel, Schrittweite, Minimum und Maximum; es gibt keinen Zeitparameter.
PROGRAM Uebung
IF Anlage_Freigabe = 1 THEN
INC_ONCE(Anlage_Zahlenwert, 1, 0, 100);
END_IF;
END_PROGRAMBeispiel: Zahlenwert 50, Freigabe einschalten → 51. Freigabe bleibt eingeschaltet → weiterhin 51. Erst Freigabe aus und erneut ein → 52. Ist die Bedingung beim Programmstart bereits wahr, kann dies ebenfalls die erste Ausführung auslösen.
DEC_ONCE(Target, 2, 0, 100); verringert entsprechend einmal pro Aktivierung um 2. ONCE bedeutet „einmal“, aber nicht einmal für die gesamte Lebensdauer des Programms. Nach einer falschen Bedingung ist der nächste Schritt wieder möglich.
MOVE: eine Wertkopie ausdrücklich schreiben
MOVE(Source, Target); kopiert von der Quelle zum Ziel. Hier steht die Quelle zuerst, das Ziel danach. Source bedeutet Quelle.
PROGRAM Uebung
IF Anlage_Freigabe = 1 THEN
MOVE(Anlage_Sollwert, Anlage_Zahlenwert);
END_IF;
END_PROGRAMDas entspricht unserem ersten Beispiel mit Anlage_Zahlenwert := Anlage_Sollwert;. MOVE entfernt den Quellwert nicht und verändert ihn nicht. Solange die Bedingung aktiv bleibt, werden spätere Änderungen der Quelle ebenfalls übernommen.
Die neuen Beispiele sind anhand der Implementierung erläutert. Die vorhandenen Laufzeitbilder belegen die erste IF-Wortkopie; zusätzliche Tests der einzelnen Befehle sind damit noch nicht dokumentiert.
Quelle und Ziel müssen denselben Datentyp haben; die Quelle muss einen gültigen Wert liefern und das Ziel schreibbar sein. Ganze Symbole verwenden, keine Bitkopie mit Symbol.0.
Vollversion mit geeignetem Kommunikationstreiber: Der aktuelle Demo-Build kann Wortbereiche wegen der deaktivierten Treiber nicht auflösen. Für lokale Demo-Übungen einzelne Symbole mit MOVE kopieren.
COPY_WORDS: mehrere Wörter kopieren
COPY_WORDS(Quelle, Ziel, 3); kopiert drei zusammenhängende 16-Bit-Wörter. Quelle und Ziel bezeichnen jeweils das erste Symbol ihres Bereichs. Die Anzahl muss zwischen 1 und 128 liegen.
- Beide Bereiche gehören zum selben Gerät und Treiber.
- Jedes einzelne Wort muss in der SPS-Tabelle vorhanden sein. Die Funktion legt keine fehlenden Symbole an.
- Quell- und Zielwort müssen paarweise denselben 16-Bit-Datentyp haben; alle Ziele müssen schreibbar sein.
- Unterstützt sind Modbus-Register mit aufeinanderfolgenden Adressen und S7-Wörter mit zwei Byte Abstand im selben Bereich bzw. Datenbaustein. Beliebige OPC-UA-Knotenlisten sind kein Wortbereich.
Beispiel für die Tabellenbelegung: Quelle an 40020, 40021 und 40022; Ziel an 40030, 40031 und 40032, jeweils UINT16 desselben lokalen Geräts. Die Vorlage erhält die Namen der ersten Symbole sowie Anzahl 3. Zum Testen drei verschiedene Quellwerte vorgeben und nach Aktivierung alle drei Zielwerte kontrollieren.
Für eine einzelne Wertkopie ist MOVE einfacher. Auch COPY_WORDS verwendet die Voraussetzungen der lokalen Simulation.
RND: einen ganzzahligen Zufallswert erzeugen
Ab Version 2.61.514: Ziel := RND(1, 10); liefert eine ganze Zahl von 1 bis 10, einschließlich beider Grenzen.
IF Anlage_Freigabe = 1 THEN
Anlage_Zahlenwert := RND(1, 10);
END_IF;Pro Aktivierung der Bedingung wird einmal gewürfelt. Solange die Bedingung wahr bleibt, erfolgt keine weitere Zufallszuweisung. Nach falsch und erneut wahr wird neu gewürfelt; derselbe Wert kann erneut entstehen. Ein vorgeschaltetes WAIT verzögert die Zuweisung.
Beide Grenzen müssen feste ganze Zahlen sein und zum beschreibbaren ganzzahligen Zielsymbol passen. Die untere Grenze darf die obere nicht überschreiten. Gleiche Grenzen sind erlaubt. Bitziele und Gleitkommaziele sind nicht zulässig. RND ist eine Simulationserweiterung; es ersetzt keine variable Wartezeit.
RND gehört in einen normalen IF-Zweig. Ein CASE-Zweig einschließlich eines darin enthaltenen IF akzeptiert RND derzeit nicht. Ein unabhängiger IF-Block neben dem CASE kann die Zufallszuweisung übernehmen.
Positionswerte für Bildbewegung
Die lokale V-SPS kann eigene X-/Y-Positionssymbole zyklisch beschreiben. Ordnen Sie diese unter Bildbewegung einem Bild zu. Ein Zahlenwert entspricht einem Pixel Versatz; die eingezeichnete Position bleibt der Bezugspunkt. Geschwindigkeit und Rücksetzen ergeben sich aus Ihrer Programmfolge und deren Zeitabständen.
Für Zufallswerte steht RND(von, bis) zur Verfügung. Beide Grenzen sind eingeschlossen; eine dauernd wahre Bedingung erzeugt nicht in jedem Zyklus einen neuen Zufallswert. Für manuelle Werteingaben die automatisch schreibende V-SPS zuerst stoppen, sonst überschreibt der nächste Programmschritt den eingegebenen Wert.
Für einen einfachen Bewegungstest die vorhandenen ganzzahligen Symbole Freigabe und Auto_Move_Y verwenden und die Y-Bewegung des Bildes Auto_Move_Y zuordnen:
PROGRAM Bildbewegung
IF Freigabe = 1 THEN
INC(Auto_Move_Y, 10, T#500ms, 0, 600);
END_IF;
END_PROGRAMBei Freigabe 1 steigt der Versatz alle 500 ms um 10 Pixel bis maximal 600. Bei Freigabe 0 bleibt der aktuelle Wert stehen. Zum Zurücksetzen zuerst stoppen und den Positionswert auf 0 setzen.
Wenn etwas nicht funktioniert
| Beobachtung | Prüfung |
|---|---|
| Block steht an der falschen Stelle | Strg+Z drücken, den Cursor auf die gewünschte freie Zeile innerhalb PROGRAM … END_PROGRAM setzen und die Vorlage erneut einfügen. |
| „Cursor zuerst in einen IF-Block oder CASE-Zweig setzen“ | Den Dialog schließen und eine Aktionszeile nach THEN bzw. nach einem CASE-Wert mit Doppelpunkt auswählen. |
| Leerer Zweig / Aktion fehlt | Die IF-Aktion und alle angelegten CASE-Zweige ausfüllen; ungenutzte CASE-Zweige ganz entfernen. WAIT allein ist keine Aktion. |
| Fehler bei Übernehmen | Fehlermeldung lesen. Symbolnamen, Schreibrechte, Datentypen, :=, Semikola und END_IF;/END_CASE; prüfen. Platzhaltersymbole ersetzen und Grenzen des ST-Umfangs beachten. |
| „Simulator nicht online“ | Bei Treiberbetrieb den lokalen Projektsimulator aktivieren und auf Online-Werte warten. Ohne ausgewählten Treiber prüfen, ob die verwendeten lokalen Symbole gültige Simulationswerte haben. |
| Wert bleibt unverändert | Playmodus und Start der V-SPS prüfen. Stimmt die IF-Bedingung oder der CASE-Auswahlwert? Stimmen die Symbolzuordnungen? „Keine Bedingung erfüllt“ bedeutet, dass gerade keine Aktion freigegeben ist. |
| Wert wird wieder überschrieben | Andere IF-/CASE-Blöcke und weitere V-SPS auf dasselbe Ziel prüfen. Für manuelle Versuche die automatisch schreibende Logik stoppen. |
| RND funktioniert im CASE nicht | RND in einen unabhängigen IF-Block mit eigener Bedingung verschieben. Die Aktionsvorschau allein bestätigt nicht die Zulässigkeit im CASE. |
| Ausgang bleibt nach Pause/Stop an | Zuordnung unter „Ausgänge bei Pause/Stop auf LOW“ prüfen. Nur ausdrücklich zugeordnete Ausgänge werden dort zurückgesetzt. |
Weitere Hilfe: Tastenkürzel und SPS-Tabelle. Bei Rückfragen Hilfe-ID OBJ-VPLC, Programmversion, vollständigen ST-Text, Symbolzuordnung und Laufzeitstatus nennen.