28
350 10 Programmiersprache Strukturierter Text ST (SCL) 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: Programmierung komplexer Algorithmen für digitale Variablen Programmierung mathematischer Funktionen Daten- bzw. Rezepturverwaltung Prozessoptimierung 10.1 Bausteine in ST (SCL) Die Programmiersprache ST (SCL) kann in allen von der DIN EN 61131-3 definierten Pro- grammorganisationseinheiten verwendet werden. Der Aufbau der Programmorganisationsein- heiten besteht aus den Bereichen: Bausteinanfang, Deklarationsteil, Anweisungsteil und Bau- steinende. 10.1.1 Bausteinanfang und -ende Der Quelltext für einen einzelnen Baustein wird abhängig von der Bausteinart mit einem Stan- dardbezeichner für den Anfang des Bausteins und der Bausteinbezeichnung eingeleitet. Abge- schlossen wird er bei STEP 7 mit einem Standardbezeichner für das Ende des Bausteins. Die Syntax für die verschiedenen Bausteinarten zeigt folgende Tabelle: Bausteinart Name Syntax in STEP 7 Syntax in CoDeSys Programm PRG PROGRAM xxxx Organisationsbaustein OB ORGANIZATION_BLOCK OBxx ... END_ORGANIZATION_BLOCK Funktion FC FUNCTION FCxx : TYP ... END_FUNCTION FUNCTION FCxx : TYP Funktionsbaustein FB FUNCTION_BLOCK FBxx ... END_FUNCTION_Block FUNCTION_BLOCK FBxx Datenbaustein DB DATA_BLOCK DBxx ... END_DATA_Block UDT-Baustein (Datenstruktur) UDT TYPE UDTxx ... END_TYPE

10 Programmiersprache Strukturierter Text ST (SCL) · 2018-10-12 · 352 10 Programmiersprache Strukturierter Text ST (SCL) Kontrollanweisungen, die dazu dienen, Anweisungen oder

  • Upload
    others

  • View
    31

  • Download
    0

Embed Size (px)

Citation preview

350

10 Programmiersprache Strukturierter Text ST (SCL)

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: Programmierung komplexer Algorithmen für digitale Variablen Programmierung mathematischer Funktionen Daten- bzw. Rezepturverwaltung Prozessoptimierung

10.1 Bausteine in ST (SCL) Die Programmiersprache ST (SCL) kann in allen von der DIN EN 61131-3 definierten Pro-grammorganisationseinheiten verwendet werden. Der Aufbau der Programmorganisationsein-heiten besteht aus den Bereichen: Bausteinanfang, Deklarationsteil, Anweisungsteil und Bau-steinende.

10.1.1 Bausteinanfang und -ende Der Quelltext für einen einzelnen Baustein wird abhängig von der Bausteinart mit einem Stan-dardbezeichner für den Anfang des Bausteins und der Bausteinbezeichnung eingeleitet. Abge-schlossen wird er bei STEP 7 mit einem Standardbezeichner für das Ende des Bausteins. Die Syntax für die verschiedenen Bausteinarten zeigt folgende Tabelle:

Bausteinart Name Syntax in STEP 7 Syntax in CoDeSys Programm PRG PROGRAM xxxx

Organisationsbaustein OB ORGANIZATION_BLOCK OBxx ... END_ORGANIZATION_BLOCK

Funktion FC FUNCTION FCxx : TYP ... END_FUNCTION

FUNCTION FCxx : TYP

Funktionsbaustein FB FUNCTION_BLOCK FBxx ... END_FUNCTION_Block

FUNCTION_BLOCK FBxx

Datenbaustein DB DATA_BLOCK DBxx ... END_DATA_Block

UDT-Baustein (Datenstruktur)

UDT TYPE UDTxx ... END_TYPE

10.1 Bausteine in ST (SCL) 351

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:

Daten Syntax in STEP 7 Syntax in CoDeSYS Eingangsparameter (Eingangsvariable)

VAR_INPUT IN1:BOOL:=FALSE; END_VAR

VAR_INPUT IN1:BOOL:=FALSE; END_VAR

Ausgangsparameter (Ausgangsvariable)

VAR_OUTPUT OUT1:BOOL:=TRUE; END_VAR

VAR_OUTPUT OUT1:BOOL:=TRUE; END_VAR

Durchgangsparameter (Durchgangsvariable)

VAR_IN_OUT INOUT1:INT:=123; END_VAR

VAR_IN_OUT INOUT1:INT; END_VAR

Statische Variable VAR VAR1:REAL:=0.1; END_VAR

VAR VAR1:REAL:=0.1; END_VAR

Konstanten CONST Wert:=16#FFFF; END_CONST

VAR CONSTANT Wert:WORD:=16#FFFF END_VAR

Temporäre Variable VAR_TEMP VAR2:REAL; END_VAR

Remanente Variable VAR RETAIN VAR3:INT:=123; END_VAR

Sprungmarken LABEL Marke1, Make2; END_LABEL

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:

Regel STEP 7 CoDeSys

Jede Anweisung endet mit einem Semikolon. x x Alle verwendeten Bezeichner müssen vorher vereinbart sein. x x Der Anweisungsteil wird mit dem Schlüsselwort BEGIN eingeleitet. x - Der Anweisungsteil endet mit dem Schlüsselwort für das Bausteinende. x - Vor jeder Anweisung können optional Sprungmarken stehen. x -

10.2 Ausdrücke, Operanden und Operatoren

10.2.1 Übersicht Ein Ausdruck ist ein Konstrukt, das bei Auswertung einen Wert liefert, der zur Laufzeit des Programms berechnet wird. Ausdrücke bestehen aus Operanden (z. B. Konstanten, Variablen oder Funktionsaufrufe) und Operatoren (z. B. *, /, + oder –). Der Datentyp des Operanden und der verwendete Operator bestimmen den Typ des Ausdrucks. ST (SCL) unterscheidet arithme-tische Ausdrücke, Vergleichs-Ausdrücke und logische Ausdrücke Die Auswertung eines Ausdrucks erfolgt durch Anwenden der Operatoren auf die Operanden in bestimmter Reihenfolge. Diese ist festgelegt durch die Priorität der beteiligten Operatoren, der links-rechts Reihenfolge oder durch die vorgenommene Klammerung. Das Ergebnis eines Ausdrucks kann einer Variablen zugewiesen werden, als Bedingung für eine Abfrage oder als Parameter für den Aufruf einer Funktion oder eines Funktionsbausteines verwendet werden.

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: Division durch Null Operanden haben nicht den für die Operation erforderlichen Datentyp. Das Ergebnis überschreitet den Wertebereich des Datentyps.

