Erschienen am: 25.02.2015, Ausgabe SPS-MAGAZIN 3 2015

Eine Einführung in SCL und ST - Teil 2 von 3

Modern Programmieren mit Standards

Über Jahrzehnte war die Anweisungsliste (AWL) die Programmiersprache, mit der textbasiert auch komplexere Aufgabenstellungen in der Automatisierung gelöst wurden. Die S7 1200 von Siemens geht konsequent einen modernen Weg und setzt auf den 'Strukturierten Text' (ST) oder hier als SCL (Structured Control Language) bezeichnet. Umso wichtiger ist es für den Anwender, sich mit dieser Programmiersprache vertraut zu machen und damit die große Leistungsfähigkeit der Steuerungen im unteren Preisbereich für die eigenen Anwendungen zu erschließen.

Autor: Ulrich Kanngießer, Kanngießer Automation Consulting.


Bild 1: SCL - Die moderne Programmierung der S7 1200
Bild: Siemens AG

Die S7 1200 von Siemens steht in der Linie der S7 200 und wird diese vermutlich langfristig ersetzen. Die S7 200 ist eine Steuerung, die in kleineren Automatisierungsaufgaben mit einer hohen Leistungsfähigkeit überraschen kann. Sie verfügt über kostengünstige Möglichkeiten Positionierungen zu realisieren, ebenso wie Regelungsaufgaben zu lösen, komplexe Datenverwaltungen zu verarbeiten und die unterschiedlichsten Netzwerkanbindungen zu integrieren. Gleichzeitig stellt Siemens für diese Anwendungsgebiete Technologiebausteine zur Verfügung, die dem Anwender die Arbeit vereinfachen. Da die S7 1200 mit dem niedrigen Preis und der hohen Leistungsfähigkeit durch das SCL eine große Verbreitung finden wird, sind viele Ausführungen und Beispiele dieses Artikels an dieser Steuerung orientiert. Es finden sich aber auch Beispiele und Ausführungen die auf Codesys, PC Worx oder logi.CAD3 passen. Der Fachmann wird kein Problem mit der Übertragung auf sein eigenes Steuerungssystem haben.

Die einfachen Zuweisungen

Beginnt man mit der einfachsten Zuweisung des SCL, so ist die typische Schreibweise einer Hochsprache wie zum Beispiel 'C' zu erkennen. Der 'Trenner' oder auch das 'Zuweisungszeichen' besteht aus einem Doppelpunkt und dem Gleichheitszeichen. Links davon befindet sich die Variable auf die das rechts entstandene Verknüpfungs- oder Berechnungsergebnis zugewiesen wird. Die Reihenfolge der Abarbeitung durch den Prozessor kann durch Klammern gesteuert werden. Soweit Klammern die Abarbeitung nicht beeinflussen, entscheidet die 'Bindungsstärke' (AND vor OR usw.). Bei Operatoren mit gleicher Bindungsstärke wird ein Statement von links nach rechts vom Prozessor abgearbeitet.

Beispiel:

(* Beliebiger Kommentar *)

x_MotorEin := x_Start OR x_MotorEin AND ( i_Anz = 15 );

Das gesamte Statement kann in einer Zeile geschrieben werden. Das Programm und entsprechend die Dokumentation sind wesentlich kompakter und somit einfacher zu lesen als in AWL. Der Aufruf eines Funktionsbausteins in SCL wird wie folgt realisiert.

Beispiel Timer:

(* TIA Portal*)

#FB_ZeitAmpelX( IN := x_StartTime , (*Start der Zeit *)

PT := t_ZeitAmpel1, (* Übergabe der Sollzeit *)

Q => x_ZeitEnde , (* Zeit ist abgelaufen *)

ET => t_ZeitAbgel ); (* Bisher vergangene Zeit*)

Neue Variablentypen

Die Variablen einer einfachen Steuerung bestanden aus den Grundtypen (Bit, Byte, Word, Doppel-Word und Real). Diese Variablen hatten feste Hardware-Adressen und konnten wahlweise mit einer symbolischen Bezeichnung versehen werden, mit denen dann im Programm auch operiert wurde. Mit den modernen SPS-Prozessoren kommen Arrays und Strukturen hinzu. Der Compiler legt dann selber die Speicherbereiche fest, an denen die Variablen (Speicher) generiert werden. Zusätzlich können Werte und Zustände definiert werden, mit denen die Variablen bei einem 'Kaltstart' der Steuerung beginnen sollen.

