10 Programmiersprache Strukturierter Text ST (SCL)

Werbung
350
10 Programmiersprache Strukturierter Text ST (SCL)
In der DIN EN 61131-3 ist die Programmiersprache Strukturierter Text ST neben der Anweisungsliste AWL als zweite Textsprache für SPSen definiert. Bei STEP 7 wird die entsprechende 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
x
x
x
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 Programmorganisationseinheiten verwendet werden. Der Aufbau der Programmorganisationseinheiten besteht aus den Bereichen: Bausteinanfang, Deklarationsteil, Anweisungsteil und Bausteinende.
10.1.1 Bausteinanfang und -ende
Der Quelltext für einen einzelnen Baustein wird abhängig von der Bausteinart mit einem Standardbezeichner für den Anfang des Bausteins und der Bausteinbezeichnung eingeleitet. Abgeschlossen 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 Programmiersysteme 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 Funktionsbaustein 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
Sprungmarken
VAR RETAIN
VAR3:INT:=123;
END_VAR
LABEL
Marke1, Make2;
END_LABEL
Hinweis: Die Initialisierung der Werte ist nur in Funktionsbausteinen und bei STEP 7 in Datenbausteinen möglich. In Funktionen oder Programmen können den Variablen keine Anfangswerte 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:
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
-
Regel
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 arithmetische 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:
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
Zusammenstellung der Operatoren der Sprache ST (SCL):
Klasse
Zuweisungsoperation
Arithmetische
Operationen
Vergleichsoperationen
Logische Operationen
Klammerungszeichen
Funktionsbearbeitung
(Auswahl)
Operation
Zuweisung
Potenz
unäres Plus
unäres Minus
Multiplikation
Division
Modulo-Funktion
ganzzahlige Division
Addition
Subtraktion
Kleiner
Größer
Kleiner gleich
Größer gleich
Gleichheit
Ungleichheit
Negation
UND
ODER
EXCLUSIV-ODER
Klammer auf/zu
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
Symbol
:=
**
+
*
/
MOD
DIV
+
<
>
<=
>=
=
<>
NOT
AND od. &
OR
XOR
( )
EXP
EXPD
EXPT
LN
LOG
ABS
SQR
SQRT
ACOS
ASIN
ATAN
COS
SIN
TAN
Rang
11
2
3
3
4
4
4
4
5
5
6
6
6
6
7
7
3
8
10
9
1
Hinweis
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 allgemeinen 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) gleichermaß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 Ausdruck 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änge 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
SOLLWERT_1
ABFRAGE_1
ZEIT_1
ZEIT_2
DATUM_1
:=
:=
:=
:=
:=
:=
-15 ;
40.5 ;
TRUE ;
T#1H_20M_10S_30MS ;
T#2D_1H_20M_10S_30MS ;
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_1[ n ]
Bezeichner_1
Feldname_1
:=
:=
:=
:=
Feldname_2[ m ] ;
Ausdruck ;
Feldname_1[ n ] ;
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 Datenbausteine 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
A1.1
Wert1
Wert1_1[1]
:=
:=
:=
:=
EW4 ;
TRUE ;
DB11.DW1 ;
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 beeinflusst, um in verschiedene Anweisungsfolgen zu verzweigen. Man unterscheidet Auswahlanweisungen, Wiederholungsanweisungen (Schleifenbearbeitung) und Programmsprünge.
10.3.2.1 Übersicht
Auswahlanweisungen: Eine Auswahlanweisung wählt aufgrund einer Bedingung oder mehrerer 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
FOR-Anweisung
Funktion
Die FOR-Anweisung dient zur Wiederholung einer Anweisungsgruppe, solange die Laufvariable innerhalb des angegebenen Wertebereichs liegt.
WHILE-Anweisung
Die WHILE-Anweisung dient zur Wiederholung einer Anweisungsgruppe, solange eine Durchführungsbedingung erfüllt ist.
REPEAT-Anweisung
Die REPEAT-Anweisung dient zur Wiederholung einer Anweisungsgruppe, bis eine Abbruchbedingung erfüllt ist.
Programmsprünge: Ein Programmsprung bewirkt das sofortige Verlassen der Programmschleife, 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
EXIT-Anweisung
RETURN-Anweisung
Funktion
Die EXIT-Anweisung dient zum Verlassen einer FOR-, WHILE-,
oder REPEAT-Schleife, bevor deren Ende-Bedingung erfüllt ist.
Die RETURN-Anweisung bewirkt das Verlassen des aktuell bearbeiteten Bausteins.
Nur in STEP 7
CONTINUEAnweisung
Die CONTINUE-Anweisung kann die momentane Bearbeitung des
Schleifenrumpfes einer FOR-, WHILE- oder REPEAT-Schleife umgehen, 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ührung 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 ausgefü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 Auswahl 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 AuswahlAusdrucks 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 Laufvariable 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 typgleich 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 Schrittweite) 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 Regeln 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 Durchfü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 Abbruchbedingung 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
OUT1:=0;
INDEX:=0;
REPEAT
INDEX:=INDEX + 1;
OUT1:=OUT1 + INDEX;
UNTIL INDEX >= ENDW
END_REPEAT;
Zugehöriges Struktogramm
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 Schleifendurchlaufes einer Wiederholungsanweisung (FOR, WHILE oder REPEAT). Die Anweisung 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 Schleifenbearbeitung 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)
x 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 verwendet werden. Die Anweisung ist nur bei STEP 7 SCL vorhanden und mit einem Struktogramm 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
..
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 .
Programmablaufplan
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 Vereinbarungsteil des aufgerufenen Bausteins definiert sind (Formalparametern), ein Wert (Aktualparameter) 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 InstanzDatenbausteins (DB-Bezeichnung) sowie der Parameterversorgung (FB-Parameter). Ein Aufruf 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 Instanznamens und der Parameterversorgung. Ein Aufruf einer lokalen Instanz ist immer symbolisch. Der symbolische Namen muss im Vereinbarungsteil des aufrufenden Bausteins vereinbart 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 Baustein aus dem globalen Instanz-Datenbaustein oder dem lokalen Instanzbereich gelesen werden.
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 werden.
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 Ausgangsparameter 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 Standard-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-SCLProgramm ohne vorherige Deklaration verwenden werden. Sie müssen lediglich mit den erforderlichen 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-Funktionen 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
Messwert
Schaltpunkt
Hysterese
Ausgangsvariable
Schaltaktor
Symbol
MD_1
MD_2
MD_3
Datentyp
REAL
REAL
REAL
Logische Zuordnung
Gleitpunktzahl
Gleitpunktzahl
Gleitpunktzahl
AKT
BOOL
Aktor eingeschaltet
Adresse
MD 10
MD 20
MD 30
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):
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
CoDeSys Programm (ST):
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;
END_FUNCTION
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 ausgeschaltet werden.
Technologieschema:
Bild 10.2: Ultraschall-Überwachung
Zuordnungstabelle der Eingänge und Ausgänge:
Eingangsvariable
Überwachung EIN-AUS
Ultraschallsensor
Ausgangsvariable
Überwachung EIN-AUS
Hupe
Alarmleuchte
Symbol
E_A
SENSOR
Datentyp
BOOL
BOOL
P1
P_HU
P_AL
BOOL
BOOL
BOOL
Logische Zuordnung
Betätigt
E_A = 1
Meldung
SENSOR = 0
Leuchtet
Warnsignal
Leuchtet
P1 = 1
P_HU = 1
P_AL = 1
Adresse
E 0.0
E 0.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 gestartet 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
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
FC1002 ST
FUNCTION FC1002 :BOOL
VAR_INPUT
E_A, SENSOR: BOOL;
ZEITW: TIME;
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
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 gearbeitet 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:
IN_MAX:
IN_MIN:
OUT_MAX:
OUT_MIN:
OUT_R:
FEH:
REAL
REAL
REAL
REAL
REAL
REAL
BOOL
Abzubildender REAL-Wert
Obergrenze des Eingangsbereichs
Untergrenze des Eingangsbereichs
Obergrenze des Ausgangsbereichs
Untergrenze des Ausgangsbereichs
Abgebildeter REAL-Wert
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 Zahlenwerte 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
Bereichsangabenüberprüfung
Merkervariable
Eingangs-REAL-Zahl
Ausgangs-REAL-Zahl
Symbol
FEH
Datentyp
BOOL
MD_1
MD_2
REAL
REAL
Logische Zuordnung
Bereich = 0
FEH = 1
Gleitpunktzahl
Gleitpunktzahl
Adresse
A 4.1
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 _ MIN
IN _ R IN _ MIN
OUT _ R OUT _ MIN
Daraus ergibt sich:
OUT _ R
OUT _ MAX OUT _ MIN
IN _ MAX IN _ MIN
IN _ R IN _ MIN 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):
FUNCTION FC1003 : VOID
CoDeSys Programm (ST):
TYPE FC_OUT :
STRUCT
OUT_R:REAL;
FEH:BOOL;
END_STRUCT
END_TYPE
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
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 Eingangsparameter 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
Vorgabe Bitnummer
Vorgabe boolescher Wert
Ausgangsvariable
Anzeige gültige Bitnummer
Merkervariable
Meldevariable
Symbol
EW
S
P1
MD_1
Datentyp Logische Zuordnung
INT
Integer Zahl
BOOL Betätigt
S=1
BOOL
Bitnummer gültig
DWORD Bit-Muster
P1 = 1
Adresse
EW 8
E 0.0
A 4.0
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 Meldevariablen 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):
FUNCTION FC1004 : BOOL
CoDeSys Programm (ST):
FUNCTION FC1004 :BOOL
VAR_INPUT
N_BIT:INT;
B_W:BOOL;
END_VAR
VAR_IN_OUT
X_DW:DWORD;
END_VAR
VAR_INPUT
N_BIT:INT;
B_W:BOOL;
END_VAR
VAR_IN_OUT
X_DW:DWORD;
END_VAR
IF N_BIT < 32 THEN
IF N_BIT < 32 THEN
FC1004:=TRUE;
FC1004:=TRUE;
IF B_W THEN
IF B_W THEN
X_DW:= X_DW OR
X_DW:= X_DW OR
SHL(IN:=DWORD#1,N:=N_BIT);
SHL(DWORD#1,N_BIT);
ELSE
ELSE
X_DW:= X_DW AND
X_DW:= X_DW AND
ROL(IN:=DWORD#
ROL(DWORD#16#FFFFFFFE,
16#FFFFFFFE,N:=N_BIT);
N_BIT);
END_IF;
END_IF;
ELSE
ELSE
FC1004:=FALSE;
FC1004:=TRUE;
END_IF;
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 Funktionsbaustein 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, solange 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:
DICKE:
V_MAX:
V_MIN:
D_MAX:
D_MIN:
P1: BOOL
BOOL Starten der Prüfung mit Sensor S1
REAL Laufende Messwerte der Dicke
REAL Vorgabe der Obergrenze
REAL Vorgabe der Untergrenze
REAL Ausgabe der maximalen Dicke
REAL Ausgabe der minimalen Dicke
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 werden 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
Sensor Platte in der Messeinrichtung
Ausgangsvariable
Anzeige Ausschuss
Merkervariable
Messwert der Dicke
Ausgabe der maximalen Dicke
Ausgabe der minimalen Dicke
Symbol
S1
Datentyp Logische Zuordnung
BOOL Platte vorhanden
S1 = 1
Adresse
E 0.1
P1
BOOL
Platte ist Ausschuss P1 = 1
A 4.1
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 werden. Wird jedoch die Programmierung einer Flankenauswertung wie bei STEP 7 verwendet, sind die beiden 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 Kurvenform, 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
PERIODE:
TIME Periodendauer
AMPLITUDE: INT
Nummer (0 ... 9) der Kurvenform
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
Auswahl Kurvenform
Amplitude
Rücksetz-Taster
Ausgangsvariable
Kurvenwerte
Symbol
EW_1
EW_2
RESET
Datentyp
INT
INT
BOOL
AW
INT
Logische Zuordnung
Integer Zahl (0..9)
Integer Zahl
Betätigt
RESET = 1
Adresse
EW 8
EW 10
E 0.0
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
t > T/2
OUT:= 0
1. Rechteck:
t < T/2
OUT:= AMPLITUDE
t > T/2
OUT:= – AMPLITUDE
2. Dreieck_Pos:
3. Dreieck:
OUT:= AMPLITUDE
t < T/2
OUT:= AMPLITUDE * t / (T/2)
t > T/2
OUT:= – AMPLITUDE * (t – T/2) / (T/2) + AMPLITUDE
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
F_NR
ANZ
MINW
MAXW
AMW
FEH
ARRAY
INT
INT
REAL
REAL
REAL
BOOL
Datenfeld mit 100 REAL-Werten
Nummer des ersten Feldwertes für den Bereich
Anzahl der Feldwerte
Kleinster Wert im Datenfeld
Größter Wert im Datenfeld
Arithmetischer Mittelwert des Datenfeldes
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 vorgegeben. 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 beobachten/steuern“ überprüft werden.
Zuordnungstabelle der Eingänge, Ausgänge und Merker:
Eingangsvariable
Berechnung EIN
Vorgabe Feldanfangsnummer
Vorgabe Anzahl der Feldwerte
Ausgangsvariable
Fehlerhafte Bereichsvorgabe
Merkervariable
Kleinster Wert
Größter Wert
Arithmetischer Mittelwert
Symbol
S1
F_NR
ANZ
Datentyp
BOOL
INT
INT
Logische Zuordnung
Betätigt
S1 = 1
Integer Zahl
Integer Zahl
FEH
BOOL
Falsche Vorgabe
MINW
MAXW
AMW
REAL
REAL
REAL
Gleitpunktzahl
Gleitpunktzahl
Gleitpunktzahl
FEH = 1
Adresse
E 0.0
EW 8
EW 10
A 4.0
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 zugewiesen. 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 Datenbaustein“.) Zu Beginn wird abgefragt, ob die Bereichswahl gültig ist.
Darstellung des Algorithmus im Struktogramm:
Lokale Variablen:
NR:
INT
ZAE: INT
Adressierung der
Feldvariablen
Zählvariable für die
Schleife
SUM: REAL Hilfsvariable zur
Berechnung des
arithmetischen Mittelwertes
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 versehen.
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
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
FC 1007 ST
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 Betriebszeit 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 gelö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 übernimmt. 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 Variablen realisiert. Über den Eingang TAKT erhält der Betriebsstundenzähler des Funktionsblocks Zählimpulse 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 Brenners wird dem Funktionsblock über den Eingang QUIT mitgeteilt.
Übergabeparameter bei STEP 7:
Beschreibung der Parameter:
BR_EIN
TAKT
DBNR
T_MAX
EZ_MAX
QUIT
T_AK
T_GE
P_WA
BOOL
BOOL
INT
DINT
INT
BOOL
DINT
DINT
BOOL
Brenner ist eingeschaltet
Zählimpulse für den Betriebsstundenzähler
Datenbausteinnummer für das Datenfeld
Maximale Betriebszeit
Maximale Anzahl der Betriebszyklen
Wartung durchgeführt
Ausgabe der aktuellen Betriebszeit
Ausgabe der gesamten Betriebszeit
Anzeige Wartung erforderlich
BR_EIN
TAKT
T_MAX
EZ_MAX
QUIT
DATEN
T_AK
T_GE
P_WA
BOOL
BOOL
DINT
INT
BOOL
FELD
DINT
DINT
BOOL
Brenner ist eingeschaltet
Zählimpulse für den Betriebsstundenzähler
Maximale Betriebszeit
Maximale Anzahl der Betriebszyklen
Wartung durchgeführt
Datenfeld zur Speicherung der Betriebszeiten
Ausgabe der aktuellen Betriebszeit
Ausgabe der gesamten Betriebszeit
Anzeige Wartung erforderlich
Übergabeparameter bei CoDeSys:
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 Betriebszeit 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 Ausgä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 gemeldet und somit alle Aufzeichnungen gelöscht.
Zuordnungstabelle der Eingänge, Ausgänge und Merker:
Eingangsvariable
Brenner EIN
Wartung beendet
Ausgangsvariable
Wartungsanzeige
Merkervariable
Aktuelle Betriebszeit
Gesamte Betriebszeit
Symbol
S1
S2
Datentyp Logische Zuordnung
BOOL Betätigt
S1 = 1
BOOL l Betätigt
S2 = 1
P_WA
BOOL
Wartung nötig
MD_1
MD_2
DINT
DINT
Dualzahl
Dualzahl
P_WA = 1
Adresse
E 0.1
E 0.2
A 4.0
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 Betriebszeiten 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 Flankenauswertungen)
Temporäre:
DBNR: WORD
(Hilfsvariable zur indirekten
Adressierung des Datenbausteins)
Hinweis: Für die indirekte Adressierung des Datenbausteins DB[DBNR], wie im Struktogramm angegeben, 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 Datenbausteins 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;
Herunterladen