10.2 Ausdrücke, Operanden und Operatoren 353

Zusammenstellung der Operatoren der Sprache ST (SCL):

Klasse Operation Symbol Rang Hinweis Zuweisungsoperation Zuweisung := 11 Arithmetische Operationen

Potenz unäres Plus unäres Minus Multiplikation Division Modulo-Funktion ganzzahlige Division Addition Subtraktion

** + - * /

MOD DIV

+ -

2 3 3 4 4 4 4 5 5

Vergleichsoperationen Kleiner Größer Kleiner gleich Größer gleich Gleichheit Ungleichheit

< >

<= >= =

<>

6 6 6 6 7 7

Logische Operationen Negation UND ODER EXCLUSIV-ODER

NOT AND od. &

OR XOR

3 8

10 9

Klammerungszeichen Klammer auf/zu ( ) 1 Funktionsbearbeitung (Auswahl)

Exponent e hoch N Exponent 10 hoch N Exponent M hoch N Natürlicher Logarithmus Dekad. Logarithmus Betrag Quadrat Quadratwurzel Arcus-Cosinus Arcus-Sinus Arcus-Tangens Cosinus Sinus Tangens

EXP EXPD EXPT

LN LOG ABS SQR

SQRT ACOS ASIN ATAN COS SIN TAN

Bei STEP 7

Bei CoDeSys

Bei STEP 7

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: Ein Operand zwischen zwei Operationen von unterschiedlicher Priorität ist immer an die

höherrangige gebunden. Die Operationen werden entsprechend der hierarchischen Rangfolge bearbeitet. Operationen gleicher Priorität werden von links nach rechts bearbeitet. Das Voranstellen eines Minuszeichens vor einen Bezeichner ist gleichbedeutend mit der

Multiplikation mit –1. Arithmetische Operationen dürfen nicht direkt aufeinander folgen. Deshalb ist der Aus-

druck a * –b ungültig, aber a*(–b) erlaubt. Das Setzen von Klammerpaaren kann den Operationenvorrang außer Kraft setzen, d. h., die

Klammerung hat die höchste Priorität. Ausdrücke in Klammern werden als einzelner Operand betrachtet und immer als Erstes

ausgewertet. Die Anzahl von linken Klammern muss mit der von rechten Klammern übereinstimmen. 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

Wertzuweisungen von Feldkomponenten Feldname_1[ n ] := Feldname_2[ m ] ; Feldname_1[ n ] := Ausdruck ; Bezeichner_1 := Feldname_1[ n ] ; Feldname_1 := Feldname_2

Wertzuweisungen mit Variablen vom Typ STRING MELDUNG_1 := 'Fehler in Modul 3' ; MELDUNG_2 := STRUKTUR1.MELDUNG_3 ;

Wertzuweisungen mit Variablen vom Typ DATE_AND_TIME ZEIT_1 := DATE_AND_TIME#1995-01-01-12:12:12.2 ; STRUKTUR1.ZEIT_3 := DT#1995-02-02-11:11:11 ; ZEIT_1 := STRUKTUR1.ZEIT_2 ;

Der Zugriff auf SPS-Operanden wie Eingänge, Ausgänge, Merkern, sowie bei STEP 7 Daten-bausteine und UDTs unterscheidet sich bei den beiden Programmiersystemen. Bei CoDeSys können die Variablennamen durch die absolute SPS-Adresse ersetzt werden. Bei STEP 7 gibt es die Möglichkeiten eines absoluten, indizierten und symbolische Zugriffs. Beispiele für Wertzuweisungen mit SPS-Operanden bei STEP 7: Absoluter Zugriff: STATUSWORT1 := EW4 ; A1.1 := TRUE ; Wert1 := DB11.DW1 ; Wert1_1[1] := DB11.ZAHL

Indizierter Zugriff: STATUSWORT3 := EB[ADRESSE] ; A[1.ByteNR]:= Wert2;

Symbolischer Zugriff: Messwert_1:= Sens_1 //In der Symboltabelle ist die absolute //Adresse E 1.7 für Sens_1 festgelegt.

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)

Wiederholungsanweisungen: Wiederholungsanweisungen legen fest, dass eine Gruppe von zugehörigen Anweisungen wiederholt ausgeführt werden muss.

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.

Programmsprünge: Ein Programmsprung bewirkt das sofortige Verlassen der Programm-schleife, das sofortige Verlassen des Bausteins oder nur bei STEP 7 den sofortigen Sprung zu einem angegebenen Sprungziel und damit zu einer anderen Anweisung innerhalb desselben Bausteins.

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-Anweisung

Die CONTINUE-Anweisung kann die momentane Bearbeitung des 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: Die erste Anweisungsfolge, deren logischer Ausdruck = TRUE ist, kommt zur Ausführung.

Die restlichen Anweisungsfolgen kommen nicht zur Ausführung. Falls kein boolescher Ausdruck = TRUE ist, wird die Anweisungsfolge bei ELSE ausge-

führt (oder keine Anweisungsfolge, falls der ELSE-Zweig nicht vorhanden ist). 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: Der Auswahl-Ausdruck muss einen Wert vom Typ INTEGER liefern. 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.

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: Die Laufvariable darf nur vom Datentyp INT oder DINT sein. 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: Vor jeder Ausführung des Anweisungsteils wird die Durchführungsbedingung ausgewertet

(abweisende Schleife oder kopfgesteuerte Schleife). Der auf DO folgende Anweisungsteil wird solange wiederholt bearbeitet, wie die Durch-

