- Structured Control Language
-
Der strukturierte Text (engl. Structured Text, Abkürzung: ST) wird für die Programmierung von Speicherprogrammierbaren Steuerungen (SPS) eingesetzt. Die Norm EN 61131-3 legt neben anderen auch den Sprachumfang von ST fest. Dabei ist die Syntax der Sprachelemente ähnlich denen der Hochsprache Pascal und es wird wie bei allen Sprachen der EN 61131-3 keine Unterscheidung zwischen Groß- und Kleinschreibung gemacht (Case Insensitive).
ST bietet mehr Strukturierungsmöglichkeiten als AWL und löst diese daher immer mehr ab. Allerdings halten viele Entwickler noch immer an der Programmierung mit AWL fest, da ST-Programme nach der Kompilierung meist einen erhöhten Speicherbedarf mit sich bringen. Dieser kann auf kleineren SPS durch schnelleres Erreichen der Speichergrenzen durchaus zu Problemen führen.
Beispiel 1 (IF-Statement):
IF (MASCHINE_EINGESCHALTET = TRUE) THEN SOLLPOSITION := SOLLPOSITION + 100; AUSGANG1 := EINGANG1 AND EINGANG2; ELSE AUSGANG1 := FALSE; END_IF;
Alternativ ist auch folgende Programmierung möglich:
IF MASCHINE_EINGESCHALTET THEN SOLLPOSITION := SOLLPOSITION + 100; END_IF; AUSGANG1 := MASCHINE_EINGESCHALTET AND EINGANG1 AND EINGANG2;
Das Resultat beider Varianten ist identisch (nicht jedoch die interne Umsetzung in die Anweisungsliste). Achtung: Die Sollposition wird nicht verändert, wenn die Variable MASCHINE_EINGESCHALTET = FALSE ist.
Beispiel 2 (CASE-Statement):
if Cmd = 2 (* or Cmd = 9*) then case Slot of (* Aufnehmen *) 1 : T_Dicke[3*i] := dint_to_int((RB_Ist[RB_Ist[0]]+499)/1000); 2 : T_Dicke[3*i] := dint_to_int((Z1_Ist[Z1_Ist[0]]+499)/1000); 3 : T_Dicke[3*i] := dint_to_int((FB_Ist+499)/1000); end_case; else T_Dicke[3*i] := dint_to_int((T_Ist[i]+499)/1000); end_if;
Beispiel 3 (FOR-Statement):
ENO := true; for i := 0 to 499 by 1 do D := D1[i]; D1[i] := D2[i]; D2[i] := D; end_for;
Beispiel 4 (REPEAT-Statement):
if RB_Ist[0] = 0 (*and RB_Soll[0] = 0*) then Daten[X[i]] := Daten[X[i]] + 1; else repeat Daten[X[i]] := Daten[X[i]] + 1; k := uint_to_int(Daten[X[i]]); (* Index des Kanals *) until Daten[X[i]+k] = 69 or Daten[X[i]+k] = 99 end_repeat; end_if;
Beispiel 5 (WHILE-Statement):
If RST_Tisch then M[15] := false; k := 1; while Daten[X[2]+k] <> 60 and Daten[X[2]+k] <> 99 and k < 49 do k := k+1; end_while; Daten[X[2]] := int_to_uint(k); (* neu setzen für 2. Vorgang *) Wait := false; end_if;
Beispiel 6: Realisierung eines Blinklichts mit Flipflops, Timern und variablen Ein/Aus-Zeiten für eine Siemens S5
VAR TIMER1: TON; TIMER2: TON; FF1: RS; (* Flipflop 1 *) FF2: RS; (* Flipflop 2 *) FF3: RS; (* Flipflop 3 *) END_VAR TIMER1 ( IN :=NOT FF1.Q1 , PT := T#0.2s ); FF1 (SET := TIMER1.Q); FF1 (RESET1:= NOT TIMER2.Q); TIMER2 ( IN :=NOT FF2.Q1 AND TIMER1.q , PT := T#0.4s ); FF2 (SET := TIMER2.Q); FF2 (RESET1:= NOT TIMER1.Q); FF3(SET:=TIMER1.Q); FF3(RESET1:=TIMER2.Q);
Wikimedia Foundation.