Structured Text
aus Wikipedia, der freien Enzyklopädie
Der strukturierte Text (engl. Structured Text, Abkürzung: ST) wird für die Programmierung von speicherprogrammierbaren Steuerungen eingesetzt. Die Norm IEC 61131-3 legt neben anderen auch den Sprachumfang von ST fest.
ST bietet mehr Strukturierungsmöglichkeiten als AWL und löst diese daher immer mehr ab.
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 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);