führungsbedingung den Wert TRUE liefert. 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: Diese Anweisung bewirkt das sofortige Verlassen derjenigen Wiederholungsanweisung,

die die EXIT-Anweisung unmittelbar umgibt. 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: Diese Anweisung bewirkt die sofortige Umgehung des Schleifenrumpfes, ohne die Schlei-

fenbearbeitung zu unterbrechen. 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)

In einer FOR-Anweisung wird direkt nach einer CONTINUE-Anweisung die Laufvariable um die angegebene Schrittweite erhöht.

Beispiel: Anweisungen Programmablaufplan OUT1:=0; INDEX:=0; REPEAT INDEX:=INDEX+1; IF OUT1 >= OGR THEN CONTINUE; END_IF; OUT1:=OUT1+10; UNTIL INDEX > ENDW-1 END_REPEAT;

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: Das Ziel einer Sprunganweisung muss innerhalb desselben Bausteins liegen. Das Sprungziel muss eindeutig sein. 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

10.3.3 Steueranweisungen für Funktionen und Funktionsbausteinen Beim Aufruf von Funktionen oder Funktionsbausteinen findet ein Datenaustausch zwischen dem aufrufenden und dem aufgerufenen Baustein statt. In der Schnittstelle des aufgerufenen Bausteins sind Parameter definiert, mit denen der Baustein arbeitet. Diese Parameter werden als Formalparameter bezeichnet. Sie sind lediglich „Platzhalter“ für die Parameter, die dem Baustein beim Aufruf übergeben werden. Die beim Aufruf übergebenen Parameter werden als Aktualparameter bezeichnet. Die Parameter, die übergeben werden sollen, müssen im Aufruf als Parameterliste angegeben werden. Die Parameter werden in Klammern geschrieben. Mehrere Parameter werden durch Kommas getrennt.

10.3.3.1 Aufruf von Funktionsbausteinen Bei Funktionsbausteinaufruf hat die Beschaltung der Eingangs- und Durchgangsparameter die Form einer Wertzuweisung. Durch diese Wertzuweisung wird den Parametern, die im Verein-barungsteil des aufgerufenen Bausteins definiert sind (Formalparametern), ein Wert (Aktualpa-rameter) zugewiesen. Die Ausgangsparameter können nach der Bearbeitung des aufgerufenen Bausteins aus der zugehörigen Instanz mit einer Wertzuweisung gelesen werden. Aufruf in STEP 7 Beim Aufruf eines Funktionsbausteins können sowohl globale Instanz-Datenbausteine als auch lokale Instanzbereiche (Multiinstanzen) des aktuellen Instanz-Datenbausteins benutzt werden. Globale Instanz: Der Aufruf erfolgt in einer Aufrufanweisung unter Angabe des Namens des Funktionsbausteins bzw. Systemfunktionsbausteins (FB oder SFB-Bezeichnung), des Instanz-Datenbausteins (DB-Bezeichnung) sowie der Parameterversorgung (FB-Parameter). Ein Auf-ruf einer globalen Instanz kann absolut oder symbolisch definiert sein. Beispiel: FB10.DB20(IN1:=10,IN2:=5,... ); REGLER.DATEN (IN1:=10,IN2:=5,... );

Lokale Instanz: Der Aufruf erfolgt in einer Aufrufanweisung unter Angabe des lokalen In-stanznamens und der Parameterversorgung. Ein Aufruf einer lokalen Instanz ist immer symbo-lisch. Der symbolische Namen muss im Vereinbarungsteil des aufrufenden Bausteins verein-bart werden. Beispiel: REGDATEN (IN1:=10, IN2:=VAR2, ... ); Ausgangswerte: Nach dem Bausteindurchlauf des aufgerufenen FBs sind die übergebenen aktuellen Eingangsparameter unverändert und die übergebenen aber veränderten Werte der Durchgangsparameter aktualisiert. Nun können die Ausgangsparameter vom aufrufenden Bau-stein aus dem globalen Instanz-Datenbaustein oder dem lokalen Instanzbereich gelesen wer-den. Beispiel: ERGEBNIS:=DB10.STELLWERT; ERGEBNIS:=DATEN.OUT1;

Aufruf in CoDeSys Bei CoDeSys wird der Funktionsblock mit dem Namen der Instanz des Bausteins aufgerufen. Anschließend werden in Klammer die gewünschten Werte den Parametern zugewiesen. Die

362 10 Programmiersprache Strukturierter Text ST (SCL)

Ergebnisvariable kann mit der Konstruktion Instanzname.Variablenname angesprochen wer-den. Beispiel: FB10_INST1(IN1:=10, IN2:= VAR1, ... ) ERGEBNIS:= FB10_INST1.OUT1;

10.3.3.2 Aufruf von Funktionen Eine Funktion ist ein Baustein, der als Ergebnis der Ausführung genau ein Wert (der auch ein Feld oder eine Struktur sein kann) zurückliefert und nach DIN EN 61131-3 noch beliebig viele zusätzliche Durchgangs- (VAR_IN_OUT) oder Ausgangselemente (VAR_OUTPUT) liefert. Aufruf in STEP 7 Der Aufruf einer Funktion erfolgt unter Angabe des Funktionsnamens (FC.., SFC.. oder BEZEICHNER), sowie der Parameterliste, welche die Eingangs-, Durchgangs-, und Aus-gangsparameter enthält. Der Funktionsname, der den Rückgabewert bezeichnet, kann absolut oder symbolisch angegeben werden. Beispiele: Aufruf ohne Rückgabewert: FC10 (LAE:=VAR1, BRE:= VAR2, FLA:= Ergebnis); Aufruf mit Rückgabewert: Ergebnis:= FC10 (LAE:=VAR1, BRE:= VAR2);

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.3.3.3 Aufruf von Zählern und Zeiten Werden die Standard-Funktionsbausteine für Zähler CTU, CTD und CTUD sowie für Zeiten TP, TON und TOF verwendet, so gelten für deren Aufrufe die Regeln für den Aufruf von Funktionsbausteinen. Beispiel: STEP 7: SFB2.DB22(CU:=S1, CD:=S2, R:= RESET, LOAD:=S3,PV:=20); ZAEST: = DB22.CV;