VAR

w_Sollwert : WORD := 1200 ; (* Variable mit Initialisierung *)

END_VAR

Diese Datentypen benötigen entsprechende Bearbeitungsbefehle, die das SCL (bzw. ST) bietet.

Arrays

Ein Array ist eine geordnete Zusammenfassung gleicher Daten (Datentypen) in einer Tabelle. Ein Array kann vom Typ Bool, Byte ...String sein, es ist jedoch immer vom gleichen Datentyp (im Gegensatz zu Strukturen). Mit einem Array lassen sich aber wiederum mehrere Strukturen geordnet als Felder zusammenfassen, ebenso wie eine Struktur als Teil-Element ein Array beinhalten kann.

Strukturen

Während ein Array Daten vom gleichen Typ zusammenfasst, lassen sich unterschiedliche Daten als Strukturen zusammenfassen. Nimmt man zum Beispiel eine Maschine oder Anlage (Einpacker von Flaschen, Klimabahnen einer Käserei, Transportbänder, Palettenmagazin...) kann der Programmierer in diesen Einrichtungen eine Anzahl Aktoren und Sensoren sehen, die in verschiedenen Betriebsarten durch Logik verknüpft werden. Eine moderne Programmierung wird in den Funktionseinheiten eine einzige Struktur sehen und wenn mehrere, gleiche Funktionseinheiten vorhanden sind (z.B. eine Vielzahl von Transportbändern oder Klimabahnen), definiert der Anwender ein Array von Strukturen (jedes Feld eines Arrays ist eine Struktur, z.B. ein Förderband). Aber auch ein Timer oder ein Zähler kann als Funktionsbaustein (üblich) oder als Struktur gesehen werden. Nimmt man den Zähler, so wird bei jedem Zählimpuls der Istwert der Struktur 'Zähler' um den vorgegebenen Wert erhöht, ein Vergleich Istwert => Sollwert durchgeführt und entsprechend das Ergebnis-Bit in der Struktur gesetzt.

Beispiel für ein Transportband als Struktur (Beispiel Codesys):

TYPE str_FoederbMotor: (* Abbild aller Daten eines Förderbandes als SDT - Hier der allgemeine "Bauplan" für das Datenmodell *)

STRUCT

int_NOTAUS : INT ; (* Anzahl der NOT-Abschaltungen*)

int_STROM : INT ; (* Stromaufnahme *)

b_BetriebsStatus : BYTE ; (* Betriebszust.(Automatik,Hand,Wartung)*)

t_LaufzeitAktuell : TIME ; (* Laufzeit *)

t_LaufzeitGesamt : TIME ; (* Laufzeit gesamt *)

x_Status : BOOL ; (* Ein oder Aus *)

x_AnfordEin : BOOL ; (* Anforderung Fördereinrichtung Ein *)

END_STRUCT

END_TYPE

Array von Strukturen unter Codesys:

(* 5 Förderbänder werden unter str_Foerderbaender als Struktur erzeugt *)

str_Foerderbaender : ARRAY [1..5] OF str_FoederbMotor ;

Befehle der Datenverwaltung

Die Speicherung von Daten größerer Datenmengen erfordern Organisationseinheiten, in denen diese Daten gespeichert werden und für weitere Steuerungszwecke, Visualisierungen, Kommunikation und Datenlogging zur Verfügung stehen.

Tabellenbefehle

Auch die S7 200 verfügt über Möglichkeiten Tabellen aufzubauen, sie zu verwalten, Daten abzulegen, aufzurufen, zu suchen und zu lösen. Aber diese Befehle waren sehr speziell und auf die Hardware der S7 200 bezogen. SCL bietet universelle Möglichkeiten, die jedem, der einmal in der Ausbildung Basic oder C kennengelernt hat, verständlich sind.

Beispiel S7 200 Übergabe des Wertes einer Variablen an eine andere (kopieren des Variableninhaltes ):

MOVB VB20,VB100

Beispiel SCL- gleiche Anwendung, der Wert von b_Pumpe wird an b_Status1 übertragen:

b_Status1 := b_Pumpe;

Speicherung von Daten durch einen Index (S7 200 AWL)

