Grundlagen der Programmierung mit Strukturiertem Text Strukturierter Text Grundlagen der Programmierung mit Strukturiertem Text
Programmierung mit Strukturiertem Text Übersicht: Vorteile der ST Programmierung ST Editor Zuweisungen Kommentare Variablen Syntax Regeln Operatoren Standard Kommandos Bedingung IF THEN Verzweigung CASE Schleifen FOR Schleifen WHILE Schleifen REPEAT UNTIL Funktionsblock Aufruf in ST Funktions Aufruf in ST Strukturen FUB Aufruf ST vs. KOP Vergleiche zwischen KOP und ST
Vorteile der ST Programmierung Einfach lesbarer Code Portabler Code (99%) zu IEC61131-3 Dritthersteller Editierbar in Text Editor Effizienter Code, besser als KOP oder FBD Bequeme Verwendung von Strukturen (komplexe Datentypen) Kürzere Entwicklungszeit Mischen von KOP und ST möglich (InLine ST)
ST Editor Syntax Einfärbung Standardfarben, diese können teilweise in den Optionen umgestellt werden BLAU: Ablauf, Anweisungen, Operatoren GRÜN: Kommentare SCHWARZ: Variablen, Konstanten, Funktionen, Funktionsblöcke ROT: Globale Variablen, Globale Konstanten, Strings
ST Editor Variablen Deklaration ST Programm Editor
Zuweisungen Zuweisungen von Werten, Ausdrücken oder Zuständen mit “:=“ Anweisungen müssen am Zeilenende mit einem Semikolon abgeschlossen werden “;“ Es können Leerzeichen und Tabulatoren verwendet werden um die Lesbarkeit zu verbessern
Zuweisungen Komplexe, lange Ausdrücke können auf mehrere Linien gesplittet werden mittels „Return“ (). Der Ausdruck wird mit dem Semikolon “;“ abgeschlossen Integer Werte können auch Binär oder Hexadezimal eingegeben werden
Kommentare Blockkommentare können irgendwo im ST Programm platziert werden, verwendet als Zeilen oder Mehrzeilen Kommentar. Start mit “(*” Ende mit “*)” Linienkommentare können mit “//“ begonnen werden
Variablen Deklaration: Der Compiler unterscheidet nicht zwischen Klein - und Großschreibung. In der Praxis ist empfohlen immer die gleiche Schreibweise zu verwenden um die Lesbarkeit zu verbessern. Nicht empfohlen Lesbar + Konsistent
Variablen Deklaration: Noch nicht deklarierte Variablen werden mit einem blauen Rechteck markiert. Durch anklicken dieser Markierung kann die Variable generiert werden (Lokal) Jetzt muss nur noch der Datentyp eingegeben werden
Reservierte Schlüsselwörter: Syntax Regeln Reservierte Schlüsselwörter: Schlüsselwörter dürfen nicht verwendet werden, da diese für ST Kommandos reserviert sind. AND, BY, CASE, DO, ELSE, ELSIF, EXIT, FALSE, FOR, IF, NOT, OF, OR, REPEAT, RETURN, THEN, TO, TRUE, UNTIL,WHILE, XOR, END_IF,END_WHILE, END_CASE, END_REPEAT.. Sonderzeichen können nicht in Variabel Namen benutzt werden. Ausnahme: Tiefstrich “_” (nicht an erster Position) >, <=, >=, <>, :=, -, *, /, &, (*,*), %,$,@... Datentypen, und benutzerdefinierte Typen können nicht als Vaiabelname verwendet werden BOOL, USINT, SINT, BYTE, UINT, INT,WORD, REAL, DINT, UDINT, DWORD, LREAL, LINT, ULINT, LWORD…
Übung 1 Finde die 7 Fehler… : ;
Operatoren ( ) Ausführungs Priorisierung Value:=(1+2) *(3+4) // Value is 21 Priorität: ( ), NOT, **, * / , MOD, + - ** Exponent Value:= 2**8 ; // Value is 256 NOT Negierung Value:=NOT TRUE; //Value is FALSE * Multiplikation Value:=8 * 100; // Value is 800 / Division Value:=200 / 25; // Value is 8 + Addition Value:=200 + 25; // Value is 225 - Subtraktion Value:=200 - 25; // Value is 175 MOD Modulo (Rest) Value:=10 MOD 6; // Value is 4 <,>,<=,>= Vergleiche Value:= 60 > 10; // Value is TRUE = Vergleich (Ist gleich) Value:= 8=7; // Value is FALSE <> Vergleich (Ungleich) Value:= 8<>7; // Value is TRUE &, AND Logisches UND Value:=2#1001 AND 2#1100; //Value is 2#1000 XOR Logisches Exklusives ODER Value:=2#1001 XOR 2#1100; //Value is 2#0101 OR Logisches ODER Value:=2#1001 XOR 2#1100; //Value is 2#1101 120 NJ5_ST introduction_v3.2_E.ppt
ST Standard Kommandos Fallunterscheidungen Verzweigung Schleifen IF..THEN....END_IF IF..THEN….ELSE….END_IF IF..THEN….ELSIF..THEN…END_IF Verzweigung CASE..OF….END_CASE Schleifen FOR.. (BY) .. DO..END_FOR WHILE..DO….END_WHILE REPEAT...UNTIL…END_REPEAT EXIT
ST Bedingung IF THEN Einfache Bedingung: IF .. THEN .. END_IF Die <Bedingung> wird geprüft, und die <Anweisung(en)> zwischen THEN und END_IF ausgeführt wenn die Bedingung zutrifft Wenn die Bedingung nicht zutrifft werden die Anweisungen zwischen THEN und END_IF übersprungen.
ST Bedingung IF THEN IF..THEN..END_IF Beispiel: Value wird auf 10 gesetzt, wenn Enable TRUE ist und PowerON FALSE. Ist Enable FALSE oder PowerON TRUE, wird Value auf 0 gesetzt
ST Bedingung IF THEN Eine IF Anweisung wird nur ausgeführt wenn die Bedingung TRUE ist. Um auch den anderen Fall abzufangen, also wenn die Bedingung FALSE ist, brauchen wir die ELSE Anweisung. When TRUE When FALSE Wenn Bedingung erfüllt ist wird nur „Anweisung_1“ ausgeführt, wenn Bedingung nicht erfüllt ist, nur „Anweisung_2“
ST Bedingung IF THEN ELSIF Erweiterte IF Anweisung mit ELSIF <Bedingung_1> wird geprüft und <Anweisung_1> ausgeführt wenn nötig Nach <Bedingung_1> wird ein ELSIF nach dem anderen abgearbeitet. Es können also mehrere Bedingungen und Anweisungen durchlaufen werden Wenn keine der Bedingung zutrifft wird die ELSE Anweisung ausgeführt
ST Bedingung IF THEN ELSIF IF THEN ELSEIF Fallunterscheidungen können geschachtelt werden Jede verschachtelte Sektion muss mit END_IF abgeschlossen sein. Es ist sehr empfohlen die Sektionen einzurücken für bessere Lesbarkeit. Dies wird durch den Editor unterstützt. Theoretisch kann bis zu einer tiefe von 15 Stufen verschachtelt werden, was natürlich kein schöner Code ist!
ST Verzweigung CASE Verzweigung mit CASE..OF … ELSE …END_CASE Abhängig vom <Status> wird der entsprechende Zweig ausgeführt. Ist keine der Konditionen zutreffend kann optional eine ELSE Anweisung abgearbeitet werden Es ist immer nur ein Zweig pro durchlauf aktiv.
ST Verzweigung CASE CASE..OF.. END_CASE Beispiel: Wichtig: Wird der Status innerhalb der Case Struktur geändert, wird dies erst im nächsten Zyklus aktiv. Am Ende des Zweigs wird immer zu END_CASE gesprungen. Dies kann ausgenützt werden um Zykluszeit zu sparen…
ST Verzweigung CASE Immer nur ein Status innerhalb der Case Struktur ist aktiv value=10 value=20 value=30 value=40 Nächster Zyklus value=20 Nächster Zyklus value=30 Nächster Zyklus value=40 Nächster Zyklus value=50
ST Verzweigung CASE Beispiel mit Enumerator ENUM Deklaration Variablen Deklaration
ST Verzweigung CASE Beispiel mit Mehrfachauswahl Mehrfachauswahl ist möglich, durch Kommagetrennte Werte oder mit “..“ als Bereichsangabe
Übung 2 Lösung Erstellen sie den folgenden Ablauf
Übung 3 Lösung Erstellen sie den folgenden Ablauf
Übung 4 Lösung Erstellen sie ein Programm in ST für eine Pumpensteuerung: Pumpe 1 einschalten bis Schalter 1 anspricht Wenn Schalter 1 anspricht schaltet Pumpe 2 ebenfalls ein, bis Schalter 3 anspricht. Wenn Schalter 3 anspricht 3. Pumpe einschalten. Wenn Hauptschalter ausgeschaltet ist alle Pumpen ausschalten. Tipp: Lösen mit CASE und IF
ST Schleifen FOR Bedingte Schleifen: FOR.. (BY) .. DO..END_FOR Wiederholt die Anweisungen zwischen FOR und END_FOR in einer Schleife von <Anfangswert> bis <Endwert> Wenn Endwert erreicht ist wird zu END_FOR gesprungen Die <Schrittweite> Angabe ist optional. Standard ist 1 Zähler, Anfangswert, Endwert und Schrittweite müssen vom selben Datentyp sein Achtung! Die Schleife wird nicht unterbrochen. Zu viele Wiederholungen / Anweisungen oder Endlosschlaufen führen zu Zykluszeitverletzung
ST Schleifen FOR FOR.. (BY) .. DO..END_FOR Beispiel Ohne “BY“ Kommando, wird die Zählervariable bei jedem Durchlauf automatisch um +1 erhöht.
ST Schleifen WHILE Bedingte Schleifen: WHILE.. DO..END_WHILE Wiederholt die <Anweisungen> zwischen WHILE .. END_WHILE solange die <Bedingung> erfüllt ist. Wenn die Bedingung nicht erfüllt ist, wird die Schleife beendet. Die WHILE Schleife ist Kopfgesteuert (wird evtl. nie durchlaufen) Die Programmabarbeitung bleibt solange in der WHILE Schleife bis die Bedingung nicht mehr erfüllt ist. Gefahr von Zykluszeitverletzung durch zu viele Anweisungen oder Endlosschlaufe
ST Schleifen WHILE WHILE..DO..END_WHILE Beispiel Die Schleife wird verlassen wenn counter den Wert 10 erreicht. Value wird 10 sein. ACHTUNG Endlosschleife !:
Übung 5a Lösung Schreiben sie ein Programm, welches ein Dreiecksignal generiert mit 200 Schritten, und in einem Array abspeichert. 1 100 200 Triangle: Array[1..200] Array value
Übung 5b Lösung Schreiben sie ein Programm welche die Fibonacci Zahl berechnen kann. Sie fangen mit 0 und 1 an, dann ist jede Fibonacci-Zahl gleich der Summe der beiden vorhergehenden Fibonacci-Zahlen Eingabe Ausgabe 1 2 3 4 5 6 8 7 13 21 9 34 10 55 11 89 12 144 ..
ST Schleifen REPEAT UNTIL Bedingte Schleifen: REPEAT .. UNTIL .. END_REPEAT Anweisung wird ausgeführt, dann die Bedingung geprüft, ist die Bedingung FALSE, wird die Schleife weiter durchlaufen. Bis die Bedingung zutrifft. REPEAT ist Fussgesteuert, wird also mindestens einmal durchlaufen Die Programmabarbeitung bleibt solange in der WHILE Schleife bis die Bedingung nicht mehr erfüllt ist. Gefahr von Zykluszeitverletzung, durch zu viele Anweisungen oder Endlosschlaufe
ST Schleifen REPEAT UNTIL REPEAT..UNTIL..END_REPEAT Beispiel Nach END_REPEAT, counter ist gleich 142
ST Schleifen WHILE REPEAT Unterschied zwischen WHILE Schleife und REPEAT Schleife WHILE REPEAT Bedingung wird VOR der Schleife geprüft Schleife wird nie ausgeführt wenn Bedingung nicht erfüllt ist Bedingung wird NACH der Schleife geprüft. Die Schleife wird immer mindestens einmal durchlaufen
ST Schleifen EXIT Unterbrechen von bedingten Schleifen: EXIT EXIT Kommando wird normalerweise in Verbindung mit Schleifen verwendet EXIT ist zum unterbrechen der Schleife aufgrund einer Bedingung EXIT Befehl kann hilfreich sein um Endlosschleifen zu verhindern und Zykluszeit zu sparen z.B. “suchen bis gefunden“ EXIT kann in allen Schleifen verwendet werden FOR / WHILE / REPEAT
ST Schleifen EXIT EXIT Beispiel WHILE wird spätestens nach 40 Durchgängen mit EXIT Befehl abgebrochen
Übung 6 Schreiben sie eine Funktion um die Fakultät n! zu berechnen Tipps: Die Fakultät von 0! ist 1. Falls der eingegebene Wert negativ ist soll 0 returniert werden Die Ausgabe soll als DWORD erfolgen, maximaler Eingabewert: 31
Übung 6 Lösung Function Programm Beispiel Aufruf:
Funktionsblock Aufruf in ST Ein Funktionsblock muss mit einer vorgängig deklarierten Instanz aufgerufen werden InstanzName (<Input_1>:=… , <Input_n>:=… , <Output_1> =>… , <Output_n> =>… , <Input_output_1> :=… , <Input_output_n>):=… ); Eingange werden zugewiesen mit “:= “ Ausgänge werden zugewiesen mit “ =>” Ein/Ausgänge können mit beidem zugewiesen werden (Vorzugsweise “:= “)
Beispiel Funktionsblock Aufruf Funktionsblock Aufruf in ST Beispiel Funktionsblock Aufruf P_oN2( Axis := MC_Axis001, Enable := BB, Axis =>, Status =>ok2, Busy =>NotReady, Error =>Alarm, ErrorID =>ErrID); P_oN2 ist eine Instanz des Funktionsblock MC_Power KOP:
Funktionsblock Aufruf in ST Die unbenutzten Ein- und Ausgänge können leergelassen oder gar weggelassen werden beim Aufruf Die weggelassenen Parameter werden auf default Werte gesetzt Beispiel p_oN ( Axis := MC_Axis000, Enable := AA, Axis =>, Status => ok, Busy =>, Error =>, ErrorID =>); p_oN ( Axis := MC_Axis000, Enable := AA, Status => ok);
Funktionsblock Aufrufe in ST Ausgangswerte können auch durch Zugriff auf die entsprechenden Elemente der (Instanz)Struktur ausgelesen werden p_oN ( Axis := MC_Axis000, Enable := AA, Axis =>, Status => ok, Busy => NotReady, Error =>, ErrorID =>); p_oN(Enable:=AA) ; ok:= p_oN.Status ; NotReady:= p_oN.Busy ;
Funktions Aufruf in ST Eine Funktion kann “normal” aufgerufen werden, es ist keine Deklaration oder Instanz nötig <variable>:= FunctionName(<parameter_1>,…,<parameter_n>) Beispiel: Production_1:=ProductionSpeed( Enable:=TRUE, SetPoint:=45, Diameter:=345.6); Production_2:=ProductionSpeed( Enable:=TRUE, SetPoint:=46, Diameter:=220);
Funktions Aufruf in ST Die unbenutzten Eingänge können leergelassen oder weggelassen werden Die weggelassenen Parameter werden auf default Werte gesetzt Beispiel: Production_3:= ProductionSpeed( Enable:= , Diameter:=345.6); Production_3:= ProductionSpeed( Diameter:=345.6);
Strukturen Auf die Elemente einer Struktur kann mit dem “.” zugegriffen werden <variable>:= <Type> . <Type Element>; Name:= Person.Nachname; Beispiel: Strukturen können verschachtelt werden <variable>:= <Type_1> . <Type_2> . <Type_2 Element>; Vorname:= Person.Kind.Vorname; Beispiel:
Strukturen Beispiel: Motor_1.Enable:=TRUE; Motor_1.Setpoint:=459; Motor_1.Value:=0; EncoderValue:= Motor_1.Encoder; Motor_1.Status.StandStill:=TRUE; Motor_1.Status.StateCode:=100;
Übung 7 Erstelle folgenden Funktionsblock in ST: Execute Eingang positiv Flanken getriggert Mit jeder steigenden Flanke am Eingang soll die Ausgangsvariable „Value“ um 1 erhöht werden bis 5, dann zurücksetzen Ein Bit Ausgang soll mit jeder Flanke am Eingang „Execute“ alternieren von ON-OFF-ON … Ein Reset Eingang soll beide Ausgänge zurücksetzen Aufruf des Funktionsblockes aus ST Programm und KOP
Übung 7 Lösung
Funktionsblock Aufruf in ST vs. KOP
Vergleich zwischen KOP und ST Zuweisung Logische Verknüpfung Bedingte Zuweisung
Vergleich zwischen KOP und ST Verzweigung *Die Lock Variable wird hier verwende um das CASE verhalten zu erreichen, das heißt nur ein Zweig pro Zyklus wird bearbeitet.
Vergleich zwischen KOP und ST Flankenerkennung oder ….
Vergleich zwischen KOP und ST Timer und Zähler Deklaration der FB Instanzen