CoDeSys: ZAE(CU:=S1, CD:=S2, R:= RESET, LOAD:=S3,PV:=20); ZAEST:= ZAE.CV;

Werden bei STEP 7 die Standard- Zählfunktionen S_CU, S_CD und S_CDU sowie die Stan-dard-Zeitfunktionen S_PULSE (SI), S_PEXT (SV), S_ODT (SE) S_ODTS (SS) und S_OFFDT (SA) verwendet, so gelten die im vorigen Abschnitt beschriebenen Regeln für den Aufruf von Funktionen. Die Standardfunktionen für Zeiten und Zähler können im S7-SCL-Programm ohne vorherige Deklaration verwenden werden. Sie müssen lediglich mit den erfor-derlichen Parametern versorgt werden. Beispiel: BCD_Wert:= S_ODT(T_NO:=ZEIT, S:=S1, TV:= ZW,R:=S2, BI:=BinWert, Q:=P); Der Aufruf und die Parameter der Standard-Funktionsbausteine wie auch die Standard-Funk-tionen für Zähler und Zeiten sind im Kapitel 4 ausführlich beschrieben.

10.4 Beispiele 363

10.4 Beispiele

Beispiel 10.1: Pegelschalter (FC1001_HYS)

Abhängig von sich ständig ändernden Messwerten eines Sensors soll mit Hilfe einer Funktion FC 1001 ein Ausgang bei Überschreitung eines bestimmten vorgebbaren Schaltwertes ein- und bei Unterschreiten ausgeschaltet werden. Um ein mögliches Hin- und Herschalten (Flattern) am Schaltwert zu verhindern, wird an einem weiteren Funktionseingang eine Schalthysterese in % vom Schaltwert vorgegeben. Die Messwerte haben durch eine Umwandlungsfunktion das Datenformat REAL.

Bild 10.1: Schalthysterese Funktion FC 1001: Übergabeparameter: Beschreibung der Parameter:

MEW: REAL Messwert SP: REAL: Schaltpunkt HYS: REAL Hysterese OUT: BOOL Schaltausgang

Zuordnungstabelle der Merker und Ausgänge: Merkervariable Symbol Datentyp Logische Zuordnung Adresse Messwert Schaltpunkt Hysterese

MD_1 MD_2 MD_3

REAL REAL REAL

Gleitpunktzahl Gleitpunktzahl Gleitpunktzahl

MD 10 MD 20 MD 30

Ausgangsvariable Schaltaktor AKT BOOL Aktor eingeschaltet AKT = 1 A 4.1

Lösung Aus dem Prozentwert der Schalthysterese HYS und dem Schaltpunkt SP wird der obere und der untere Schaltpunkt berechnet. Durch Vergleichen des aktuellen Messwertes mit den Schaltpunkten wird der Signalzustand des Ausgangs OUT bestimmt. Liegt der Messwert weder oberhalb noch unterhalb des Abschaltpunktes, behält der Ausgang OUT seinen bisherigen Wert. Struktogramm der Funktion FC 1001:

Zur Berechnung der Schaltpunkte wird die lokale Variable P_HYS eingeführt.

364 10 Programmiersprache Strukturierter Text ST (SCL)

STEP 7 Programm (SCL-Quelle): CoDeSys Programm (ST): FUNCTION FC1001 : VOID VAR_INPUT MEW:REAL; SP:REAL; HYS:REAL; END_VAR VAR_IN_OUT OUT:BOOL; END_VAR VAR_TEMP P_HYS:REAL; END_VAR P_HYS:=MEW*HYS/100; IF MEW<(SP-P_HYS/2) THEN OUT:=TRUE; ELSIF MEW>(SP+P_HYS/2) THEN OUT:=FALSE; ELSE OUT:=OUT; END_IF; END_FUNCTION

FUNCTION FC1001 :BOOL VAR_INPUT MEW: REAL; SP: REAL; HYS: REAL; END_VAR VAR_IN_OUT OUT:BOOL; END_VAR VAR P_HYS: REAL; END_VAR P_HYS:=MEW*HYS/100; IF MEW<(SP-P_HYS/2) THEN OUT:=TRUE; ELSIF MEW>(SP+P_HYS/2) THEN OUT:=FALSE; ELSE OUT:=OUT; END_IF

Beispiel 10.2: Ultraschall-Überwachungssystem Ein Ultraschall-Überwachungssystem erkennt in einem dreidimensionalen Schutzfeld alle Personen und Gegenstände, die sich dem Gefahrenbereich nähern. Meldet der Ultraschallsensor eine Annäherung, gibt die Hupe P_HU ein akustisches Warnsignal. Dauert die Wahrnehmung der Person oder des Gegenstandes länger als 3 Sekunden, wird das Warnsignal P_HU ausgeschaltet und ein Alarm P_AL eingeschaltet. Mit dem Schalter E_A wird das Überwachungssystem eingeschaltet und der eingeschaltete Zustand mit P1 angezeigt. Zum Abschalten des Alarms muss das Überwachungssystem mit dem Schalter E_A ausge-schaltet werden. Technologieschema:

Bild 10.2: Ultraschall-Überwachung

Zuordnungstabelle der Eingänge und Ausgänge: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Überwachung EIN-AUS Ultraschallsensor

E_A SENSOR

BOOL BOOL

Betätigt E_A = 1 Meldung SENSOR = 0

E 0.0 E 0.1

Ausgangsvariable Überwachung EIN-AUS Hupe Alarmleuchte

P1 P_HU P_AL

BOOL BOOL BOOL

Leuchtet P1 = 1 Warnsignal P_HU = 1 Leuchtet P_AL = 1

A 4.0 A 4.1 A 4.2

10.4 Beispiele 365

Struktogramm der Funktion FC 1002:

Mit der IF-Anweisung E_A = 0 wird abgefragt, ob die Überwachung ausgeschaltet ist. Wenn JA, werden alle Ausgänge zurückgesetzt. Wenn NEIN, folgen zwei IF-Anweisungen. Am Programmende muss noch die Zeit von 3 s ge-startet werden, damit bei anhaltender Meldung des Ultraschallsensors der Alarm eingeschaltet wird.

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