Um Daten strukturiert in Tabellen oder Rezepten verwalten zu können, benötigt der Anwender entsprechende Befehle um die Tabellen zu durchsuchen, initialisieren, zu beschreiben und durch gezielten Zugriff Daten herauszulesen. Da eine Steuerung wie die S7 200 (ähnlich wie Wettbewerbsprodukte) in der AWL keine leistungsfähigen Steuerbefehle besitzt, werden Funktionen bzw. Funktionsbausteine verwendet. Auslesen eines Wertes aus einem Variablenbereich durch einen Index (S7 200 AWL), Übertragung der Adresse, auf die zugegriffen werden soll ( & ) bzw. setze Pointer:

Setze einen Pointer in AC1 (Akkumulator 1)

MOVD &MB10, AC1 // Die Adresse MB10 wird in AC1 gespeichert

Indirekter Zugriff (*)

MOVD *AC1, AC0 // Der Wert der Variablen, deren Adresse in AC1 gespeichert ist, // wird in AC0 gespeichert

Mit der gespeicherten Adresse kann auch gerechnet werden, das heißt die Adresse zum Übertragen eines Variableninhalts kann auch Ergebnis einer Berechnung sein. Insgesamt wird dem Leser die Nähe zu Assembler-Programmen auffallen (MOV-Befehle, Pointer-Kennzeichnung u.v.m.). Eine ähnliche Aufgabe mit dem SCL (gleich ST), mit der Ähnlichkeit zu einer Hochsprache wie 'C' oder Pascal:

i_Zeiger := 14 ;

i_Ergebnis1 := iArr_Wert[i_Zeiger];

oder mit Berechnung des Zeigers:

i_Zeiger := i_Zeiger + 2;

i_Ergebnis2 := iArr_Wert[i_Zeiger];

Befehle zur Steuerung der Programmabarbeitung

Während die AWL (hier zur S7 200) nur den bedingten und unbedingten Sprung auf ein Label kannte, den bedingten und unbedingten Aufruf eines Funktionsbausteins bzw. einer Funktion, sowie die STOP-Anweisung, verfügt SCL über moderne Befehle zur Abarbeitungssteuerung von Programmsequenzen, wie sie aus Fortan, Pascal oder C bekannt sind. Übersicht der Befehle zur Programm-Steuerung:

  • • IF...THEN - Anweisung
  • • CASE-Anweisung (Fall der Auswahlanweisung)
  • • WHILE...DO (Kopfgesteuerte Anweisung)
  • • REPEAT...UNTIL (Fußgesteuert)
  • • FOR...TO...DO (Kopfgesteuert)
  • • FOR...TO...BY...DO (Kopfgesteuert)
  • • EXIT (Abbruch)
  • • RETURN
  • • CONTINUE
  • • GOTO (Nur bei SCL, Anwendung nicht zu empfehlen)

Mit den veränderten Strukturen zur Programmsteuerung bieten sich auch neuere Entwurfsmethoden der Programme an. Während der Programmablauf einer AWL sehr gut im PAP (ProgrammAblaufPlan) dargestellt wird, eignen sich für SCL-Programme die Struktogramme (auch Nassi-Schneidermann-Diagramme) zum Entwurf und die Überprüfung (Validierung) fertiger Programmbausteine. SCL kann in mehreren Bereichen angewendet werden, so z.B. um fertige Bausteine mit komplexerer Funktionalität anzubieten, aber auch um Ablaufsteuerungen nachzubilden. Da die S7 1200 nicht über die Programmierung per 'Graph' verfügt (entspricht dem SFC bzw. Grafcet nach Norm), müssen entsprechende Strukturen mit anderen Programmiersprachen nachgebildet werden. Dazu gibt es zahlreiche Ansätze (Schieberegister, Kontaktplan mit R/S-Zuweisungen usw.), doch sehr interessant ist die Nachbildung eines Schrittablaufs mittels der CASE-Anweisungen. Damit kann der Anwender auch problemlos unterschiedliche Zonen eines Schrittes nachbilden (Zone der Aktivierung, der Kontinuität und der Deaktivierung eines Schrittes). Derartige Schrittabläufe sind dann als eigener Funktionsbaustein in ein oder mehreren Projekten einzubinden und können entsprechend mit unterschiedlichen Prozessoren angewendet werden. Obwohl eine Entwicklungsumgebung prinzipiell nichts mit einer Programmiersprache zu tun hat, erschließen sich die Möglichkeiten eines modernen Systems erst, wenn das zugehörige Portal, Studio oder Suite betrachtet wird. Herstellerübergreifend empfiehlt sich die Bezeichnung IDE (Integrated Development Environment). In der Praxis entwickeln zahlreiche, erfahrene Programmierer einzelne Programmbausteine in SCL (oder ST bzw. STL) in einem freien Editor, kopieren es in die jeweilige Entwicklungsumgebung (TIA Portal oder andere Systeme) und überprüfen dann die Syntax durch die entsprechenden Befehle des Editors oder Compilers.

