Beruflich Dokumente
Kultur Dokumente
In der DIN EN 61131-3 ist die Programmiersprache Strukturierter Text ST neben der Anwei-
sungsliste AWL als zweite Textsprache für SPSen definiert. Bei STEP 7 wird die entsprechen-
de Programmiersprache SCL (Structured Control Language) genannt. ST (SCL) ist optimiert
für die Programmierung von Speicherprogrammierbaren Steuerungen und enthält sowohl
Sprachelemente aus der Programmiersprache PASCAL als auch typische SPS-Elemente, wie
z. B. Ein-/Ausgänge, Zeiten und Zähler.
Die Programmiersprache ST (SCL) ist besonders für folgende Aufgaben geeignet:
x Programmierung komplexer Algorithmen für digitale Variablen
x Programmierung mathematischer Funktionen
x Daten- bzw. Rezepturverwaltung
x Prozessoptimierung
10.1.2 Deklarationsteil
Der Deklarationsteil dient zur Vereinbarung der lokalen Variablen, Eingangs-, Ausgangs- bzw.
Durchgangs-Parameter und Konstanten. Darüber hinaus bieten die beiden Programmiersyste-
me STEP 7 und CoDeSys noch weitere spezifische Daten zur Deklaration an.
Der Deklarationsteil gliedert sich in unterschiedliche Vereinbarungsblöcke, die jeweils durch
ein eigenes Schlüsselwortpaar gekennzeichnet sind. Jeder Block enthält eine Deklarationsliste
für gleichartige Daten. Die Reihenfolge dieser Blöcke ist beliebig.
In der nachfolgenden Tabelle zeigt die möglichen Vereinbarungsblöcke in einem Funktions-
baustein an Beispielen:
Hinweis: Die Initialisierung der Werte ist nur in Funktionsbausteinen und bei STEP 7 in Da-
tenbausteinen möglich. In Funktionen oder Programmen können den Variablen keine An-
fangswerte zugewiesen werden.
10.1.3 Anweisungsteil
Der Anweisungsteil beinhaltet Anweisungen, die nach dem Aufruf eines Codebausteins zur
Ausführung kommen sollen. Eine Anweisung ist dabei die kleinste selbstständige Einheit des
Anwenderprogramms. Sie stellt eine Arbeitsvorschrift für den Prozessor dar. ST (SCL) kennt
folgende Arten von Anweisungen:
Wertzuweisungen,
die dazu dienen, einer Variablen einen Wert, das Ergebnis eines Ausdrucks oder den Wert
einer anderen Variablen zuzuweisen.
352 10 Programmiersprache Strukturierter Text ST (SCL)
Kontrollanweisungen,
die dazu dienen, Anweisungen oder Gruppen von Anweisungen zu wiederholen oder innerhalb
eines Programms zu verzweigen.
Unterprogrammbearbeitungen,
die zum Aufrufen von Funktionen und Funktionsbausteinen dienen.
Regeln für den Anweisungsteil:
10.2.2 Operatoren
Die meisten Operatoren verknüpfen zwei Operanden und werden deshalb als binär bezeichnet.
Andere Operatoren arbeiten mit nur einem Operanden, daher bezeichnet man sie als unär.
Binäre Operatoren werden zwischen die Operanden geschrieben (z. B. A + B). Eine unäre
Operation steht immer unmittelbar vor seinem Operand (z. B. –B).
Wenn ein Ausdruck mehrere Operationen enthält, muss der linke Operand zuerst ausgewertet
werden. Zum Beispiel muss im Ausdruck SIN(X) * TAN(Y) die Operation SIN(X) zuerst
ausgewertet werden, gefolgt von TAN(Y) und danach wird die Multiplikation ausgeführt. Die
folgenden Bedingungen bei der Ausführung von Operatoren führen zu Fehlern:
x Division durch Null
x Operanden haben nicht den für die Operation erforderlichen Datentyp.
x Das Ergebnis überschreitet den Wertebereich des Datentyps.
10.2 Ausdrücke, Operanden und Operatoren 353
Hinweis: In den Kapiteln 4, 5 und 7 ist die Syntax der Operationen in ST (SCL) bei der allge-
meinen Darstellung der Operatoren in der Programmiersprache STEP 7 und CoDeSys bereits
beschrieben.
10.2.3 Operanden
Ein Operand kann eine Konstante, eine Variable, ein Funktionsaufruf oder ein Ausdruck sein.
Die Operandenkennzeichen sind in Kapitel 2 beschrieben und gelten für ST (SCL) gleicher-
maßen.
354 10 Programmiersprache Strukturierter Text ST (SCL)
10.2.4 Ausdrücke
Man unterscheidet arithmetische Ausdrücke, logische Ausdrücke und Vergleichsausdrücke.
Das Ergebnis eines logischen Ausdrucks und eines Vergleichsausdrucks ist ein boolescher
Wert.
Die Verarbeitung von Ausdrücken erfolgt nach den folgenden Regeln:
x Ein Operand zwischen zwei Operationen von unterschiedlicher Priorität ist immer an die
höherrangige gebunden.
x Die Operationen werden entsprechend der hierarchischen Rangfolge bearbeitet.
x Operationen gleicher Priorität werden von links nach rechts bearbeitet.
x Das Voranstellen eines Minuszeichens vor einen Bezeichner ist gleichbedeutend mit der
Multiplikation mit –1.
x Arithmetische Operationen dürfen nicht direkt aufeinander folgen. Deshalb ist der Aus-
druck a * –b ungültig, aber a*(–b) erlaubt.
x Das Setzen von Klammerpaaren kann den Operationenvorrang außer Kraft setzen, d. h., die
Klammerung hat die höchste Priorität.
x Ausdrücke in Klammern werden als einzelner Operand betrachtet und immer als Erstes
ausgewertet.
x Die Anzahl von linken Klammern muss mit der von rechten Klammern übereinstimmen.
x Arithmetische Operationen können nicht in Verbindung mit Zeichen oder logischen Daten
angewendet werden. Deshalb sind Ausdrücke wie 'A' + 'B' und (n <= 0) + (m > 0) falsch.
10.3 Anweisungen
Anweisungen müssen durch ein Semikolon abgeschlossen werden. Die maximal erlaubte Län-
ge von Anweisungen ist ein implementierungsabhängiger Parameter. Man unterscheidet drei
Arten von Anweisungen: Wertzuweisungen, Kontrollanweisungen und Bausteinaufrufe.
10.3.1 Wertzuweisungen
Wertzuweisungen ersetzen den momentanen Wert einer Variablen mit einem neuen Wert, der
über einen Ausdruck angegeben wird. Dieser Ausdruck kann auch Bezeichner von Funktionen
enthalten, die dadurch aktiviert werden und entsprechende Werte zurückliefern .
Beispiele:
Wertzuweisung einer Konstanten zu einer Variablen
SCHALTER_1 := -15 ;
SOLLWERT_1 := 40.5 ;
ABFRAGE_1 := TRUE ;
ZEIT_1 := T#1H_20M_10S_30MS ;
ZEIT_2 := T#2D_1H_20M_10S_30MS ;
DATUM_1 := D#1996-01-10 ;
Wertzuweisung einer Variablen zu einer Variable
SOLLWERT_1 := SOLLWERT_2 ;
SCHALTER_2 := SCHALTER_1 ;
Wertzuweisung eines Ausdrucks zu einer Variablen
SCHALTER_2 := SCHALTER_1 * 3 ;
10.3 Anweisungen 355
10.3.2 Kontrollanweisungen
Mit Kontrollanweisungen wird der Programmfluss in Abhängigkeit von Bedingungen beein-
flusst, um in verschiedene Anweisungsfolgen zu verzweigen. Man unterscheidet Auswahl-
anweisungen, Wiederholungsanweisungen (Schleifenbearbeitung) und Programmsprünge.
10.3.2.1 Übersicht
Auswahlanweisungen: Eine Auswahlanweisung wählt aufgrund einer Bedingung oder mehre-
rer Bedingungen Anweisungen zur Bearbeitung aus. Damit ergibt sich die Möglichkeit, den
Programmfluss in verschiedene Anweisungsfolgen zu verzweigen.
Kontrollanweisung Funktion
IF-Anweisung Mit der IF-Anweisung kann der Programmfluss in Abhängigkeit von
einer Bedingung, die entweder TRUE oder FALSE ist, in eine von
zwei Alternativen verzweigen.
CASE-Anweisung Mit einer CASE-Anweisung kann der Programmfluss im Sinne einer
1: n-Verzweigung gesteuert werden, indem eine Variable einen Wert
aus n möglichen annimmt.
356 10 Programmiersprache Strukturierter Text ST (SCL)
Kontrollanweisung Funktion
FOR-Anweisung Die FOR-Anweisung dient zur Wiederholung einer Anweisungs-
gruppe, solange die Laufvariable innerhalb des angegebenen Werte-
bereichs liegt.
WHILE-Anweisung Die WHILE-Anweisung dient zur Wiederholung einer Anweisungs-
gruppe, solange eine Durchführungsbedingung erfüllt ist.
REPEAT-Anweisung Die REPEAT-Anweisung dient zur Wiederholung einer Anwei-
sungsgruppe, bis eine Abbruchbedingung erfüllt ist.
Kontrollanweisung Funktion
EXIT-Anweisung Die EXIT-Anweisung dient zum Verlassen einer FOR-, WHILE-,
oder REPEAT-Schleife, bevor deren Ende-Bedingung erfüllt ist.
RETURN-Anweisung Die RETURN-Anweisung bewirkt das Verlassen des aktuell bear-
beiteten Bausteins.
Nur in STEP 7
CONTINUE- Die CONTINUE-Anweisung kann die momentane Bearbeitung des
Anweisung Schleifenrumpfes einer FOR-, WHILE- oder REPEAT-Schleife um-
gehen, ohne die Schleifendurchläufe zu beeinflussen.
GOTO-Anweisung Mit einer GOTO-Anweisung kann ein Programmsprung realisiert
werden. Die Anweisung bewirkt den sofortigen Sprung zu einer
angegebenen Sprungmarke und damit zu einer anderen Anweisung
innerhalb desselben Bausteins.
10.3.2.2 IF-Anweisung
Die IF-Anweisung ist eine bedingte Anweisung. Sie bietet eine oder mehrere Optionen und
wählt eine (gegebenenfalls auch keine) ihrer Anweisungsteile zur Ausführung an. Die Ausfüh-
rung der bedingten Anweisung bewirkt die Auswertung der angegebenen logischen Ausdrü-
cke. Ist der Wert eines Ausdrucks TRUE, so gilt die Bedingung als erfüllt, bei FALSE als
nicht erfüllt.
Die IF-Anweisung wird nach den folgenden Regeln bearbeitet:
x Die erste Anweisungsfolge, deren logischer Ausdruck = TRUE ist, kommt zur Ausführung.
Die restlichen Anweisungsfolgen kommen nicht zur Ausführung.
x Falls kein boolescher Ausdruck = TRUE ist, wird die Anweisungsfolge bei ELSE ausge-
führt (oder keine Anweisungsfolge, falls der ELSE-Zweig nicht vorhanden ist).
x Es dürfen beliebig viele ELSIF-Anweisungen vorhanden sein.
10.3 Anweisungen 357
Beispiel:
Anweisungen Zugehöriges Struktogramm
IF S1 THEN
OUT1 := 10 ;
ELSIF S2 THEN
OUT1 := 20 ;
ELSE
OUT1 := 30 ;
END_IF ;
10.3.2.3 CASE-Anweisung
Die CASE-Anweisung dient der Auswahl unter 1–n alternativen Programmteilen. Diese Aus-
wahl beruht auf dem laufenden Wert eines Auswahl-Ausdrucks.
Die CASE-Anweisung wird nach folgenden Regeln bearbeitet:
x Der Auswahl-Ausdruck muss einen Wert vom Typ INTEGER liefern.
x Bei der Abarbeitung der CASE-Anweisung wird überprüft, ob der Wert des Auswahl-
Ausdrucks in einer angegebenen Werteliste enthalten ist. Bei Übereinstimmung wird der
der Liste zugeordnete Anweisungsteil ausgeführt.
x Ergibt der Vergleichsvorgang keine Übereinstimmung, so wird der Anweisungsteil nach
ELSE ausgeführt oder keine Anweisung, falls der ELSE-Zweig nicht vorhanden ist.
Beispiel:
Anweisungen Zugehöriges Struktogramm
CASE A_W OF
0: OUT1:=0;
1: OUT1:=1;
2..5: OUT1:=2;
6,8,10:OUT1:=3;
ELSE:
OUT1:=10;
END_CASE;
10.3.2.4 FOR-Anweisung
Eine FOR-Anweisung dient zur Wiederholung einer Anweisungsfolge, solange eine Laufvari-
able innerhalb des angegebenen Wertebereichs liegt. Die Laufvariable muss der Bezeichner
einer lokalen Variablen vom Typ INT oder DINT sein. Die Definition einer Schleife mit FOR
schließt die Festlegung eines Start- und eines Endwertes mit ein. Beide Werte müssen typ-
gleich mit der Laufvariablen sein.
Beim Start der Schleife wird die Laufvariable auf den Startwert (Anfangszuweisung) gesetzt
und nach jedem Schleifendurchlauf um die angegebene Schrittweite erhöht (positive Schritt-
weite) oder erniedrigt (negative Schrittweite), solange bis der Endwert erreicht ist. Nach jedem
Durchlauf wird überprüft, ob die Bedingung (Variable liegt innerhalb des Wertebereichs)
erfüllt ist. Bei JA wird die Anweisungsfolge ausgeführt, andernfalls wird die Schleife und
damit die Anweisungsfolge übersprungen.
Folgende Regeln sind bei der Formulierung von FOR-Anweisungen zu beachten:
x Die Laufvariable darf nur vom Datentyp INT oder DINT sein.
x Die Schrittweite muss nicht angegeben werden. Ist keine angegeben, beträgt sie +1.
358 10 Programmiersprache Strukturierter Text ST (SCL)
Beispiel:
Anweisungen Zugehöriges Struktogramm
INDEX:=0;
OUT1:=0;
FOR INDEX:= ANFW TO ENDW BY 1 DO
OUT1:=OU1 + INDEX;
END_FOR;
10.3.2.5 WHILE-Anweisung
Die WHILE-Anweisung erlaubt die wiederholte Ausführung einer Anweisungsfolge unter der
Kontrolle einer Durchführungsbedingung. Die Durchführungsbedingung wird nach den Re-
geln eines logischen Ausdrucks gebildet.
Die WHILE-Anweisung wird nach folgenden Regeln bearbeitet:
x Vor jeder Ausführung des Anweisungsteils wird die Durchführungsbedingung ausgewertet
(abweisende Schleife oder kopfgesteuerte Schleife).
x Der auf DO folgende Anweisungsteil wird solange wiederholt bearbeitet, wie die Durch-
führungsbedingung den Wert TRUE liefert.
x Tritt der Wert FALSE auf, wird die Schleife übersprungen und die der Schleife folgende
Anweisung ausgeführt.
Beispiel:
Anweisungen Zugehöriges Struktogramm
INDEX:=0;
OUT1:=0;
WHILE INDEX < ENDW DO
INDEX:=INDEX + 1;
OUT1:=OUT1+INDEX;
END_WHILE;
10.3.2.6 REPEAT-Anweisung
Eine REPEAT-Anweisung bewirkt die wiederholte Ausführung einer zwischen REPEAT und
UNTIL stehenden Anweisungsfolge bis zum Eintreten einer Abbruchbedingung. Die Ab-
bruchbedingung wird nach den Regeln eines logischen Ausdrucks gebildet. Die Bedingung
wird jeweils nach der Ausführung des Rumpfes überprüft. Dies bedeutet, dass der Rumpf
mindestens einmal ausgeführt wird, auch wenn die Abbruchbedingung von Anfang an erfüllt
ist.
Beispiel:
Anweisungen Zugehöriges Struktogramm
OUT1:=0;
INDEX:=0;
REPEAT
INDEX:=INDEX + 1;
OUT1:=OUT1 + INDEX;
UNTIL INDEX >= ENDW
END_REPEAT;
10.3 Anweisungen 359
10.3.2.7 EXIT-Anweisung
Eine EXIT-Anweisung dient zum Verlassen einer Schleife (FOR, WHILE oder REPEAT) an
beliebiger Stelle und unabhängig davon, ob die Abbruchbedingung erfüllt ist. Die Anweisung
ist im Struktogramm nicht darstellbar.
Die EXIT-Anweisung wird nach folgenden Regeln bearbeitet:
x Diese Anweisung bewirkt das sofortige Verlassen derjenigen Wiederholungsanweisung,
die die EXIT-Anweisung unmittelbar umgibt.
x Die Ausführung des Programms wird nach dem Ende der Wiederholungsschleife (z. B.
nach END_FOR) fortgesetzt.
Beispiel:
Anweisungen Programmablaufplan
OUT1:=0;
INDEX:=0;
REPEAT
OUT1:=OUT1+INDEX;
IF OUT1 > ABRW THEN
EXIT;
END_IF;
INDEX:=INDEX+1;
UNTIL INDEX > ENDW
END_REPEAT;
10.3.2.8 RETURN-Anweisung
Eine RETURN-Anweisung bewirkt das Verlassen des aktuell bearbeiteten Bausteins und die
Rückkehr zum aufrufenden Baustein bzw. zum Betriebssystem.
Beispiel:
Anweisungen Struktogramm
IF WERT > 100 THEN
RETURN
ELSE
... //Weitere Anweisungen
10.3.2.9 CONTINUE-Anweisung
Eine CONTINUE-Anweisung dient zum Abbruch der Ausführung des momentanen Schlei-
fendurchlaufes einer Wiederholungsanweisung (FOR, WHILE oder REPEAT). Die Anwei-
sung ist nur bei STEP 7 SCL vorhanden und mit einem Struktogramm nicht darstellbar.
Die CONTINUE-Anweisung wird nach folgenden Regeln bearbeitet:
x Diese Anweisung bewirkt die sofortige Umgehung des Schleifenrumpfes, ohne die Schlei-
fenbearbeitung zu unterbrechen.
x Abhängig davon, ob die Bedingung für die Wiederholung der Schleife erfüllt ist oder nicht,
wird der Schleifenrumpf weiterhin bearbeitet oder die Schleife verlassen.
360 10 Programmiersprache Strukturierter Text ST (SCL)
10.3.2.10 GOTO-Anweisung
Mit einer GOTO-Anweisung kann ein Programmsprung realisieren werden. Die Anweisung
bewirkt den sofortigen Sprung zu einer angegebenen Sprungmarke und damit zu einer anderen
Anweisung innerhalb desselben Bausteins.
Nach den Regeln der strukturierten Programmierung sollte die GOTO-Anweisung nicht ver-
wendet werden. Die Anweisung ist nur bei STEP 7 SCL vorhanden und mit einem Strukto-
gramm nicht darstellbar.
Bei der Verwendung der GOTO-Anweisung sind folgende Regeln zu beachten:
x Das Ziel einer Sprunganweisung muss innerhalb desselben Bausteins liegen.
x Das Sprungziel muss eindeutig sein.
x Einsprung in einen Schleifenblock ist nicht zulässig. Aussprung aus einem Schleifenblock
ist möglich.
Beispiel:
Anweisungen Programmablaufplan
..
IF Wert1 > Wert2 THEN
GOTO MARKE1 ;
ELSIF Wert1 > Wert3 THEN
GOTO MARKE2 ;
ELSE
GOTO MARKE3 ;
END_IF ;
MARKE1: INDEX := 1 ;
GOTO MARKE3 ;
MARKE2: INDEX := 2 ;
. . .
MARKE3: ..//Programmfortsetzung .
10.3 Anweisungen 361
Aufruf in CoDeSys
Bei CoDeSys können derzeit bei Funktionen keine Ausgangsparameter deklariert werden. Das
Ergebnis der Funktion steht somit stets im Rückgabewert. In ST kann ein Funktionsaufruf als
Operand in Ausdrücken verwendet werden.
Beispiel: Ergebnis: = FC10 (IN1: =10, 20, IN3: =VAR1)
Hinweis: Statt FC10 können beliebige Bezeichnungen verwendet werden.
10.4 Beispiele
P_HYS:=MEW*HYS/100; P_HYS:=MEW*HYS/100;
IF MEW<(SP-P_HYS/2) THEN IF MEW<(SP-P_HYS/2) THEN
OUT:=TRUE; OUT:=TRUE;
ELSIF ELSIF
MEW>(SP+P_HYS/2) THEN MEW>(SP+P_HYS/2) THEN
OUT:=FALSE; OUT:=FALSE;
ELSE ELSE
OUT:=OUT; OUT:=OUT;
END_IF; END_IF
END_FUNCTION
Die Realisierung der Zeit erfolgt bei STEP 7 SCL mit der Funktion S_ODT (SE) als IN-Variable und bei
CoDeSys mit dem Funktionsblock TON als IN_OUT_Variable.
STEP 7 Programm: CoDeSys Programm:
Aufruf der Funktion FC 1002 im OB 1 Aufruf der Funktion FC 1002 im PLC_PRG
Ein Funktionsausgang FEH soll anzeigen, wenn versehentlich die Ober- und Untergrenze mit gleichen
Werten versehen wurden, der Eingangs- oder Ausgangsbereich also null ist.
Übergabeparameter: Beschreibung der Parameter:
IN_R: REAL Abzubildender REAL-Wert
IN_MAX: REAL Obergrenze des Eingangsbereichs
IN_MIN: REAL Untergrenze des Eingangsbereichs
OUT_MAX: REAL Obergrenze des Ausgangsbereichs
OUT_MIN: REAL Untergrenze des Ausgangsbereichs
OUT_R: REAL Abgebildeter REAL-Wert
FEH: BOOL Anzeige Bereichsangabe falsch
Zum Test der Funktion FC 1003 werden an den Funktionseingang IN_R und an den Funktionsausgang
OUT_R je ein Merkerdoppelwort gelegt. An die Eingangs und Ausgangsgrenzen können beliebige Zah-
lenwerte angelegt werden. Der Funktionsausgang FEH wird dem SPS-Ausgang A 4.1 zugewiesen. Über
„Variable beobachten/steuern“ kann dann ein Eingangswert vorgegeben und das Ergebnis beobachtet
werden.
Zuordnungstabelle der Ausgänge und Merker:
Ausgangsvariable Symbol Datentyp Logische Zuordnung Adresse
Bereichsangabenüberprüfung FEH BOOL Bereich = 0 FEH = 1 A 4.1
Merkervariable
Eingangs-REAL-Zahl MD_1 REAL Gleitpunktzahl MD 10
Ausgangs-REAL-Zahl MD_2 REAL Gleitpunktzahl MD 20
Lösung
Die Berechnungsformel für die lineare Abbildung leitet sich aus den Geradengleichungen der beiden
Bereiche her.
IN _ MAX IN _ MIN OUT _ MAX OUT _ MIN
IN _ R IN _ MIN OUT _ R OUT _ MIN
Im Steuerungsprogramm wird zunächst überprüft, ob die Differenzen von IN_MAX – IN_MIN bzw.
OUT_MAX – OUT_MIN verschieden von null sind. Wenn JA, wird der Ausgangswert nach der vorge-
10.4 Beispiele 367
gebenen Formel berechnet und der Ausgang FEH erhält 0-Signal. Wenn NEIN, wird die Berechnung
nicht durchgeführt, der Ausgang FEH erhält 1-Signal und der Ausgangswert OUT_R wird auf 0.0 gesetzt.
STEP 7 Programm (SCL-Quelle): CoDeSys Programm (ST):
FUNCTION FC1003 : VOID TYPE FC_OUT :
STRUCT
VAR_INPUT OUT_R:REAL;
IN_R:REAL; FEH:BOOL;
IN_MAX, IN_MIN:REAL; END_STRUCT
OUT_MAX, OUT_MIN:REAL; END_TYPE
END_VAR
VAR_OUTPUT FUNCTION FC1003 :FC_OUT
OUT_R:REAL; VAR_INPUT
FEH:BOOL; IN_R: REAL;
END_VAR IN_MAX, IN_MIN:REAL;
VAR_TEMP OUT_MAX, OUT_MIN: REAL;
DIFF1, DIFF2:REAL; END_VAR
END_VAR VAR
DIFF1, DIFF2: REAL;
DIFF1:= IN_MAX-IN_MIN; END_VAR
DIFF2:= OUT_MAX-OUT_MIN;
FEH := (DIFF1=0) OR (DIFF2=0); DIFF1:= IN_MAX-IN_MIN;
IF NOT FEH THEN DIFF2:= OUT_MAX-OUT_MIN;
OUT_R:= (OUT_MAX-OUT_MIN) FC1003.FEH := (DIFF1=0) OR (DIFF2=0);
/DIFF1*(IN_R-IN_MIN) IF NOT FC1003.FEH THEN
+OUT_MIN; FC1003.OUT_R:= (OUT_MAX-OUT_MIN)
ELSE OUT_R:=0.0; /DIFF1*(IN_R-IN_MIN)
END_IF; +OUT_MIN;
END_FUNCTION ELSE FC1003.OUT_R:=0.0;
END_IF
Lösung
Das Setzen eines bestimmten Bits der Meldevariablen erfolgt durch eine ODER-Verknüpfung der Mel-
devariablen mit einer Konstanten, bei der genau an der Stelle, an der das Bit der Meldevariablen auf
TRUE gesetzt werde soll, eine „1“ steht. Die Konstante wird durch Linksschieben von DWORD#16#1
um so viele Stellen, wie die Bit_Nr angibt, erzeugt.
Das Rücksetzen eines bestimmten Bits der Meldevariablen erfolgt durch eine UND-Verknüpfung
der Meldevariablen mit einer Konstanten, bei der genau an der Stelle, an der das Bit der Meldevariable
auf FALSE gesetzt werden soll, eine „0“ steht. Die Konstante wird durch Rotieren von
DWORD#16#FFFFFFFE um so viele Stellen, wie die Bit_Nr angibt, erzeugt.
STEP 7 Programm (SCL-Quelle): CoDeSys Programm (ST):
FUNCTION FC1004 : BOOL FUNCTION FC1004 :BOOL
VAR_INPUT VAR_INPUT
N_BIT:INT; N_BIT:INT;
B_W:BOOL; B_W:BOOL;
END_VAR END_VAR
VAR_IN_OUT VAR_IN_OUT
X_DW:DWORD; X_DW:DWORD;
END_VAR END_VAR
Technologieschema:
Es ist ein Funktionsbaustein FB 1005 zu entwerfen, der die Plattendicke überprüft, welche sich aus der
Differenz der beiden Laser-Messungen ergibt. Während und nach der Messung soll der Funktionsbau-
stein den größten (M_MAX) bzw. kleinsten Wert (M_MIN) der Plattendicke ausgeben. Liegen die beiden
Werte außerhalb des mit V_MAX und V_MIN vorgegebnen Bereichs, wird die Ausschussleuchte P1
eingeschaltet. Gestartet und beendet wird die Messung mit dem Sensor S1, der ein 1-Signal liefert, solan-
ge sich die Keramikplatte in der Messeinrichtung befindet. Zu Beginn einer neuen Messung werden die
Ausgabewerte des Funktionsbausteins mit den Werten des neuen Messzyklus überschrieben.
Übergabeparameter: Beschreibung der Parameter:
START: BOOL Starten der Prüfung mit Sensor S1
DICKE: REAL Laufende Messwerte der Dicke
V_MAX: REAL Vorgabe der Obergrenze
V_MIN: REAL Vorgabe der Untergrenze
D_MAX: REAL Ausgabe der maximalen Dicke
D_MIN: REAL Ausgabe der minimalen Dicke
P1: BOOL Anzeige Ausschuss
Zum Test des Funktionsbausteins FB 1005 wird an den Eingang START der Sensor S1 gelegt. Dem
Funktionseingang DICKE wird ein Merkerdoppelwort MD_1 zugewiesen. An V-MAX und V_MIN
können beliebige REAL-Zahlen geschrieben werden. An die Ausgangswerte D_MAX und D_MIN wer-
den Merkerdoppelwörter geschrieben und der Ausgang FEH dem SPS-Ausgang A 4.1 zugewiesen. Über
„Variable beobachten/steuern“ kann dann ein Messwert vorgegeben und das Ergebnis beobachtet werden
Hinweis: Bei STEP 7 wird die Flankenauswertung im Programm durch die Einführung einer statischen
Lokalvariablen als Flankenoperand FO programmiert (siehe Kapitel 4.6). Bei CoDeSys könnte für die
Flankenauswertung der Funktionsblock R_TRIG mit der lokalen Variablen FO als Instanz benutzt wer-
den. Wird jedoch die Programmierung einer Flankenauswertung wie bei STEP 7 verwendet, sind die bei-
den Programme ST und SCL bis auf die Anweisung „END_FUNCTION_BLOCK“ bei STEP 7 identisch.
370 10 Programmiersprache Strukturierter Text ST (SCL)
Funktionsbaustein FB 1006:
Übergabeparameter: Beschreibung der Parameter:
KFORM: INT Nummer (0 ... 9) der Kurvenform
PERIODE: TIME Periodendauer
AMPLITUDE: INT Amplitude A der Kurven
RESET BOOL Rücksetzen und Ausschalten des Fkt.-Generators
OUT INT Ausgabe der Kurve
10.4 Beispiele 371
Das STEP 7 SCL Programm und das CoDeSys ST Programm unterscheiden sich nur durch die bei
STEP 7 erforderliche Anweisung „END_FUNCTION_BLOCK“ und einen Doppelpunkt, der bei STEP 7
bei der CASE-Anweisung hinter ELSE stehen muss und bei CoDeSys nicht.
Beispiel 10.7: Bestimmung von Minimum, Maximum und arithmetischer Mittelwert in einem
eindimensionalen Datenfeld (FC1007_F_MINMAX)
In einem eindimensionalen Datenfeld mit 100 Werten soll der größte, der kleinste und der arithmetischen
Mittelwert bestimmt werden. Die Werte liegen im Datenformat REAL vor. Der Bereich des Datenfeldes
für die Bestimmung des Maximums MAXW, Minimums MINW und arithmetischen Mittelwertes AMW
wird durch die Angabe der ersten Feld-Nummer F_NR und die Anzahl der Werte ANZ vorgegeben. Bei
einer fehlerhaften Vorgabe des Datenbereichs (z. B. F_Nr:= 50 und ANZ 60) hat der Ausgang FEH
1-Signal und den Ausgabewerten MAXW, MINW und AMW wird 0.0 zugewiesen.
Zum Test der Funktion FC 1007 wird ein Datenfeld mit 100 unterschiedlichen Gleitpunktzahlen angelegt.
Bei STEP 7 kann dies innerhalb eines Datenbausteins DB erfolgen. Die Feldanfangsnummer F_NR und
die Anzahl ANZ des zu untersuchenden Bereichs werden mit den Eingangsworten EW8 und EW10 vor-
gegeben. Mit der Taste S1 wird die Bearbeitung der Funktion FC 1007 über den EN-Eingang gesteuert.
Die Ergebnisse der Bearbeitung MINW, MAXW und AMW werden den Merkerdoppelwörtern MD10,
MD20 und MD30 zugewiesen. Die Funktionsweise des Bausteins FC 1007 kann mit „Variable beobach-
ten/steuern“ überprüft werden.
Zuordnungstabelle der Eingänge, Ausgänge und Merker:
Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse
Berechnung EIN S1 BOOL Betätigt S1 = 1 E 0.0
Vorgabe Feldanfangsnummer F_NR INT Integer Zahl EW 8
Vorgabe Anzahl der Feldwerte ANZ INT Integer Zahl EW 10
Ausgangsvariable
Fehlerhafte Bereichsvorgabe FEH BOOL Falsche Vorgabe FEH = 1 A 4.0
Merkervariable
Kleinster Wert MINW REAL Gleitpunktzahl MD 10
Größter Wert MAXW REAL Gleitpunktzahl MD 20
Arithmetischer Mittelwert AMW REAL Gleitpunktzahl MD 30
10.4 Beispiele 373
Der Algorithmus für die Ermittlung des kleinsten und des größten Feldwertes basiert auf dem Vergleich
jedes Wertes mit dem aktuellen Minimalwert MINW bzw. dem aktuellen Maximalwert MAXW. Falls der
Vergleich erfüllt ist wird der jeweilige Feldwert dem aktuellen Minimalwert bzw. Maximalwert zugewie-
sen. Für die Berechnung des arithmetischen Mittelwertes wird jeder Feldwert zu der Variablen AMW
addiert.
Nachdem alle Werte addiert sind, wird die Summe durch die Anzahl der Werte dividiert. (Siehe auch
Beispiel 9.3 „Bestimmung von Minimum, Maximum und arithmetischer Mittelwert in einem Datenbau-
stein“.) Zu Beginn wird abgefragt, ob die Bereichswahl gültig ist.
Hinweis: Bei STEP 7 wird das zu untersuchende Feld in einem Datenbaustein DB 10 angelegt. Bei
CoDeSyS wird im PLC_PRG eine Feldvariable FELD deklariert und mit entsprechenden Startwerten ver-
sehen.
Für die Überwachung der Betriebszeit ist ein Funktionsbaustein FB 1008 zu entwerfen, der zusammen
mit einem Datenfeld die Aufgabe der Betriebsstundenzählung und Auswertung für einen Brenner über-
nimmt. Nach jedem Betriebszyklus des Brenners wird die gemessene Betriebszeit, die Gesamtbetriebszeit
und die Anzahl der Betriebsintervallen in das zum Brenner gehörende Datenfeld hinterlegt. Bei STEP 7
befindet sich das Datenfeld in einem Datenbaustein DB. Bei CoDeSys wird das Datenfeld in einer Vari-
ablen realisiert. Über den Eingang TAKT erhält der Betriebsstundenzähler des Funktionsblocks Zählim-
pulse von einem Taktgenerator Die maximale Betriebsdauer und Anzahl der Betriebszyklen werden an
den Funktionsbaustein-Eingängen T_AMX und E_ZYK vorgegeben. Das Ende einer Wartung des Bren-
ners wird dem Funktionsblock über den Eingang QUIT mitgeteilt.
Lösung in STEP 7
Der Datenbaustein DB 10, mit dem Inhalt: Anzahl der Einschatzyklen, Gesamtbetriebszeit und Betriebs-
zeiten für die einzelnen Einschaltzyklen wird wie folgt angelegt:
Hinweis: Für die indirekte Adressierung des Datenbausteins DB[DBNR], wie im Struktogramm angege-
ben, muss in SCL die Anweisung WORD_TO_BLOCK_DB(DBNR) verwendet werden.
FC 1008 SCL-Quelle
VAR_INPUT
BR_EIN, TAKT:BOOL; DB_NR :INT; T_MAX :DINT; EZ_MAX:INT; QUIT :BOOL;
END_VAR
VAR_OUTPUT T_AK, T_GE:DINT; P_WA:BOOL; END_VAR
VAR E_ZAE, ZAE:INT; FO1,FO2,FO3,FO4:BOOL; END_VAR
VAR_TEMP DBNR:WORD; END_VAR
// Anweisungsteil
DBNR:=INT_TO_WORD(DB_NR);
IF BR_EIN = 1 AND FO1 = 0 THEN
E_ZAE:=WORD_TO_INT(WORD_TO_BLOCK_DB(DBNR).DW0); E_ZAE:=E_ZAE + 1;
10.4 Beispiele 377
T_AK:=0;
END_IF; FO1:=BR_EIN;
IF BR_EIN = 1 THEN
IF TAKT = 1 AND FO2=0 THEN T_AK:=T_AK + 1; END_IF;
FO2:=TAKT; T_GE:= DWORD_TO_DINT(WORD_TO_BLOCK_DB(DBNR).DD2)+ T_AK;
END_IF;
IF T_GE > T_MAX OR E_ZAE >= EZ_MAX THEN P_WA:=1;END_IF;
IF BR_EIN = 0 AND FO3 = 1 THEN
WORD_TO_BLOCK_DB(DBNR).DW0:=INT_TO_WORD(E_ZAE);
WORD_TO_BLOCK_DB(DBNR).DD[(E_ZAE+1)*4-2]:= DINT_TO_DWORD(T_AK);
WORD_TO_BLOCK_DB(DBNR).DD2:= DINT_TO_DWORD(T_GE);
END_IF; FO3:=BR_EIN;
IF QUIT = 1 AND FO4=0 THEN P_WA:=0; T_GE:=0; T_AK:=0;
FOR ZAE:= 0 TO (E_ZAE+1)*4+2 DO
WORD_TO_BLOCK_DB(DBNR).DB[ZAE]:=0;
END_FOR;
END_IF; FO4:=QUIT;
END_FUNCTION_BLOCK
Lösung in CoDeSys
Der Unterschied zur Lösung in STEP 7 besteht in der Adressierung des Datenfeldes. Statt des Datenbau-
steins DB wird zunächst eine Datentyp FELD mit den erforderlichen Variablen angelegt.
TYPE FELD : STRUCT
E_ZAE:INT; G_ZEIT:DINT; A_ZEIT:ARRAY[1..100] OF DINT; END_STRUCT
END_TYPE
Im PLC_PRG wird als Datenfeld dann die Variable DATEN mit dem Datentyp FELD deklariert.
ST-Programm FB 1008:
FUNCTION_BLOCK FB1008
VAR_INPUT BR_EIN, TAKT: BOOL; T_MAX, E_ZYKL: INT; QUIT: BOOL; END_VAR
VAR_OUTPUT T_AK, T_GE: DINT; P_WA: BOOL; END_VAR
VAR_IN_OUT Daten: FELD; END_VAR
VAR E_ZAE, ZAE:INT; FO1, FO2, FO3, FO4:BOOL; END_VAR