FC1002 SCL-Quelle FC1002 ST FUNCTION FC1002 : VOID VAR_INPUT E_A, SENSOR: BOOL; ZEIT: TIMER; ZEITW:S5TIME; END_VAR VAR_IN_OUT P_HU, P_AL: BOOL; END_VAR VAR_OUTPUT P1: BOOL; END_VAR VAR_TEMP BCD_Zeitwert: S5TIME; END_VAR IF NOT E_A THEN P1:=FALSE; P_HU:=FALSE; P_AL:=FALSE; ELSE P1:=TRUE; IF P_AL THEN P_HU:=FALSE; ELSIF SENSOR THEN P_HU:=FALSE; ELSE P_HU:= TRUE; END_IF; END_IF; BCD_Zeitwert:=S_ODT(T_NO:=ZEIT, S:=P_HU OR P_AL, TV:=ZEITW, Q:=P_AL); END_FUNCTION

FUNCTION FC1002 :BOOL VAR_INPUT E_A, SENSOR: BOOL; ZEITW: TIME; END_VAR VAR_IN_OUT ZEIT:TON; P_HU, P_AL: BOOL; END_VAR IF NOT E_A THEN FC1002:=FALSE; P_HU:=FALSE; P_AL:=FALSE; ELSE FC1002:=TRUE; IF P_AL THEN P_HU:=FALSE; ELSIF SENSOR THEN P_HU:=FALSE; ELSE P_HU:=TRUE; END_IF END_IF ZEIT(IN:=P_HU OR P_AL, PT:=ZEITW); P_AL:=Zeit.Q;

366 10 Programmiersprache Strukturierter Text ST (SCL)

Beispiel 10.3: Lineare Bereichsabbildung (FC 1003 BABB)

Ein Temperatursensor liefert an einen SPS-Digitaleingang Werte von 0 bis 255. Diese Werte entsprechen beispielsweise einer Temperatur von –20 °C bis 40 °C. In der Steuerung soll mit Temperaturwerten gearbei-tet werden. Dazu ist eine Funktion FC 1003 zu entwerfen, welche die in Gleitpunktzahlen gewandelten Digitaleingangswerte von 0 bis 255 in den Temperaturbereich von –20 °C bis 40 °C umrechnet. Damit die Bereichsabbildung für beliebige Zahlenbereiche verwendet werden kann, soll der ursprüngliche Bereich durch wählbare Untergrenze (IN_MIN) und Obergrenze (IN_MAX) definiert und der Bereich der Ausgabe ebenfalls durch Angabe von Untergrenze (OUT_MIN) und Obergrenze (OUT_MAX) bestimmten werden.

Bild 10.3: Thermoelement

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 Ausgangs-REAL-Zahl

MD_1 MD_2

REAL REAL

Gleitpunktzahl Gleitpunktzahl

MD 10 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 _ MININ _ R IN _ MIN OUT _ R OUT _ MIN

Daraus ergibt sich:

OUT _ MAX OUT _ MINOUT _ R IN _ R IN _ MIN OUT _ MIN

IN _ MAX IN _ 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 VAR_INPUT IN_R:REAL; IN_MAX, IN_MIN:REAL; OUT_MAX, OUT_MIN:REAL; END_VAR VAR_OUTPUT OUT_R:REAL; FEH:BOOL; END_VAR VAR_TEMP DIFF1, DIFF2:REAL; END_VAR DIFF1:= IN_MAX-IN_MIN; DIFF2:= OUT_MAX-OUT_MIN; FEH := (DIFF1=0) OR (DIFF2=0); IF NOT FEH THEN OUT_R:= (OUT_MAX-OUT_MIN) /DIFF1*(IN_R-IN_MIN) +OUT_MIN; ELSE OUT_R:=0.0; END_IF; END_FUNCTION

TYPE FC_OUT : STRUCT OUT_R:REAL; FEH:BOOL; END_STRUCT END_TYPE FUNCTION FC1003 :FC_OUT VAR_INPUT IN_R: REAL; IN_MAX, IN_MIN:REAL; OUT_MAX, OUT_MIN: REAL; END_VAR VAR DIFF1, DIFF2: REAL; END_VAR DIFF1:= IN_MAX-IN_MIN; DIFF2:= OUT_MAX-OUT_MIN; FC1003.FEH := (DIFF1=0) OR (DIFF2=0); IF NOT FC1003.FEH THEN FC1003.OUT_R:= (OUT_MAX-OUT_MIN) /DIFF1*(IN_R-IN_MIN) +OUT_MIN; ELSE FC1003.OUT_R:=0.0; END_IF

Beispiel 10.4: Bitwert setzen in einer DWORD-Variablen (FC1004_PUT) In einer Meldevariablen soll beim Kommen oder Gehen einer Fehlermeldung ein zum Fehler gehörendes Bit gesetzt bzw. zurückgesetzt werden. Dies soll mit einer Funktion FC 1004 erfolgen, deren Eingangspa-rameter N_BIT und B_W mit der Nummer des zu verändernden Bits und einem booleschen Wert zu versorgen sind. Am Durchgangsparameter X_DW der Funktion wird die Meldevariable angegeben. Übergabeparameter: Beschreibung der Parameter:

N_BIT: INT Nummer (0 ... 31) des zu verändernden Bits B_W: BOOL Wert TRUE oder FALSE X_DW: DWORD Meldevariable, bei der ein Bit geändert werden soll Hinweis: Der boolesche Rückgabewert der Funktion zeigt mit TRUE an, ob die Angabe der Bit-Nummer an N_Bit innerhalb des Bereichs von 0 ... 31 liegt.

Zuordnungstabelle der Eingänge, Ausgänge und Merker: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Vorgabe Bitnummer Vorgabe boolescher Wert

EW S

INT BOOL

Integer Zahl Betätigt S = 1

EW 8 E 0.0

Ausgangsvariable Anzeige gültige Bitnummer P1 BOOL Bitnummer gültig P1 = 1 A 4.0 Merkervariable Meldevariable MD_1 DWORD Bit-Muster MD 10