TIA Portal als universelles Engineering Tool

Einer der wesentlichen Unterschiede zwischen der S7 200 und S7 1200 liegt in der Entwicklungsumgebung der zugehörigen Anwendungssoftware. Während die S7 200 ein eigenes Tool (das STEP 7-MicroWIN) besitzt, das sehr einfach gestaltet ist und intuitiv binnen kürzester Zeit angewendet werden kann, ist das TIA-Portal eine universelle Entwicklungsplattform, das alle Werkzeuge enthält um ein verteiltes System über Netzwerkverbindungen zu definieren, Steuerungen zu programmieren und Visualisierungen zu entwickeln.

Durchgängigkeit S7 1200 zu S7 1500

Die S7 300 und die S7 1500 von Siemens ermöglichen es nach wie vor mit der Anweisungsliste (AWL) zu programmieren. Damit sind entsprechende Funktionsbausteine oder Funktionen nicht mehr für eine S7 1200 anwendbar. Aus diesem Grunde ist es unbedingt zu empfehlen innerhalb eines Unternehmens einheitlich in SCL zu programmieren.

KOP / FUP / GRAPH kontra SCL?

SCL kann zwar jede Sprache ersetzen, doch sinnvoll ist ein derartiges Vorgehen nicht. Es ist jedoch zu beobachten, dass sehr versierte Steuerungsspezialisten ihr gesamtes Programm in ST bzw. SCL oder STL schreiben, um einfacher die Programme portieren zu können. Abweichungen der unterschiedlichen Hersteller sind in der Regel bekannt und es werden Statements vermieden, die zu Problemen führen würden.

Unterschiede der Anbieter

Die Inkompatibilitäten der verschiedenen ST, SCL oder STL-Dialekte sind überschaubar. So hält sich PcWorx bei den Funktionsbausteinen und Funktionen strikt an die Definitionen und lässt bei Funktionen nur den Funktionsausgang zu, ebenso ist der Zugriff einer Funktion auf 'Globale Variable' gesperrt. SCL ist sehr flexibel und tolerant in der Nutzung von CASE-Anweisungen, bei denen Codesys oder PcWorx bei Übersetzung des Programms Fehler melden.

Internationaler Vergleich

Die Anweisungsliste, wie sie in Deutschland in der Vergangenheit stark forciert wurde, hat international zu keiner Zeit eine große Bedeutung gehabt. Schaut man sich das französische Unternehmen Telemecanique (zwischenzeitlich Schneider Electric) an, so startete die TSX 80 Ende der 70er- Jahre mit einer Basic-ähnlichen Sprache, dieser Weg wurde 1984 mit der TSX 7 konsequent weitergeführt und neben dem Kontaktplan und Grafcet (zwischenzeitlich SFC genannt) wurde eine textbasierte Sprache (TSX Basic genannt) aufrufbar, die mit dem heutigen ST oder SCL vergleichbar war. Eine Art AWL wurde nie forciert, da sie einer datenorientierten Sichtweise nicht entsprach und allzu hardwarenah in den verschiedenen Anweisungen bzw. Befehlen war.

Ausblick

Nachdem SCL oder ST in der Steuerungstechnik Einzug gehalten hat, ist der Zeitpunkt abzusehen, da der erste Hersteller von Kleinsteuerungen diese Möglichkeit anbieten wird, um eigene Technologiebausteine in eine Kleinsteuerung zu integrieren. Seit vielen Jahren besteht die Forderung von Anwendern derartige 'Fenster' in der Sprache C zu integrieren. Gerade die S7 1200 könnte den Weg für flexible, technologiebezogene Smart-Relais oder Steuer-Relais aufzeigen.

Zusammenfassung

SCL, ST oder STL haben auch im niedrigen Preisbereich der Automatisierungssysteme Fuß gefasst. Nun ist es wichtig, dass die anwendenden Unternehmen durch einheitliche Vorschriften und Vorgehensweisen ihre Softwareentwicklungen absichern und Spaltungen in den Entwicklungsabteilungen unter den Mitarbeitern vermeiden. Erfahrene Entwickler sollten den Mut zu neuen Werkzeugen haben und die Unternehmen können durch Schulungen und Investitionen diesen zukunftssicheren Weg unterstützen.