Strukturierter Text

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Der strukturierte Text (engl. Structured Text, Abkürzung: ST; in Siemens S7 auch engl. Structured Control Language, Abkürzung SCL) 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)[Bearbeiten]

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)[Bearbeiten]

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)[Bearbeiten]

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)[Bearbeiten]

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)[Bearbeiten]

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[Bearbeiten]

Realisierung eines Blinklichts mit Flipflops, Timern und variablen Ein/Aus-Zeiten für eine Siemens S7-300

VAR
  TIMER1: 
  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);