368 10 Programmiersprache Strukturierter Text ST (SCL)

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 VAR_INPUT N_BIT:INT; B_W:BOOL; END_VAR VAR_IN_OUT X_DW:DWORD; END_VAR IF N_BIT < 32 THEN FC1004:=TRUE; IF B_W THEN X_DW:= X_DW OR SHL(IN:=DWORD#1,N:=N_BIT); ELSE X_DW:= X_DW AND ROL(IN:=DWORD# 16#FFFFFFFE,N:=N_BIT); END_IF; ELSE FC1004:=FALSE; END_IF;

FUNCTION FC1004 :BOOL VAR_INPUT N_BIT:INT; B_W:BOOL; END_VAR VAR_IN_OUT X_DW:DWORD; END_VAR IF N_BIT < 32 THEN FC1004:=TRUE; IF B_W THEN X_DW:= X_DW OR SHL(DWORD#1,N_BIT); ELSE X_DW:= X_DW AND ROL(DWORD#16#FFFFFFFE, N_BIT); END_IF; ELSE FC1004:=TRUE; END_IF;

Beispiel 10.5: Qualitätsprüfung von Keramikplatten (FC1005_QP)

Bei der Herstellung von keramischen Isolationsplatten muss nach dem Brennen überprüft werden, ob die Dicke der Platte innerhalb eins vorgegebenen Toleranzbandes liegt. Dazu werden die Platten durch eine aus zwei Laser bestehende Messstelle mit gleichmäßiger Geschwindigkeit geschoben. Aus der Differenz der Messungen der beiden Laser wird die Dicke der Platten ermittelt. Bei jeder Messung wird der kleinste und der größte Wert der Plattendicke festgehalten. Liegen diese außerhalb des Toleranzbandes, gilt die Platte als Ausschuss.

Technologieschema:

Bild 10.4: Prüfeinrichtung

10.4 Beispiele 369

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

Zuordnungstabelle der Eingänge, Ausgänge und Merker: Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Sensor Platte in der Messeinrichtung S1 BOOL Platte vorhanden S1 = 1 E 0.1 Ausgangsvariable Anzeige Ausschuss P1 BOOL Platte ist Ausschuss P1 = 1 A 4.1 Merkervariable Messwert der Dicke Ausgabe der maximalen Dicke Ausgabe der minimalen Dicke

MD_1 MD_2 MD_3

REAL REAL REAL

Gleitpunktzahl Gleitpunktzahl Gleitpunktzahl

MD 10 MD 20 MD 30

Darstellung des Algorithmus im Struktogramm:

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)

STEP 7 Programm (SCL-Quelle) / CoDeSys Programm (ST): FUNCTION_BLOCK FB1005 VAR_INPUT START:BOOL; DICKE, V_MAX, V_MIN:REAL; END_VAR VAR_OUTPUT D_MAX, D_MIN:REAL; P1:BOOL; END_VAR VAR FO:BOOL; END_VAR IF NOT START THEN FO:=START; RETURN; END_IF; IF START=TRUE AND FO=FALSE THEN D_MAX:=DICKE; D_MIN:=DICKE; P1:=FALSE; END_IF; FO:=START; IF DICKE < D_MIN THEN D_MIN:=DICKE; END_IF; IF DICKE > D_MAX THEN D_MAX:=DICKE; END_IF; IF D_MIN < V_MIN OR D_MAX > V_MAX THEN P1:=TRUE; END_IF; END_FUNCTION_BLOCK

Beispiel 10.6: Funktionsgenerator (FB 1006_FGEN) Für die Programmbibliothek ist ein Funktionsbaustein FB 1006 zu bestimmen, der die Aufgaben eines Funktionsgenerators erfüllt. An den Eingängen des Funktionsbausteins können die gewünschte Kurven-form, die Amplitude und die Periodendauer vorgegeben werden. Folgende Kurvenformen können ausgewählt werden: 0. Rechteck_Pos. 1. Rechteck 2. Dreieck_Pos. 3. Dreieck 4. Sägezahn_Pos.

5. Sägezahn 6. N_Sägezahn_P 7. N_Sägezahn 8. Sinus 9. Cosinus

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

Zuordnungstabelle der Eingänge und Ausgänge:

Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Auswahl Kurvenform Amplitude Rücksetz-Taster

EW_1 EW_2

RESET

INT INT

BOOL

Integer Zahl (0..9) Integer Zahl Betätigt RESET = 1

EW 8 EW 10 E 0.0

Ausgangsvariable Kurvenwerte AW INT Integer-Werte AW10

Die Periodendauer wird mit einer Zeitkonstante (z. B. T#50s) am Funktionsbausteineingang vorgegeben. Je nach gewählter Kurvenform müssen folgende Berechnungen durchgeführt werden: 0. Rechteck_P: t < T/2 OUT:= AMPLITUDE t > T/2 OUT:= 0 1. Rechteck: t < T/2 OUT:= AMPLITUDE t > T/2 OUT:= – AMPLITUDE 2. Dreieck_Pos: t < T/2 OUT:= AMPLITUDE * t / (T/2) t > T/2 OUT:= – AMPLITUDE * (t – T/2) / (T/2) + AMPLITUDE 3. Dreieck: t < T/2 OUT:= 2 * AMPLITUDE * t / (T/2) – AMPLITUDE t > T/2 OUT:= – 2 * AMPLITUDE * (t – T/2) / (T/2) + AMPLITUDE 4. Sägezahn_Pos: OUT:= AMPLITUDE * t / T 5. Sägezahn: OUT:= 2 * AMPLITUDE * t / T – AMPLITUDE 6. N_Sägezahn_P: OUT:= – AMPLITUDE * t / T + AMPLITUDE 7. N_Sägezahn: OUT:= – 2 * AMPLITUDE * t / T + AMPLITUDE 8. Sinus: OUT:= AMPLITUDE * SIN(6,283176 * t/T) 7. Cosinus: OUT:= AMPLITUDE * COS(6,283176 * t/T)

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.

STEP 7 Programm (SCL-Quelle) / CoDeSys Programm (ST):

VAR_INPUT KFORM:INT; PERIODE:TIME; AMPLITUDE:INT; RESET:BOOL; END_VAR VAR_OUTPUT OUT:INT; END_VAR VAR ZAE:INT; ZEIT:TON; X_T,P_T:DINT; END_VAR IF RESET THEN ZEIT(IN:=FALSE, PT:=t#0s); OUT:=0; ELSE ZEIT(IN:=TRUE,PT:=PERIODE); IF ZEIT.Q= TRUE THEN ZEIT(IN:=FALSE); ZEIT(IN:=TRUE); END_IF; X_T:=TIME_TO_DINT(ZEIT.ET); P_T:=TIME_TO_DINT(PERIODE); CASE KFORM OF 0: IF X_T < P_T/2 THEN OUT:=AMPLITUDE; ELSE OUT:=0; END_IF; 1: IF X_T < P_T/2 THEN OUT:=-AMPLITUDE; ELSE OUT:=AMPLITUDE; END_IF; 2: IF X_T < P_T/2 THEN OUT:=DINT_TO_INT(AMPLITUDE*X_T/(P_T/2)); ELSE OUT:=DINT_TO_INT(-AMPLITUDE*(X_T-P_T/2)/(P_T/2)+ AMPLITUDE); END_IF;

372 10 Programmiersprache Strukturierter Text ST (SCL)

3: IF X_T < P_T/2 THEN OUT:=DINT_TO_INT(2*AMPLITUDE*X_T/(P_T/2) - AMPLITUDE); ELSE OUT:=DINT_TO_INT(-2*AMPLITUDE*(X_T-P_T/2)/(P_T/2) + AMPLITUDE); END_IF; 4: OUT:=DINT_TO_INT(AMPLITUDE*X_T/(P_T)); 5: OUT:=DINT_TO_INT(2*AMPLITUDE*X_T/(P_T)- AMPLITUDE); 6: OUT:=DINT_TO_INT(-AMPLITUDE*X_T/(P_T) + AMPLITUDE); 7: OUT:=DINT_TO_INT(-2*AMPLITUDE*X_T/(P_T)+ AMPLITUDE); 8: OUT:=REAL_TO_INT(SIN(6.283176*X_T/P_T)*AMPLITUDE); 9: OUT:=REAL_TO_INT(COS(6.283176*X_T/P_T)*AMPLITUDE); ELSE: ZEIT(IN:=FALSE, PT:=t#0s); OUT:=0; END_CASE; END_IF; END_FUNCTION_BLOCK

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.

Übergabeparameter: Beschreibung der Parameter:

FELD ARRAY Datenfeld mit 100 REAL-Werten F_NR INT Nummer des ersten Feldwertes für den Bereich ANZ INT Anzahl der Feldwerte MINW REAL Kleinster Wert im Datenfeld MAXW REAL Größter Wert im Datenfeld AMW REAL Arithmetischer Mittelwert des Datenfeldes FEH BOOL Anzeige fehlerhafte Bereichsauswahl

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 Vorgabe Feldanfangsnummer Vorgabe Anzahl der Feldwerte

S1 F_NR ANZ

BOOL INT INT

Betätigt S1 = 1 Integer Zahl Integer Zahl

E 0.0 EW 8 EW 10

Ausgangsvariable Fehlerhafte Bereichsvorgabe FEH BOOL Falsche Vorgabe FEH = 1 A 4.0 Merkervariable Kleinster Wert Größter Wert Arithmetischer Mittelwert

MINW MAXW AMW

REAL REAL REAL

Gleitpunktzahl Gleitpunktzahl Gleitpunktzahl

MD 10 MD 20 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.

Darstellung des Algorithmus im Struktogramm:

Lokale Variablen: NR: INT Adressierung der

Feldvariablen ZAE: INT Zählvariable für die

Schleife SUM: REAL Hilfsvariable zur

Berechnung des arithmetischen Mit-telwertes

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.

STEP 7 Programm: CoDeSys Programm: Aufruf der Funktion FC 1007 im OB 1 Aufruf der Funktion FC 1007 im PLC_PRG in CFC

374 10 Programmiersprache Strukturierter Text ST (SCL)

FC 1007 SCL-Quelle FC 1007 ST FUNCTION FC1007: VOID VAR_INPUT FELD: ARRAY[0..99] OF REAL; MNR, ANZ:INT; END_VAR VAR_OUTPUT MINW, MAXW, AMW:REAL; FEH:BOOL; END_VAR VAR_TEMP NR, ZAE:INT; SUM:REAL; END_VAR IF F_NR<=0 OR F_NR > 99 OR ANZ<=0 OR ANZ > 100 - F_NR THEN FEH:=TRUE; MINW:=0.0; MAXW:=0.0; AMW:=0.0; Else FEH:=False; NR:=F_NR+ANZ-1); MINW:=FELD[NR]; MAXW:=FELD[NR]; SUM:=FELD[NR]; ZAE:=ANZ WHILE ZAE>1 DO ZAE:=ZAE-1; NR:=NR-4; IF MAXW < FELD[NR]; THEN MAXW:= FELD[NR]; END_IF; IF MINW > FELD[NR] THEN MINW:= FELD[NR]; END_IF; SUM:=SUM + FELD[NR] END_WHILE; AMW:=SUM/INT_TO_REAL(ANZ); END_IF; END_FUNCTION

TYPE FC_OUT : STRUCT MINW:REAL; MAXW:REAL; AMW:REAL; FEH:BOOL; END_STRUCT END_TYPE FUNCTION FC1007 :FC_OUT VAR_INPUT FELD: ARRAY [0..99] OF REAL; F_NR: INT; ANZ: INT; END_VAR VAR ZAE: INT; NR: INT; SUM: REAL; END_VAR IF F_NR<0 OR F_NR > 99 OR ANZ<=0 OR ANZ > 100 – F_NR THEN FC1007.FEH:=TRUE; FC1007.MINW:=0.0; FC1007.MAXW:=0.0; FC1007.AMW:=0.0; ELSE FC1007.FEH:=FALSE; NR:=(F_NR+ANZ-1); FC1007.MINW:= FELD[NR]; FC1007.MAXW:=FELD[NR]; SUM:=FELD[NR]; ZAE:=ANZ; WHILE ZAE>1 DO ZAE:=ZAE-1; NR:=NR - 1; IF FC1007.MAXW < FELD[NR] THEN FC1007.MAXW:=FELD[NR]; END_IF; IF FC1007.MINW > FELD[NR] THEN FC1007.MINW:=FELD[NR]; END_IF; SUM:=SUM+FELD[NR]; END_WHILE; FC1007.AMW:=SUM/INT_TO_REAL(ANZ); END_IF;

Beispiel 10.8: Betriebsstunden erfassen und auswerten Bei einem Altglasrecyclingprozess wird der Schmelzofen durch mehrere Brenner beheizt, die je nach Bedarf zu- und abgeschaltet werden. Zur vorbeugenden Instandhaltung und Wartung wird die Betriebs-zeit jedes Brenners ermittelt und ausgewertet. Nach jedem Einschalten wird die Laufzeit gemessen und für jedes Einschaltintervall der Wert in einem zugehörigen Datenfeld hinterlegt. Ist eine vorgegebene Betriebsstundendauer oder eine vorgegebenen Anzahl von Betriebsintervallen überschritten, muss der Brenner gereinigt werden. Nach der Wartung des Brenners beginnt ein neues Wartungsintervall und alle Aufzeichnungen über die Laufzeiten aus dem vorherigen Wartungsintervall werden im Datenfeld ge-löscht. Technologieschema: Bild 10.5: Schmelzofen

10.4 Beispiele 375

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.

Übergabeparameter bei STEP 7: Beschreibung der Parameter:

BR_EIN BOOL Brenner ist eingeschaltet TAKT BOOL Zählimpulse für den Betriebsstundenzähler DBNR INT Datenbausteinnummer für das Datenfeld T_MAX DINT Maximale Betriebszeit EZ_MAX INT Maximale Anzahl der Betriebszyklen QUIT BOOL Wartung durchgeführt T_AK DINT Ausgabe der aktuellen Betriebszeit T_GE DINT Ausgabe der gesamten Betriebszeit P_WA BOOL Anzeige Wartung erforderlich

Übergabeparameter bei CoDeSys:

BR_EIN BOOL Brenner ist eingeschaltet TAKT BOOL Zählimpulse für den Betriebsstundenzähler T_MAX DINT Maximale Betriebszeit EZ_MAX INT Maximale Anzahl der Betriebszyklen QUIT BOOL Wartung durchgeführt DATEN FELD Datenfeld zur Speicherung der Betriebszeiten T_AK DINT Ausgabe der aktuellen Betriebszeit T_GE DINT Ausgabe der gesamten Betriebszeit P_WA BOOL Anzeige Wartung erforderlich

Zum Test des Funktionbausteins FB 1008 wird der Betrieb des Brenners durch einen Schalter S1 (S1 = 1, Brenner EIN) simuliert. Die Taktfrequenz wird mit dem Bibliotheksbaustein FC 100/FB 100 (TAKT) gebildet. Die Periodendauer des Takts, welche die Zeitbasis für die Betriebsstundenzählung vorgibt, wird für den Test des Bausteins auf 100 ms eingestellt. An dem Eingang „Z_MAX“ wird die maximale Be-triebszeit im Datenformat DINT vorgegeben. Wird dort der Wert 5000 angelegt, bedeutet dies, dass bei einer Taktzeit von 0,1 s nach etwa 8,3 Minuten die maximale Betriebszeit erreicht ist. Für Testzwecke ist dies ein akzeptabler Wert. Die maximale Anzahl der Einschaltzyklen wird mit 20 vorgegeben. Die Aus-gänge T_AK (aktuelle die Betriebszeit) und T_GE (Betriebszeit seit der letzten Wartung) im Datenformat DINT werden Merkerdoppelwörtern zugewiesen. Mit dem Taster S2 wird das Ende einer Wartung ge-meldet und somit alle Aufzeichnungen gelöscht.

Zuordnungstabelle der Eingänge, Ausgänge und Merker:

Eingangsvariable Symbol Datentyp Logische Zuordnung Adresse Brenner EIN Wartung beendet

S1 S2

BOOL BOOL

Betätigt S1 = 1 l Betätigt S2 = 1

E 0.1 E 0.2

Ausgangsvariable Wartungsanzeige P_WA BOOL Wartung nötig P_WA = 1 A 4.0 Merkervariable Aktuelle Betriebszeit Gesamte Betriebszeit

MD_1 MD_2

DINT DINT

Dualzahl Dualzahl

MD 10 MD 20

376 10 Programmiersprache Strukturierter Text ST (SCL)

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:

Struktogramm für den Funktionsbaustein FB 1008:

Lokale Variablen: Statische: E_ZAE, ZAE :INT FO1,FO2,FO3,FO5: BOOL (Hilfsvariablen für die Flan-kenauswertungen) Temporäre: DBNR: WORD (Hilfsvariable zur indirekten Adressierung des Datenbau-steins)

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.

Aufruf des Funktionsbausteins FB 1008 im PLC-PRG (CFC):

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 IF BR_EIN AND FO1 = 0 THEN E_ZAE:= DATEN.E_ZAE; E_ZAE:= E_ZAE+1; 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:= Daten.G_ZEIT+ T_AK; END_IF; IF E_ZAE >= E_ZYKL OR T_GE > T_MAX THEN P_WA:=1; END_IF; IF BR_EIN = 0 AND FO3 = 1 THEN Daten.E_ZAE:=E_ZAE; Daten.A_ZEIT[E_ZAE]:=T_AK; Daten.G_ZEIT:=T_GE; END_IF; FO3:=BR_EIN; IF QUIT = 1 AND FO4=0 THEN P_WA:=0; T_GE:=0; T_AK:=0; Daten.E_ZAE:=0; Daten.G_ZEIT:=0; FOR ZAE:= 1 TO (E_ZAE) DO Daten.A_ZEIT[ZAE]:=0; END_FOR; END_IF; FO4:=QUIT;