Simatic S7 von Siemens - Portal Automatisierungstechnik der tsm
Simatic S7 von Siemens - Portal Automatisierungstechnik der tsm
Simatic S7 von Siemens - Portal Automatisierungstechnik der tsm
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Programmieren mit STEP7<br />
Einführung<br />
Dieses Skript wendet sich an STEP7-Einsteiger, die bereits Grundkenntnisse in Zusammenhang mit<br />
Speicherprogrammierbaren Steuerungen (SPS) haben. Es soll die Einarbeitung in STEP7 erleichtern und den<br />
Überblick för<strong>der</strong>n. Deshalb sind hier Informationen in kompakter Form zusammengestellt, die in <strong>der</strong> ausführlichen<br />
Hersteller-Dokumentation auf einige Handbücher verteilt sind.<br />
Wegen <strong>der</strong> zunehmenden Verbreitung <strong>der</strong> Norm IEC 61131-3 für die Programmierung <strong>von</strong> Steuerungen habe ich<br />
versucht, die teils historisch gewachsenen Begriffe <strong>von</strong> STEP7 auch vom Standpunkt des IEC-Programmierers aus<br />
darzustellen. Falls STEP7 <strong>von</strong> <strong>der</strong> Norm abweichende Begriffe verwendet, benutze ich die aktuellen STEP7-<br />
Bezeichnungen (z.B. FUP statt Funktionsbausteinsprache FBS).<br />
STEP7 ?<br />
Mit <strong>der</strong> Programmierumgebung STEP7 werden SIMATIC <strong>S7</strong> - Steuerungen <strong>der</strong> Firma <strong>Siemens</strong> konfiguriert und<br />
programmiert. Genauer gesagt, geht es um Geräte <strong>der</strong> Familien <strong>S7</strong>-300 und <strong>S7</strong>-400, das sind Steuerungen mit<br />
mittlerer und hoher Leistungsfähigkeit. Daneben ist STEP7 auch für die Systeme SIMATIC M7<br />
(Automatisierungsrechner) und SIMATIC C7 (Steuerungen mit Operator Panel) verwendbar. Außerdem arbeitet<br />
STEP7 mit größeren Softwarepaketen für Visualisierung, SCADA und Prozessleittechnik zusammen.<br />
Hinweis: Kleinsteuerungen <strong>der</strong> Familie <strong>S7</strong>-200 werden nicht mit STEP7, son<strong>der</strong>n mit dem Produkt (STEP7-Micro)<br />
programmiert.<br />
Im Labor arbeiten wir dem Softwarepaket „STEP7 Professional V. 5.3 (Edition<br />
2004)“. Unter <strong>der</strong> Verwaltung <strong>von</strong> einem „SIMATIC Manager“ sind darin u.a.<br />
folgende Grundfunktionalitäten enthalten:<br />
• Konfiguration <strong>von</strong> Hardware, Systemeigenschaften und Kommunikationsbeziehungen<br />
<strong>der</strong> <strong>S7</strong>-Stationen, die in einem Projekt verwaltet werden<br />
• Programmiersprachen: FUP (Funktionsplan), KOP (Kontaktplan) und AWL<br />
(Anweisungsliste)<br />
• Programmiersprache: <strong>S7</strong>-SCL, entspricht <strong>der</strong> Sprache ST (Strukturierter Text)<br />
nach IEC 61131-3<br />
• Programmiersprache: <strong>S7</strong>-Graph, entspricht <strong>der</strong> Sprache AS (Ablaufsprache)<br />
nach IEC 61131-3<br />
• <strong>S7</strong>-PLCSIM, eine Simulation <strong>der</strong> konfigurierten <strong>S7</strong>-Station für Programmtests<br />
• Werkzeuge für Laden <strong>von</strong> Programmen in die Zielsysteme und für Online Tests<br />
• Werkzeuge zur Online-Diagnose <strong>von</strong> Baugruppen<br />
Konform zur Norm IEC 61131-3 ?<br />
STEP7 ist an die Norm IEC 61131-3 angelehnt, enthält aber viele SIMATIC-Typische Erweiterungen. Dadurch soll<br />
neben einer gewissen Kontinuität zur früheren Programmierumgebung STEP5 eine optimale Anpassung an das<br />
<strong>Siemens</strong> Automatisierungskonzept erreicht werden. Aber sicher spielen auch Marketing-Strategien eine Rolle für den<br />
eigenen Weg <strong>von</strong> <strong>Siemens</strong>.<br />
Anwen<strong>der</strong> mit IEC-Sprachkenntnissen müssen sich bei <strong>der</strong> Umstellung auf STEP7 vor allem erst an das spezielle<br />
Bausteinkonzept und an die Freiheiten und Gefahren bei <strong>der</strong> Adressierung <strong>von</strong> Operanden gewöhnen. Danach<br />
dürften sie mit STEP7-FUP und -KOP wenig Umstellungsschwierigkeiten haben. Beim Einstieg in STEP7-AWL zeigt<br />
sich ein gegenüber <strong>der</strong> Norm wesentlich größerer Funktionsumfang. Für IEC-Programmierer sind die folgenden<br />
Sprachen beson<strong>der</strong>s interessant, die aber in diesem Skript nicht weiter behandelt werden:<br />
<strong>S7</strong>-SCL (Structured Control Language)<br />
Entspricht <strong>der</strong> Sprache ST (Strukturierter Text) nach IEC 61131-3, eine textuelle Hochsprache mit Ähnlichkeiten zu<br />
Pascal. Die Konformität mit ST nach IEC 61131-3 ist nachgewiesen durch ein Base-Level Zertifikat <strong>der</strong> PLC-Open<br />
Organisation.<br />
<strong>S7</strong>-GRAPH<br />
Entspricht <strong>der</strong> Sprache AS (Ablaufsprache) nach IEC 61131-3, mit <strong>der</strong>en Hilfe Ablaufsteuerungen programmiert<br />
werden können. Die Konformität mit AS nach IEC 61131-3 ist nachgewiesen durch ein Base-Level Zertifikat <strong>der</strong> PLC-<br />
Open Organisation.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 1
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Inhalt<br />
1 PROGRAMMIERUMGEBUNG.............................................................................................................. 4<br />
1.1 Programmiergerät..................................................................................................................................................................4<br />
1.2 MPI-Bus ................................................................................................................................................................................4<br />
1.3 STEP7 Projekt.......................................................................................................................................................................4<br />
2 GRUNDWISSEN FÜR DAS PROGRAMMIEREN MIT STEP7............................................................. 5<br />
2.1 Programme in Teilaufgaben strukturieren .............................................................................................................................5<br />
2.2 Programmbausteine: OB, FC, DB, FB, SFC, SFB ...............................................................................................................6<br />
2.2.1 Organisationsbausteine (OB‘s) ................................................................................................................................................................ 6<br />
2.2.2 Funktion (Function, FC) .......................................................................................................................................................................... 7<br />
2.2.3 Datenbaustein (Data Block, DB) ............................................................................................................................................................. 7<br />
2.2.4 Funktionsbaustein (Function Block, FB)................................................................................................................................................. 7<br />
2.2.5 Systemfunktion (SFC) und Systemfunktionsbaustein (SFB).................................................................................................................. 7<br />
2.3 Anwendungsbeispiel: Abfüllanlage.......................................................................................................................................7<br />
2.4 <strong>S7</strong>-Bibliotheken.....................................................................................................................................................................8<br />
2.5 Netzwerke .............................................................................................................................................................................8<br />
2.6 Datentypen ............................................................................................................................................................................9<br />
2.6.1 Elementare Datentypen............................................................................................................................................................................ 9<br />
2.6.2 Zusammengesetzte Datentypen ............................................................................................................................................................. 10<br />
2.6.3 Parametertypen....................................................................................................................................................................................... 11<br />
2.6.4 Anwen<strong>der</strong>definierter Datentyp (UDT) .................................................................................................................................................. 11<br />
2.7 Variable...............................................................................................................................................................................12<br />
2.7.1 Globale Variable .................................................................................................................................................................................... 12<br />
2.7.2 Lokale Variable...................................................................................................................................................................................... 14<br />
2.7.3 Anwendungsbeispiel: Wie verwende ich innerhalb einer Funktion einen Timer? ............................................................................... 16<br />
2.8 Systemspeicher in <strong>der</strong> CPU.................................................................................................................................................17<br />
2.8.1 Remanenz............................................................................................................................................................................................... 18<br />
2.9 Adressierung........................................................................................................................................................................18<br />
2.9.1 Direkte Adressierung ............................................................................................................................................................................. 18<br />
2.9.2 Indirekte Adressierung........................................................................................................................................................................... 19<br />
2.9.3 Adressierung mit Pointer ....................................................................................................................................................................... 19<br />
2.9.4 Adresszusammenhang Bit, Byte, Wort, Doppelwort .......................................................................................................................... 20<br />
3 BEISPIELE IN FUP/KOP UND AWL................................................................................................... 21<br />
3.1 Logische Verknüpfung ........................................................................................................................................................21<br />
3.2 Flip Flop und Flankenerkennung.........................................................................................................................................21<br />
3.3 Timer...................................................................................................................................................................................21<br />
3.4 Zähler ..................................................................................................................................................................................22<br />
3.5 Arithmetische Operation .....................................................................................................................................................22<br />
3.6 Bausteinaufruf .....................................................................................................................................................................22<br />
3.7 MOVE (Laden und Transferieren) ......................................................................................................................................23<br />
4 HANDHABUNG DER CPU.................................................................................................................. 23<br />
4.1 Betriebszustände und Übergänge ........................................................................................................................................23<br />
4.2 Laden des Anwen<strong>der</strong>programms .........................................................................................................................................23<br />
4.3 Urlöschen <strong>der</strong> CPU..............................................................................................................................................................24<br />
4.4 Verhalten <strong>der</strong> CPU bei Netzausfall......................................................................................................................................24<br />
5 FUNKTION (FC) .................................................................................................................................. 25<br />
5.1 Die Operanden EN (Enable) und ENO (Enable Out) .........................................................................................................25<br />
5.2 Erstellen einer Funktion ......................................................................................................................................................26<br />
5.2.1 Deklarationsteil ...................................................................................................................................................................................... 26<br />
5.2.2 Anweisungsteil in FUP und AWL......................................................................................................................................................... 26<br />
5.3 Aufrufen <strong>der</strong> Funktion.........................................................................................................................................................27<br />
5.4 Fehlerbehandlung und Statusmeldungen.............................................................................................................................27<br />
6 DATENBAUSTEIN (DB)...................................................................................................................... 28<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 2
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
6.1 Erzeugen eines Datenbausteins ...........................................................................................................................................28<br />
6.2 Festlegen <strong>der</strong> Datenstruktur.................................................................................................................................................28<br />
6.3 Adressierung <strong>der</strong> Daten .......................................................................................................................................................29<br />
6.3.1 Vollständige Adressierung <strong>der</strong> Daten in einem Schritt ......................................................................................................................... 29<br />
6.3.2 Adressierung mit: DB ‘Öffnen’ bzw. DI ‘Öffnen’........................................................................................................................... 30<br />
6.4 Weitere Operationen mit Datenbausteinen..........................................................................................................................30<br />
7 FUNKTIONSBAUSTEIN (FB) ............................................................................................................. 31<br />
7.1 Unterschied zur Funktion ....................................................................................................................................................31<br />
7.2 Anwendungsbeispiel: Zeitliche Ableitung eines Meßsignals ..............................................................................................31<br />
7.2.1 FB Erstellen............................................................................................................................................................................................ 31<br />
7.2.2 FB Aufrufen ........................................................................................................................................................................................... 32<br />
7.2.3 Instanz-DB ............................................................................................................................................................................................. 32<br />
8 EREIGNISGESTEUERTE PROGRAMMBEARBEITUNG.................................................................. 33<br />
8.1 Zyklische Programmbearbeitung (OB1)..............................................................................................................................33<br />
8.2 Anlaufbearbeitung und Initialisierung (OB100)..................................................................................................................34<br />
8.2.1 Lokale Variable des OB100................................................................................................................................................................... 34<br />
8.2.2 Anwendungsbeispiel .............................................................................................................................................................................. 34<br />
8.3 Weckalarm = Periodischer Zeitinterrupt (OB30..OB38) .....................................................................................................36<br />
8.3.1 Einstellung des Aufrufintervalls ............................................................................................................................................................ 36<br />
8.3.2 Anwendungsbeispiel .............................................................................................................................................................................. 36<br />
8.4 Prozeßalarm = I/O-Interrupt (OB40)...................................................................................................................................37<br />
8.4.1 Alarm-Freischaltung in <strong>der</strong> CPU ........................................................................................................................................................... 37<br />
8.4.2 Alarmbearbeitung................................................................................................................................................................................... 37<br />
Anhang:<br />
Literaturverzeichnis<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 3
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
1 Programmierumgebung<br />
1.1 Programmiergerät<br />
Als Programmiergeräte (PG) werden meist PCs mit eingebauter MPI-Steckkarte o<strong>der</strong> spezielle Notebooks<br />
verwendet. Betriebssystem ist Windows 2000 Professional o<strong>der</strong> Windows XP Professional.<br />
1.2 MPI-Bus<br />
Jede <strong>S7</strong>-Station hat in <strong>der</strong> CPU eine MPI-Schnittstelle (Multi Point Interface). Über diese Schnittstelle werden die am<br />
Automatisierungsprojekt beteiligten <strong>S7</strong>-Stationen mit dem Programmiergerät vernetzt.<br />
Bei MPI handelt es sich um Schnittstellen mit RS485-Physik, über die ein <strong>Siemens</strong>-internes Protokoll abgewickelt<br />
wird. Es können bis zu 32 Teilnehmer über eine Zweidrahtleitung verbunden werden. Je<strong>der</strong> Teilnehmer bekommt<br />
eine MPI-Adresse zugewiesen, über die er ansprechbar ist. Baudrate am MPI-Bus ist 187,5 kBit/s.<br />
Für Programmiergeräte sollen die Adressen MPI-0 und MPI-1 reserviert werden, die erste <strong>S7</strong>-Station erhält die<br />
Adresse MPI-2.<br />
Normalerweise verläuft über den MPI Bus nur <strong>der</strong><br />
Datenaustausch zwischen Programmiergerät und<br />
den <strong>S7</strong>-Stationen zur Programmierung und für<br />
Online Testfunktionen.<br />
Für wenige Teilnehmer mit geringen<br />
Datenmengen kann aber auch eine<br />
Kommunikation zwischen den <strong>S7</strong>-Stationen<br />
ermöglicht werden. Dies geschieht durch<br />
Projektierung <strong>von</strong> sogenannten Globaldaten. In<br />
festgelegten Kommunikationskreisen werden die<br />
Globaldaten <strong>von</strong> den beteiligten CPU’s verschickt<br />
und empfangen. Mit den <strong>S7</strong>-Stationen können<br />
über MPI auch Operator Panels (OP) verbunden<br />
werden.<br />
1.3 STEP7 Projekt<br />
Ein STEP7-Projekt enthält Datenobjekte für eine o<strong>der</strong> mehrere zusammengehörige <strong>S7</strong>-Stationen. Im folgenden<br />
Beispiel besteht das Projekt <strong>der</strong> Einfachheit halber nur aus einer Station <strong>der</strong> Reihe <strong>S7</strong>-300.<br />
Das Projekt mit dem Namen <strong>S7</strong>_Pro1 belegt ein eigenes Verzeichnis. Die Station selbst besteht aus Angaben zum<br />
Hardwareaufbau (sog. „Stationskonfiguration“) und aus Systemeinstellungen für die CPU, hier eine CPU312IFM.<br />
Im Behälter „<strong>S7</strong>-Programm“ ist das Programm für die CPU abgelegt. Hierzu gehören Voreinstellungen <strong>der</strong><br />
Programmierumgebung, die Definition <strong>von</strong> Symbolischen Variablen und im Behälter „Bausteine“ die eigentlichen<br />
Programmanweisungen in FUP/KOP und AWL. Diese sind in Programmbausteine geglie<strong>der</strong>t, die man ohne<br />
Compilierung in die CPU laden kann.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 4
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Der Behälter „Quellen“ ist für Programm-Module im Quelltext bestimmt. Das sind beispielsweise Anweisungen in<br />
AWL, die mit einem Texteditor erstellt werden. Vor <strong>der</strong> Übertragung zur <strong>S7</strong>-Station müssen die Quellen erst noch<br />
compiliert werden, dadurch entstehen ebenfalls Bausteine.<br />
Zu je<strong>der</strong> Station werden viele Informationen abgelegt: Hardwareaufbau, Kommunikationsbeziehungen, Symbolische<br />
Bezeichnungen <strong>von</strong> Variablen, Hilfen für Test und Inbetriebnahme, Voreinstellung <strong>der</strong> Programmierumgebung,<br />
Dokumentation und -last not least- die eigentlichen Programmanweisungen unter FUP, KOP, AWL o<strong>der</strong> weiteren<br />
Hochsprachen.<br />
2 Grundwissen für das Programmieren mit STEP7<br />
2.1 Programme in Teilaufgaben strukturieren<br />
STEP7-Programme bestehen im allgemeinen aus mehreren o<strong>der</strong> vielen Programmbausteinen. In jedem Baustein<br />
wird dabei eine Teilaufgabe des Gesamtprogramms bearbeitet. Zur Vorbereitung <strong>der</strong> Programmierung wird zunächst<br />
die Funktion <strong>der</strong> zu steuernden Anlage untersucht. Aus <strong>der</strong> Aufspaltung in Teilfunktionen entsteht schließlich die<br />
Programmstruktur.<br />
Am Beispiel einer Abfüllanlage soll dieser<br />
Entwurfsvorgang gezeigt werden:<br />
Die Anlage könnte beispielsweise grob<br />
unterteilt werden in Transporteinrichtungen,<br />
die Füllung <strong>der</strong> Behälter und<br />
irgendwelche Bedieneinrichtungen mit<br />
Schaltern und Anzeigen.<br />
Eine genauere Betrachtung <strong>der</strong> Füllung<br />
könnte beispielsweise ergeben, daß nach<br />
mehreren Reinigungsvorgängen und<br />
dem Füllvorgang noch eine Etikettierung<br />
<strong>der</strong> Behälter erfolgen soll.<br />
Auf diese Weise erhält man eine<br />
funktionale Glie<strong>der</strong>ung <strong>der</strong> Anlage in<br />
beliebig feiner Struktur.<br />
Die Programmbausteine entsprechen<br />
den so festgelegten Teilaufgaben.<br />
Der Baustein „Füllung“ beispielsweise<br />
veranlaßt später die Bearbeitung <strong>der</strong><br />
Bausteine für die Reinigungen, Kontrolle,<br />
Füllung und Etikettierung.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 5
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.2 Programmbausteine: OB, FC, DB, FB, SFC, SFB<br />
Das Bausteinkonzept <strong>von</strong> STEP7 unterscheidet sich <strong>von</strong> den Festlegungen <strong>der</strong> Norm IEC 1131-3. Es ist für das<br />
Verständnis <strong>von</strong> STEP7 <strong>von</strong> zentraler Bedeutung!<br />
Eine Beson<strong>der</strong>heit sind die Systembausteine SFC und SFB. Sie sind bereits in <strong>der</strong> jeweiligen CPU vorhanden. Alle<br />
an<strong>der</strong>en erfor<strong>der</strong>lichen Bausteine werden vom Programmierer erstellt o<strong>der</strong> in das <strong>S7</strong>-Programm importiert.<br />
Hinsichtlich des Inhalts können Bausteine unterschieden werden in<br />
• Codebausteine<br />
Diese enthalten Programmanweisungen (Code). Alle OB, FC, FB, SFC, SFB sind Codebausteine.<br />
• Datenbausteine (DB’s)<br />
enthalten Speicherplatz für Daten. Der Programmierer legt die Größe und Datenstruktur <strong>von</strong> DB’s fest. Auf die<br />
Daten kann man durch Anweisungen in Codebausteinen zugreifen. DB’s werden für die Speicherung <strong>von</strong><br />
statischen Variablen (Messwerte, Rezepturen, Regelparameter etc.) verwendet.<br />
Codebausteine können hinsichtlich des Programmablaufs in zwei Gruppen unterschieden werden.<br />
• Organisationsbausteine (OB’s) werden bei bestimmten Ereignissen vom Betriebssystem gestartet.<br />
• Alle an<strong>der</strong>en Codebausteine werden durch Anweisungen im Anwen<strong>der</strong>programm gestartet.<br />
2.2.1 Organisationsbausteine (OB‘s)<br />
OB‘s bilden die Schnittstelle zwischen dem SPS-Betriebssystem und dem Anwen<strong>der</strong>programm. Sie können nicht<br />
durch Programmanweisungen gestartet werden! Stattdessen wird <strong>der</strong> Start <strong>von</strong> OB’s beim Eintreten <strong>von</strong> festgelegten<br />
Ereignissen durch das CPU-Betriebssystem veranlasst.<br />
OB’s werden durch Systemereignisse ausgelöst!<br />
Die nachfolgende Tabelle zeigt eine Auswahl <strong>der</strong> wichtigsten OB’s mit den betreffenden Ereignissen und <strong>der</strong><br />
zugehörigen Priorität. Ein OB höherer Priorität unterbricht die Bearbeitung des OB mit niedrigerer Priorität. Am Ende<br />
des höherprioren OB’s wird die Bearbeitung des unterbrochenen OB’s fortgesetzt.<br />
Priorität OB-Nr Name Systemereignis<br />
niedrigste OB1 Zyklus am Zyklusende und nach dem Anlauf (Ende <strong>von</strong> OB100)<br />
OB10 Uhrzeitalarm definierte Uhrzeit o<strong>der</strong> Datum<br />
OB35 Weckalarm "Zeit-Interrupt" periodisch jeweils nach einer definierten Zeit<br />
OB40 Prozessalarm "I/O-Interrupt" bei bestimmten Signalen <strong>der</strong> I/O-Peripherie<br />
OB80 Zykluszeitfehler OB1-Zyklus überschreitet eine definierte Zeit<br />
OB100 Anlauf beim Anlauf <strong>der</strong> SPS, d.h. bei Stop=>Run<br />
höchste OB122 Baugruppenfehler wenn beim Baugruppenzugriff ein Fehler erkannt wird<br />
Am häufigsten wird in Anwen<strong>der</strong>programmen <strong>der</strong> OB1 (Zyklus) eingesetzt. Viele STEP7-Programme verwenden den<br />
OB1 sogar als einzigen OB. Wegen <strong>der</strong> niedrigen Priorität kann er durch alle Systemereignisse unterbrochen<br />
werden. Die höchste Priorität hat <strong>der</strong> OB122, <strong>der</strong> bei <strong>der</strong> Erkennung <strong>von</strong> Baugruppenfehlern sofort bearbeitet wird.<br />
Die Anzahl <strong>der</strong> verfügbaren OB’s hängt ab <strong>von</strong> den Leistungsdaten <strong>der</strong> verwendeten CPU. Beispielsweise kennt die<br />
kleinste CPU (CPU312 IFM) nur OB1, OB40 und OB100.<br />
Wenn ein bestimmtes Systemereignis eintritt, <strong>der</strong> Anwen<strong>der</strong> aber den betreffenden OB nicht erstellt hat, dann<br />
passiert folgendes: das System verzweigt auf die OB-Adresse, dort steht aber nichts, also wird <strong>der</strong> unterbrochene<br />
OB sofort weiterbearbeitet.<br />
Eine beliebte Fehlerquelle besteht darin, dass irgendein Baustein eigentlich zyklisch bearbeitet werden soll, aber im<br />
OB1 <strong>der</strong> betreffende Bausteinaufruf fehlt. Dann passiert nichts und <strong>der</strong> Programmierer wun<strong>der</strong>t sich.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 6
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.2.2 Funktion (Function, FC)<br />
Beim Aufruf können einer Funktion Parameter übergeben werden, am Ende kann die Funktion dem aufrufenden<br />
Baustein Parameter zurückliefern. Anzahl und Typen <strong>der</strong> Parameter werden bei <strong>der</strong> Erstellung <strong>der</strong> Funktion<br />
deklariert. Außerdem können temporäre Variable deklariert werden (z.B. für Zwischenergebnisse), <strong>der</strong>en Daten am<br />
Ende des FC allerdings verloren gehen. FC’s haben keinen Speicher für statische Variablen. Einzelheiten zu FC’s<br />
siehe Abschnitt 5.<br />
2.2.3 Datenbaustein (Data Block, DB)<br />
Datenbausteine sind strukturierte Datenspeicher, auf die durch Programmanweisungen in Codebausteinen<br />
zugegriffen werden kann. Bei <strong>der</strong> Erstellung eines DB wird die Datenstruktur festgelegt. Einzelheiten zu DB’s siehe<br />
Abschnitt 6.<br />
2.2.4 Funktionsbaustein (Function Block, FB)<br />
Beson<strong>der</strong>heit dieses Bausteintyps ist, daß beim Aufruf ein Datenbaustein angegeben werden muß, <strong>der</strong> <strong>der</strong><br />
aufgerufenen Instanz des FB als Speicher zur Verfügung steht. Daher können in FB’s statische Variablen deklariert<br />
werden, d.h. Variable, <strong>der</strong>en Daten am Ende des FB erhalten bleiben. Ansonsten bestehen diesselben Möglichkeiten<br />
wie bei FC’s. Einzelheiten zu FB’s siehe Abschnitt 7.<br />
2.2.5 Systemfunktion (SFC) und Systemfunktionsbaustein (SFB)<br />
Das sind spezielle Bausteine, die als Teil des Betriebssystems in die <strong>S7</strong>-CPU integriert sind. Man kann diese<br />
Bausteine mit Programmanweisungen starten und wie ganz normale FC’s o<strong>der</strong> FB’s behandeln. Es hängt <strong>von</strong> <strong>der</strong><br />
jeweiligen CPU ab, welche Systembausteine zur Verfügung stehen. Beispielsweise hat die kleinste CPU insgesamt<br />
27 SFC/SFB’s. Die Funktionen betreffen u.a. Uhrzeit, Betriebsstundenzähler, Blockbefehle zum Initialisieren o<strong>der</strong><br />
Kopieren <strong>von</strong> Variablen, Alarmbearbeitung, Diagnosefunktionen.<br />
2.3 Anwendungsbeispiel: Abfüllanlage<br />
Im Abschnitt 2.1 wurde am Beispiel einer Abfüllanlage gezeigt, wie aus <strong>der</strong> Anlagenfunktion die erfor<strong>der</strong>liche<br />
Steuerung in Teilaufgaben geglie<strong>der</strong>t werden kann. Nehmen wir an, die Bausteine werden zyklisch bearbeitet<br />
(Eingänge lesen, Verarbeitung, Ausgänge schreiben), könnte <strong>der</strong> Programmablauf etwa so aussehen wie im<br />
folgenden Bild.<br />
Programmablauf am Beispiel<br />
<strong>der</strong> Abfüllanlage<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 7
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Zusammenfassung: Vorteile durch geschickte Aufteilung des Programms in Bausteine<br />
• Geglie<strong>der</strong>te Lösung<br />
Ein in funktionelle Einheiten unterteiltes Programm ist leichter zu erstellen.<br />
Die Teillösungen können <strong>von</strong> mehreren Personen entwickelt werden (Teamarbeit).<br />
• Transparenz<br />
Ein aus Bausteinen bestehendes Programm ist einfacher zu dokumentieren und besser verstehbar<br />
• Variabler Ablauf<br />
Die Programmteile können übersichtlich durch Systemereignisse gestartet werden. Bearbeitungsreihenfolge läßt<br />
sich leicht än<strong>der</strong>n<br />
• Vorteile bei Test und Inbetriebnahme<br />
Die Bausteine können einzeln getestet und korrigiert werden<br />
• Kürzeres Programm<br />
Bausteine im Speicher können mehrfach verwendet werden<br />
• Fertige Lösungen verwendbar<br />
Wie<strong>der</strong>verwendung <strong>von</strong> Teillösungen, Einsatz <strong>von</strong> Standardfunktionen und Programmbibliotheken<br />
2.4 <strong>S7</strong>-Bibliotheken<br />
Bibliotheken unter STEP7 enthalten Bausteine, die zur Verwendung in das aktuelle Projekt kopiert werden können.<br />
Zur STEP7-Programmierumgebung gehören Standardbibliotheken. Diese enthalten u.a. Prototypen <strong>der</strong><br />
Systemfunktionen (SFC) und Systemfunktionsbausteine (SFB), Standardfunktionen für den Umgang mit IEC-<br />
Datentypen, Arithmetischen Berechnungen, sowie PID-Reglerbausteine. Man kann aus vorhandenen Bausteinen<br />
auch eigene Bibliotheken aufbauen.<br />
2.5 Netzwerke<br />
Die Codebausteine sind unterteilt in sogenannte „Netzwerke“ (NW). Unter FUP/KOP sind NW’s relativ kurz.<br />
Automatisch wird nämlich mit <strong>der</strong> ersten Zuweisungsoperation ein Netzwerkende veranlasst. Der Begriff ‘Netzwerk’<br />
kommt aus <strong>der</strong> Nachbildung eines elektrischen Stromkreises in <strong>der</strong> KOP-Darstellung.<br />
Unter AWL können NW’s ziemlich lang sein (ca. 2000 Zeilen), so dass umfangreiche Algorithmen kompakt in ein NW<br />
passen. Innerhalb eines Netzwerks kann die Programmiersprache nicht umgeschaltet werden! Ansonsten kann in<br />
einem Baustein mit unterschiedlichen Sprachen gearbeitet werden.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 8
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.6 Datentypen<br />
2.6.1 Elementare Datentypen<br />
Je<strong>der</strong> elementare Datentyp verfügt über einen zugeordneten Speicherplatz mit fester Länge. Der Datentyp BOOL<br />
zum Beispiel hat nur ein Bit, ein Byte (BYTE) besteht aus 8 Bits, ein Wort (WORD) sind 2 Bytes (bzw. 16 Bits), ein<br />
Doppelwort (DWORD) hat 4 Bytes (bzw. 32 Bits). Die folgende Tabelle zeigt alle elementaren Datentypen:<br />
Typ<br />
Anzahl<br />
Bit<br />
Beschreibung Wertebereich<br />
BOOL 1 Bit TRUE, FALSE<br />
BYTE 8 Byte 0 ... 255<br />
WORD 16 Wort 0 ... 65535 (2 16 -1)<br />
DWORD 32 Doppelwort 0 ... 2 32 -1<br />
CHAR 8 Zeichen druckbare Zeichen (ASCII-Code)<br />
INT 16 Ganzzahl 16 Bit -32768 ... +32767 (-2 15 ... +2 15 -1)<br />
DINT 32 Ganzzahl 32 Bit -2 31 ... + 2 31 -1 (ca. -2,1Mia...2,1Mia)<br />
REAL 32 IEEE Gleitpunktzahl -3,4E 38 ... 3,4E 38<br />
TIME 32 IEC-Zeit in Intervallen <strong>von</strong> 1 ms -2 31 + 2 31 -1 ms (ca. -24..24 Tage)<br />
DATE 16 IEC-Datum in Intervallen <strong>von</strong> 1 Tag 2 16 -1 Tage ab 1990-1-1<br />
TIME_OF_DAY 32 Tageszeit in 1ms-Intervallen, Mitternacht=0 Stunden(0..23) : Minuten(0..59) : Sekund.(0..59) : ms(0..999)<br />
S5TIME 16 SIMATIC Zeitformat, Intervalle <strong>von</strong> 10ms 0H_0M_0S_0MS ... 2H_46M_30S_0MS<br />
Schreibweise zum Eingeben <strong>von</strong> Daten<br />
STEP7 bietet mehrere Schreibweisen zum Eingeben <strong>von</strong> Daten. Je nach Datentyp sind die folgenden Schreibweisen<br />
erlaubt:<br />
Schreibweise Datentyp Beschreibung Beispiel (e)<br />
2# WORD Binäre Schreibweise 2#0001_0000_0000_1101<br />
DWORD Binäre Schreibweise 2#1000_1111_0101_1101_0010_0000_0000_1101<br />
True/False BOOL TRUE o<strong>der</strong> FALSE TRUE, FALSE<br />
B#(...) WORD Wert <strong>der</strong> einzelnen Bytes dezimal B#(10,255)<br />
DWORD Wert <strong>der</strong> einzelnen Bytes dezimal B#(100,114,2,10)<br />
B#16# BYTE Byte hexadezimal B#16#4F<br />
W#16# WORD Wort hexadezimal W#16#FF1B<br />
DW#16# DWORD Doppelwort hexadezimal DW#16#09A2_FF13<br />
Ganzzahl INT IEC-Ganzzahlformat mit Vorzeichen in Bit 15 -2270 32767<br />
L# DINT 32Bit Ganzzahlformat mit Vorzeichen in Bit 31 L#44520 L#-49245<br />
Gleitpunktzahl REAL IEC-Gleitpunktzahlenformat 3.14 1.234567e+13<br />
C# WORD 16Bit Zählerkonstante 0...999 C#500<br />
T# TIME T#TageD_StundH_MinutM_SekundS_MillisekMS T#0D_1H_10M_22S_100MS<br />
D# DATE D#Jahr-Monat-Tag D#1997-3-15<br />
TOD# TIME_OF_DAY TOD#Stunden:Minuten:Sekunden:Millisekunden TOD#13:24:33:555<br />
S5T# S5TIME S5T#TageD_StundH_MinutM_SekundS_MillisekMS S5T#12M_22S_100MS<br />
Beispiel:<br />
Es soll <strong>der</strong> Wert 137 dezimal für eine WORD-Variable eingegeben werden. Dann hat man folgende Möglichkeiten:<br />
W#16#89<br />
// Hexadezimale Schreibweise, wird am häufigsten verwendet<br />
2#0000_0000_1000_1001<br />
// Binäre Schreibweise<br />
B#(0,137)<br />
// Schreibweise mit aufeinan<strong>der</strong>folgenden Bytes<br />
C#137 // wird nur im Zusammenhang mit Zählern verwendet<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 9
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.6.2 Zusammengesetzte Datentypen<br />
Zusammengesetzte Datentypen bestehen aus 2 o<strong>der</strong> mehreren elementaren Datentypen.<br />
2.6.2.1 ARRAY<br />
Ein ARRAY (Feld) verknüpft mehrere gleiche Datentypen zu einer Einheit. Es sind auch mehrdimensionale Arrays<br />
möglich.<br />
Syntax: ArrayName ARRAY [1..10, 1..2] of Datentyp // Kommentareile, zweidimensionales Array<br />
Der Zugriff auf die Variable erfolgt in <strong>der</strong> Schreibweise: #ArrayName [i,k]<br />
Beispiel: ARRAY deklarieren und verwenden<br />
2.6.2.2 STRUCT<br />
Ein STRUCT (Struktur) verknüpft verschiedene Datentypen zu einer Einheit.<br />
Syntax: StructName STRUCT // Kommentarzeile zur Struktur<br />
Data1 Datentyp1<br />
Data i Datentyp i<br />
END_STRUCT<br />
Der Zugriff auf die Elemente erfolgt in <strong>der</strong> Schreibweise #Strukturname.Feldname (z.B. #Messwert.Temperatur).<br />
Beispiel: STRUCT deklarieren und verwenden<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 10
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
STRING<br />
Eine Zeichenkette (STRING) ist ein eindimensionales ARRAY mit CHAR-Datentypen. Die Feldgrösse beträgt<br />
maximal 254 Zeichen.<br />
2.6.3 Parametertypen<br />
Mit den sogenannten ‚Parametertypen’ können beim Aufruf einer Funktion (FC) o<strong>der</strong> eines Funktionsbausteins (FB)<br />
bestimmte Timer, Zähler, Baustein-Nummern, Adressen o<strong>der</strong> sogar Datenbereiche des Systemspeichers übergeben<br />
werden.<br />
Parametertyp Größe Beschreibung Format (Beispiele)<br />
TIMER 2 Byte übergibt einen bestimmten Timer T10<br />
COUNTER 2 Byte übergibt einen bestimmten Zähler Z3<br />
BLOCK_FC 2 Byte übergibt eine bestimmte Funktion F10<br />
BLOCK_FB 2 Byte übergibt einen bestimmten FB FB3<br />
BLOCK_DB 2 Byte übergibt einen bestimmten DB DB10<br />
BLOCK_SDB 2 Byte übergibt einen bestimmten SDB SDB1<br />
POINTER 6 Byte übergibt einen Zeiger auf einen Absoluten Operanden des P#E3.1 P#A12.0<br />
Systemspeichers. Der Inhalt entspricht <strong>der</strong> Operanden- P#M100.3<br />
anfangsadresse<br />
ANY 10 Byte übergibt einen Datenbereich im Systemspeicher. ANY zeigt P#E 1.0 BYTE 10<br />
auf einen Absoluten Operanden des Systemspeichers und P#M 100.0 WORD 3<br />
gibt außerdem eine bestimmte darauf folgende Datenmenge an<br />
Die Parametertypen sind notwendig für die Kapselung <strong>von</strong> Funktionen o<strong>der</strong> Funktionsbausteinen!<br />
Auch STEP7-Einsteiger benötigen deshalb die Parametertypen TIMER, COUNTER und BLOCK_…, mit POINTER<br />
brauchen sie sich aber zunächst nicht herumschlagen.<br />
Im Abschnitt 2.7.3 wird an einem Beispiel die Verwendung eines Timers innerhalb einer Funktion gezeigt<br />
Ein Beispiel für ANY finden Sie im Abschnitt 2.9.3<br />
2.6.4 Anwen<strong>der</strong>definierter Datentyp (UDT)<br />
Es können auch eigene Datentypen, sogenannte „User Defined Types“ (UDT‘s), definiert werden. Sie bestehen aus<br />
Zusammensetzungen <strong>von</strong> Datentypen und gelten im gesamten <strong>S7</strong>-Programm. Der Aufwand eigener Datentypen<br />
lohnt sich aber nur, wenn in einem STEP7-Projekt viele Variablen gleichen Typs benötigt werden.<br />
Anwen<strong>der</strong>definierte Datentypen (UDT’s) gelten im gesamten <strong>S7</strong>-Programm!<br />
UDT’s werden im STEP7-Manager erstellt mit: Einfügen ⇒ <strong>S7</strong>-Baustein ⇒ Datentyp.<br />
Dort ist eine entsprechende Typdeklaration für den betreffenden UDT, z.B. UDT10, zu erstellen.<br />
Die Deklaration <strong>von</strong> Variablen dieses Typs ‚UDT10’ erfolgt dann im Deklarationsteil <strong>der</strong> betreffenden Bausteine.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 11
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.7 Variable<br />
Der Umgang mit Variablen und Adressen bei STEP7 unterscheidet sich <strong>von</strong> den Festlegungen <strong>der</strong> IEC 61131-3.<br />
Während IEC-Programmierer im Allgemeinen nicht daran interessiert sind, an welcher Adresse eine Variable im<br />
Speicher repräsentiert ist, kann <strong>der</strong> STEP7-Programmierer aus seinem Wissen über die Speicheraufteilung Nutzen<br />
ziehen und manche Probleme elegant lösen. Allerdings haben es STEP7-Einsteiger zunächst etwas schwerer.<br />
Was sind eigentlich Variable?<br />
Einige allgemein gültige Überlegungen sollen den Blick auf die Belange <strong>von</strong> STEP7 schärfen:<br />
Variable o<strong>der</strong> ganz allgemein „Datenobjekte“ bezeichnen mit ihrem Namen eine bestimmte Menge <strong>von</strong><br />
Speicherplatz. Unter dem Variablennamen können die dort liegenden Daten benutzt werden. Im Gegensatz dazu<br />
stehen Konstante, die keinen Speicherplatz haben und <strong>der</strong>en Wert im Programmcode festgelegt ist, weil er sich<br />
sowieso nie än<strong>der</strong>t.<br />
Somit ist ein erstes Kennzeichen für Variable <strong>der</strong> zugehörige Datentyp, <strong>der</strong> die erfor<strong>der</strong>liche Menge an Speicherplatz<br />
kennzeichnet. Ein an<strong>der</strong>es Kriterium ist die Aktualisierungsrate <strong>von</strong> Variablen, die sich aus dem Programmablauf<br />
ergibt und <strong>von</strong> Systemereignissen abhängig ist (siehe Abschnitt 8).<br />
Wichtig ist auch <strong>der</strong> Gültigkeitsbereich, innerhalb dessen eine Variable dem Programm bekannt ist. Dies führt zum<br />
Begriff einer Globalen bzw. Lokalen Variable.<br />
2.7.1 Globale Variable<br />
Globale Variable sind überall im Programm bekannt. Tatsächlich könnte man in jedem Codebaustein lesend o<strong>der</strong><br />
schreibend auf sie zugreifen – aber man sollte es nicht tun!<br />
Globale Variable nur in Organisationsbausteinen (OB) verwenden!<br />
Dies för<strong>der</strong>t die Übersichtlichkeit <strong>von</strong> Programmen, vermeidet Programmfehler und unterstützt die<br />
Wie<strong>der</strong>verwertbarkeit <strong>von</strong> Bausteinen.<br />
Es gibt folgende Arten <strong>von</strong> Globalen Variablen:<br />
a) Absolute Operanden<br />
Diese haben einen festen Namen und werden nirgends deklariert, da sie im Systemspeicher <strong>der</strong> CPU eine feste<br />
Adresse haben. Die Anzahl <strong>der</strong> verfügbaren Absoluten Operanden ist daher abhängig <strong>von</strong> <strong>der</strong> Hardwarebestückung<br />
<strong>der</strong> betreffenden <strong>S7</strong>-Station (verwendete CPU, Ein- und Ausgabebaugruppen etc.).<br />
Die Absoluten Operanden verweisen mit ihrem Namen auf einen bestimmten Bereich des Systemspeichers.<br />
Beispielsweise haben sämtliche Namen, die mit ‚E’ beginnen, mit dem Prozessabbild <strong>der</strong> Eingänge zu tun, d.h. diese<br />
Operanden speichern die Zustände <strong>der</strong> Eingangsperipherie.<br />
Es gibt folgende Bereiche im Systemspeicher (s.a. Abschn. 2.8):<br />
Bereichskennung<br />
E<br />
A<br />
M<br />
Z<br />
T<br />
L<br />
P<br />
D<br />
Erklärung<br />
Prozessabbild <strong>der</strong> Eingänge (PAE)<br />
Prozessabbild <strong>der</strong> Ausgänge (PAA)<br />
Speicherbereich für Merker<br />
Speicherbereich für Zähler<br />
Speicherbereich für Timer<br />
Lokaldatenstack<br />
Peripheriedaten<br />
Daten <strong>von</strong> Datenbausteinen<br />
Namensaufbau für Operanden <strong>der</strong> Speicherbereiche E, A, M, L<br />
Der Name enthält Bereichskennung, Datentyp und die Startadresse (=Bytenummer, weil <strong>der</strong> Speicher Byteorientiert<br />
aufgebaut ist).<br />
Syntax allgemein: Bereichskennung Datentyp Bytenummer Beispiel: EB 10<br />
B = Byte<br />
W= Wort<br />
D= Doppelwort<br />
Ausnahme für Bitdaten: Bereichskennung Bytenummer.Bitnummer Beispiel: E 1.0<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 12
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Beispiele:<br />
Operand sprich Erklärung<br />
E 1.0 „E 1 punkt 0“ Bit 0 (nie<strong>der</strong>wertigstes Bit) <strong>von</strong> Byte 1 im Prozessabbild <strong>der</strong> Eingänge<br />
E 3.7 „E 3 punkt 7“ Bit 7 (höchstwertigstes Bit) <strong>von</strong> Byte 3 im Prozessabbild <strong>der</strong> Eingänge<br />
EB 10 „Eingangsbyte 10“ Byte 10 im Prozessabbild <strong>der</strong> Eingänge<br />
EW 20 „Eingangswort 20“ Wort 20 im Prozessabbild <strong>der</strong> Eingänge<br />
ED 40 „Eingangsdoppelwort 40“ Doppelwort 40 im Prozessabbild <strong>der</strong> Eingänge<br />
Namensaufbau für Operanden <strong>der</strong> Speicherbereiche Z, T (Zähler und Timer)<br />
Der Name erhält Bereichskennung und eine Nummer<br />
Beispiele: Z10, T3<br />
Namensaufbau für Operanden des Speicherbereichs P (Peripheriedaten)<br />
Der Name beginnt mit PE ( Eingangsperipherie) bzw. PA (Ausgangsperipherie, gefolgt <strong>von</strong> Datentyp und <strong>der</strong><br />
Startadresse (=Bytenummer, weil <strong>der</strong> Spoeicher Byteorientiert aufgebaut ist).<br />
Syntax Eingangsperipherie: PE Datentyp Bytenummer Beispiele: PEB 2, PEW10, PED 4<br />
Syntax Ausgangsperipherie: PA Datentyp Bytenummer Beispiele: PAB 2, PAW10, PAD 4<br />
B=Byte<br />
W=Wort<br />
D=Doppelwort<br />
Namen <strong>von</strong> Bausteinen und Anwen<strong>der</strong>definierten Datentypen (UDT’s) sind ebenfalls Absolute Operanden!<br />
Beispiele: OB1, FC10, FB1, DB3, SFC10, SFB3, UDT3<br />
b) Symbole<br />
Symbole erleichtern den Umgang mit absoluten Operanden, weil sie anwen<strong>der</strong>definierte Bezeichnungen haben. Sie<br />
sind sind aber nichts an<strong>der</strong>es als nur eine an<strong>der</strong>e Schreibweise für Absolute Operanden! Man definiert in einer<br />
sogenannten „Symboltabelle“ eigene aussagekräftige Symbolnamen, z.B.<br />
Symbol Adresse Datentyp Kommentar<br />
Aus E1.3 BOOL Taster für Ausschalten <strong>der</strong> Maschine<br />
Nun kann auf den Absoluten Operanden mit <strong>der</strong> symbolischen Bezeichnung „Aus“ (in Anführungszeichen „...“ !!) o<strong>der</strong><br />
nach wie vor mit E1.3 zugegriffen werden.<br />
Symboldefinitionen gelten für das gesamte <strong>S7</strong>-Programm!<br />
c) Datenbausteine (DB)<br />
Ein Datenbaustein (DB) ist ein vom Programmierer festgelegter Speicher. Bei <strong>der</strong> Erstellung eines DB deklariert man<br />
die enthaltenen Variablen. Daraus ergibt sich die Datenstruktur des DB. Formal kann man überall im <strong>S7</strong>-Programm<br />
auf alle Datenbausteine schreibend und lesend zugreifen. Man sollte dies aber aus Gründen besserer<br />
Übersichtlichkeit und zur Fehlervermeidung nicht tun!<br />
Selbstverständlich dürfen innerhalb eines Funktionsbausteins Zugriffe auf den Instanz-DB – <strong>der</strong> ja das eigene<br />
Gedächtnis bildet – je<strong>der</strong>zeit erfolgen.<br />
Ebenfalls erlaubt sind innerhalb einer Funktion o<strong>der</strong> eines Funktionsbausteins Zugriffe auf einen „Globalen<br />
Datenbaustein“. Voraussetzung ist aber, daß <strong>von</strong> Außen erkennbar ist, welcher Datenbaustein verwendet wird.<br />
In FC’s und FB’s keine „heimlichen“ Zugriffe auf Datenbausteine, die <strong>von</strong> Außen nicht erkennbar sind!<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 13
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.7.2 Lokale Variable<br />
Lokale Variable gelten nur in dem Code-Baustein (OB,FC,FB), in dem sie deklariert sind.<br />
Sie sind ganz spezielle Freunde <strong>von</strong> IEC-Programmierern und ermöglichen die Erstellung <strong>von</strong> wie<strong>der</strong>verwendbaren<br />
Programmbausteinen.<br />
Funktionen (FB) und Funktionsbausteine (FB) können nach Außen hin gekapselt werden, so dass dem Benutzer nur<br />
die Schnittstelle sichtbar ist.<br />
Vorteil <strong>der</strong> Kapselung ist zunächst, dass <strong>der</strong> Baustein für sich alleine getestet werden kann. Sobald <strong>der</strong> betreffende<br />
Baustein fehlerfrei arbeitet, kann er ohne weiteres auch in an<strong>der</strong>en Programmen wie<strong>der</strong>verwendet werden. Es ist<br />
auch möglich, ihn in eine <strong>S7</strong>-Bibliothek einzustellen o<strong>der</strong> ihn an an<strong>der</strong>e zu verkaufen. In diesem Fall ist eine<br />
Verschlüsselung des Innenlebens angebracht (Bausteineigenschaft ‚KnowHow-Schutz’ einstellen).<br />
Selbstverständlich ist neben einer sinnvollen Schnittstelle auch eine gute Dokumentation notwendig, damit <strong>der</strong><br />
Baustein wie<strong>der</strong>verwendet werden kann.<br />
Es gilt als Zeichen <strong>von</strong> sehr schlechtem Programmierstil, innerhalb <strong>von</strong> FB’s o<strong>der</strong> FC’s auf globale Variable<br />
zuzugreifen. Dadurch können Programmfehler nur sehr schwer gefunden werden und eine Wie<strong>der</strong>verwendung des<br />
Bausteins ist ausgeschlossen!<br />
Regel:<br />
Niemals innerhalb <strong>von</strong> FB o<strong>der</strong> FC Absolute Operanden verwenden!<br />
Am Anfang jedes Code-Bausteins (OB, FC, FB) deklariert man in einem Variablenfenster Lokale Variable. Innerhalb<br />
des Bausteins kann man durch Programmanweisungen auf die Lokalen Variablen zugreifen.<br />
Beispiel: Deklaration <strong>von</strong> Lokalen Variablen<br />
Wie erkennbar ist, hat dieser Baustein die beiden Eingänge x1 vom Typ INT und x2 vom Typ BYTE. Beim<br />
Bausteinaufruf müssen Eingangsdaten vom entsprechenden Typ übergeben werden. Falls beim Bausteinaufruf die<br />
Eingänge nicht beschaltet werden, gelten die deklarierten Anfangswerte, also hier x1=0 und x2=0.<br />
Bei <strong>der</strong> Deklaration erhalten die Lokalen Variablen automatisch irgendwelche interne Adressen. Beim<br />
Programmieren innerhalb des Bausteins braucht man aber die Adressen nicht, son<strong>der</strong>n kann zum Zugriff direkt die<br />
Variablennamen verwenden. Dies finden IECProgrammierer ganz normal, alte STEP7-Programmierer hingegen<br />
freuen sich.<br />
Die nachfolgende Tabelle zeigt mögliche Variablentypen bei den verschiedenen Codebausteinen (OB, FC, FB).<br />
Typ Beschreibung kommt vor in: OB FC FB<br />
IN Eingang nein ja ja<br />
OUT Ausgang nein ja ja<br />
IN_OUT Durchgang nein ja ja<br />
STAT Statisch nein nein ja<br />
TEMP Temporär ja ja ja<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 14
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Ein OB besitzt nur TEMP- (temporäre) Variable!<br />
Auf den ersten Blick erscheint es seltsam, dass ein OB nur TEMP-Variable besitzt. Der Grund liegt darin, dass die<br />
einzige Schnittstelle eines OB diejenige zum Betriebssystem ist. Ein OB kann nicht durch Programmanweisungen<br />
aufgerufen werden, son<strong>der</strong>n wird automatisch durch ein Systemereignis gestartet (siehe 2.2.1). Das Betriebssystem<br />
übergibt dem OB beim Aufruf jeweils einige Daten (z.B. Startzeitpunkt). Hierfür benötigt <strong>der</strong> OB entsprechende<br />
TEMP- (temporäre) Variable, die beim Erstellen des OB automatisch vom Bausteineditor deklariert werden.<br />
STAT- (statische) Variable kommen nur in FB’s vor!<br />
Der Grund liegt darin, dass FB’s ein zugeordnetes „Gedächtnis“ in Form eines Instanzdatenbausteins (Instanz-DB)<br />
besitzen. Die an<strong>der</strong>en Codebausteine (OB, FC) besitzen keinen zugeordneten Speicher, können sich also auch<br />
nichts merken!<br />
Hinsichtlich <strong>der</strong> Zugriffsmöglichkeit auf lokale Variable gilt:<br />
Typ Beschreibung Zugriff<br />
IN Eingang nur Leseoperation möglich<br />
OUT Ausgang nur Schreiboperation möglich<br />
IN_OUT Durchgang Lese- und Schreiboperationen möglich<br />
STAT Statisch Lese- und Schreiboperationen möglich<br />
TEMP temporär Lese- und Schreiboperationen möglich<br />
Auf einen Eingang kann also nicht geschrieben werden. Sinnvoll, o<strong>der</strong>?<br />
Hinsichtlich <strong>der</strong> Lebensdauer <strong>von</strong> lokalen Variablen gilt:<br />
Typ Beschreibung Lebensdauer<br />
IN Eingang bei FB: wie statische Variable bei FC: wie temporäre Variable<br />
OUT Ausgang bei FB: wie statische Variable bei FC: wie temporäre Variable<br />
IN_OUT Durchgang bei FB: wie statische Variable bei FC: wie temporäre Variable<br />
STAT statisch Statische Variable werden im Instanz-DB gespeichert (gibt es nur bei FB)<br />
Die Daten bleiben nach Bausteinbearbeitung erhalten!<br />
TEMP temporär Temporäre Variable gelten nur während <strong>der</strong> Bausteinbearbeitung<br />
danach wird <strong>der</strong> Speicherplatz (Lokaldaten-Stack) wie<strong>der</strong> freigegeben!<br />
TEMP-Variable eignen also gut dafür, irgendwelche Zwischenergebnisse innerhalb des Bausteins zu speichern.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 15
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.7.3 Anwendungsbeispiel: Wie verwende ich innerhalb einer Funktion einen Timer?<br />
Problem:<br />
Innerhalb einer Funktion soll ein Timer benutzt werden. Bekanntermaßen ist <strong>der</strong> Name eines bestimmten Timers,<br />
z.B. T10 ein absoluter Operand, soll also nicht innerhalb <strong>von</strong> FC’s o<strong>der</strong> FB’s verwendet werden (siehe Abschnitt<br />
2.7.1).<br />
Lösung:<br />
Man verwendet in <strong>der</strong> Bausteinschnittstelle eine Lokale Variable vom Typ „TIMER“ (siehe Abschnitt 2.6.3<br />
Parametertypen) und übergibt bei den Absoluten Operanden T10 erst beim Funktionsaufruf ..<br />
Deklaration einer Eingangsvariablen<br />
mit dem<br />
Namen Timer1 vom<br />
Typ „TIMER<br />
Verwendung des<br />
Timers<br />
Übergabe vom Timer<br />
T10 beim Funktionsaufruf<br />
in einem OB.<br />
Vorteil: Von Außen sieht man, welche Ressourcen innerhalb <strong>der</strong> Funktion verwendet werden!<br />
Frage: Was könnte passieren, wenn innerhalb <strong>der</strong> Funktion FC1 direkt auf T10 zugegriffen wird?<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 16
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.8 Systemspeicher in <strong>der</strong> CPU<br />
Als Bindeglied zwischen Betriebssystem und Anwen<strong>der</strong> gibt es in <strong>der</strong> CPU <strong>der</strong> <strong>S7</strong>-Station den Systemspeicher.<br />
Sowohl das Betriebssystem als auch das Anwen<strong>der</strong>programm greifen auf den Systemspeicher zu.<br />
Beispielsweise sorgt das System für eine zyklische Aktualisierung <strong>der</strong> Prozessabbil<strong>der</strong> <strong>von</strong> Ein- und Ausgängen und<br />
für die Aktualisierung <strong>von</strong> Timern.<br />
Der Systemspeicher ist in bestimmte Bereiche unterteilt: Prozessabbild <strong>der</strong> Eingänge (E), Prozessabbild <strong>der</strong><br />
Ausgänge (A), Merker (M), Timer (T), Zähler (Z), Daten (D), Lokaldaten (L), Eingangsperipherie (PE) und<br />
Ausgangsperipherie (PA).<br />
Prinzipiell kann man auf alle Bereiche dieses Speichers durch Programmanweisungen lesend und schreibend<br />
zugreifen. Bei den Peripheriedaten gibt es eine verständliche Ausnahme: PE kann nur gelesen, PA nur geschrieben<br />
werden.<br />
Die folgende Tabelle zeigt die Aufteilung des Systemspeichers. Die Menge <strong>der</strong> verfügbaren Operanden (d.h. die<br />
Größe des Systemspeichers) ist abhängig <strong>von</strong> <strong>der</strong> jeweiligen CPU. Als Beispiel sind in <strong>der</strong> Tabelle die verfügbaren<br />
Operanden für die kleinste CPU <strong>der</strong> Reihe <strong>S7</strong>-300 dargestellt.<br />
Speicherbereich<br />
Zugriff über Einheiten <strong>der</strong><br />
folgenden Größe<br />
<strong>S7</strong>-<br />
Notation<br />
Beschreibung<br />
Verfügbar bei CPU 312 IFM<br />
PAE Eingang (Bit) E PAE ist ein Speicherbereich, <strong>der</strong> vom Betriebs- E0.0...31.7, E124.0...127.7<br />
Prozeßabbild EingangsByte EB system jeweils vor Beginn des OB1-Zyklus mit EB0...31, EB124...127 *)<br />
<strong>der</strong> Eingänge EingangsWort EW den Daten <strong>der</strong> Eingabebaugruppen beschrieben EW0...30, EW124...126<br />
EingangsDoppelwort ED wird. ED0...28, ED124<br />
PAA Ausgang (Bit) A PAA ist ein Speicherbereich, dessen Daten vom A0.0...31.7, A124.0...127.7<br />
Prozeßabbild AusgangsByte AB Betriebssystem jeweils nach Ende des OB1- AB0...31, AB124...127 *)<br />
<strong>der</strong> Ausgänge AusgangsWort AW Zyklus an die Ausgabebaugruppen geschrieben AW0...30, AW124...126<br />
AusgangsDoppelwort AD werden. AD0...28, AD124<br />
Merker Merker (Bit) M Anwen<strong>der</strong> - Speicherbereich M0.0...M127.7<br />
MerkerByte MB MB0... MB127<br />
MerkerWort MW MW0...MW126<br />
MerkerDoppelwort MD MD0... MD124<br />
Zeiten Zeiten T Speicherbereich, in den vom Betriebssystem Z0... Z31<br />
Zeitwerte geschrieben werden<br />
Zähler Zähler Z Speicherbereich für Zähler T0 ... T63<br />
Datenbausteine,<br />
adressiert mit<br />
Datenbaustein, geöffnet mit<br />
Operation "AUF DB"<br />
DB<br />
Datenbausteine werden im Anwen<strong>der</strong>programm<br />
erstellt in Größe und Datenstruktur. Sie können<br />
DB 1... DB 63<br />
DB-Register DatenBit DBX entwe<strong>der</strong> so definiert sein, daß alle Codebau- DBX 0.0 ... DBX 6143.7<br />
DatenByte DBB steine auf sie zugreifen können (Globale DB) DBB 0 ... DBB 6143<br />
DatenWort DBW o<strong>der</strong> sie sind einem bestimmten FB o<strong>der</strong> SFB DBW 0... DBW 6142<br />
DatenDoppelwort DBD zugeordnet (Instanz-DB). DBD 0 ... DBD 6140<br />
Datenbausteine, Datenbaustein, geöffnet mit<br />
Durch zwei Register <strong>der</strong> CPU (DB-, DI-Register)<br />
DI<br />
adressiert mit Operation "AUF DI"<br />
können gleichzeitig zwei Datenbausteine<br />
DI 0 ... DI 63<br />
DI-Register DatenBit DIX adressiert werden. DIX 0.0 ... DIX 6143.7<br />
DatenByte DIB DIB 0 ... DIB 6143<br />
DatenWort DIW DIW 0 ... DIW 6142<br />
DatenDoppelwort DID DID 0 ... DID 6140<br />
Lokaldaten LokaldatenBit L Speicherbereich für temporäre Daten eines L 0.0 ... L 255.7<br />
"Lokaldaten-Stack" LokaldatenByte LB Codebausteins. Der Aufbau des jeweiligen LB 0 ... LB 255<br />
o<strong>der</strong> "L-Stack" LokaldatenWort LW Lokaldaten-Stacks ergibt sich aus <strong>der</strong> LW 0 ... LW 254<br />
LokaldatenDoppelwort LD zugehörigen Deklarationstabelle LD 0 ... LD 252<br />
Peripheriebereich PeripherieEingangsByte PEB Speicherbereich, <strong>der</strong> direkt mit den Daten <strong>der</strong> PEB0..31, PEB124..127, PEB256..383<br />
Eingänge PeripherieEingangsWort PEW Ein-/Ausgabebaugruppen in Verbindung steht. PEW0..30, PEW124..126, PEW256..382<br />
PeripherieEing.Doppelwort PED Durch Zugriff auf Daten des Peripheriebereichs PED0..28, PED124, PED256..380<br />
Peripheriebereich PeripherieAusgangsByte PAB können die Ein/Ausgabebaugruppen unabhängig PAB0..31, PAB124..127, PAB256..383<br />
Ausgänge PeripherieAusgangsWort PAW vom OB1-Zyklus erreicht werden. PAW0..30, PW124..126, PAW256..382<br />
PeripherieAusgDoppelwort PAD PAD0..28, PAD124, PAD256..380<br />
*) die CPU312IFM besitzt Onboard-Peripherie, die EB124..127 und AB124..127 zugeordnet ist<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 17
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.8.1 Remanenz<br />
Normalerweise gehen Daten im Speicherbereich Merker, Zeiten, Zähler bei Spannungsausfall <strong>der</strong> CPU verloren.<br />
Außerdem werden beim Anlauf <strong>der</strong> CPU (Übergang STOP→RUN) diese Daten in einen definierten Zustand gesetzt.<br />
Durch Konfiguration <strong>der</strong> CPU kann man aber einen kleinen Teil <strong>der</strong> Merker, Zeiten, Zähler als „remanent“ festlegen.<br />
Remanente Daten bleiben bei Spannungsausfall o<strong>der</strong> beim Anlauf <strong>der</strong> CPU (Übergang STOP → RUN) erhalten.<br />
2.9 Adressierung<br />
2.9.1 Direkte Adressierung<br />
Normalerweise wird in STEP7 die direkte Adressierung verwendet, d.h. als Operand wird einfach <strong>der</strong> betreffende<br />
Variablenname eingetragen. Eine indirekte Adressierung ist in FUP und KOP auch gar nicht vorgesehen.<br />
Zur Kennzeichnung <strong>von</strong> Lokalen Variablen trägt man vor den Namen das Zeichen ‚#’ ein. Bei <strong>der</strong> Verwendung <strong>von</strong><br />
Symbolen muss zur Unterscheidung die Symbolbezeichnung „in Anführungszeichen“ stehen!<br />
Beispiele für direkte Adressierung in AWL<br />
// Zugriff auf Lokale Variable<br />
U #Eingang1 //nur für BOOL<br />
L #Anzahl //BYTE, WORD, DWORD, S5Time, ….<br />
L #Messung.Temperatur //STRUCT<br />
L #Data[10] //ARRAY<br />
// Zugriff auf Absolute Operanden<br />
U E1.3 //Eingang 1.3<br />
L AB10 //Ausgangsbyte 10<br />
L MW100 //Merkerwort 100<br />
L T1 //Zeit <strong>von</strong> Timer 1<br />
// Zugriffe auf Symbole <strong>von</strong> Absoluten Operanden<br />
U „Aus_Taste“ //Namen in „!!!“<br />
L „Tasten“<br />
L „Sensoren“<br />
Zugriff auf Lokale Variable in FUP<br />
Zugriff auf Lokale Variable in KOP<br />
Absolute Operanden und Symbole in FUP<br />
Absolute Operanden und Symbole in KOP<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 18
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.9.2 Indirekte Adressierung<br />
Indirekte Adressierung ist nur unter AWL verfügbar. Es wird eine Speicherstelle bezeichnet, in <strong>der</strong> die eigentliche<br />
Adresse des Operanden abgelegt ist.<br />
Beispiele für Indirekte Adressierung:<br />
U A [MD 12] // UND-Operation; die Adresse des Ausgangs steht in MD12<br />
SI T [MW8] // Starte Timer; die Timer-Nummer steht in MW8<br />
2.9.3 Adressierung mit Pointer<br />
Pointer o<strong>der</strong> Zeiger enthalten die Adresse des Datenobjekts, auf das sie zeigen. Daher kann man Pointer sehr schön<br />
nutzen, um durch den Speicher zu wan<strong>der</strong>n. Dazu braucht man lediglich den Wert des Pointers verän<strong>der</strong>n. Wenn<br />
man beispielsweise innerhalb einer Programmschleife den Pointerinhalt ständig erhöht, hat man nacheinan<strong>der</strong> eine<br />
zusammenhängende Datenmenge im Speicher adressiert.<br />
Unter AWL bestehen interessante Möglichkeiten, wie mit Zeigern und Adressen unter Zuhilfenahme <strong>von</strong><br />
Adressregistern gerechnet werden kann. Dies ist jedoch nur für sehr wenige Anwendungen nötig und erfor<strong>der</strong>t<br />
spezielles Wissen in STEP7.<br />
Wir beschränken uns deshalb auf die Anwendung im Zusammenhang mit dem Parametertyp ANY. Der Typ ANY tritt<br />
häufig auf, wenn Standardfunktionen aus <strong>S7</strong>-Bibliotheken benutzt werden sollen. Mit ANY kann „irgendein“ Datentyp<br />
o<strong>der</strong> ein Datenblock (d.h. ein zusammenhängen<strong>der</strong> Speicherbereich) übergeben werden (siehe auch Abschnitt<br />
2.6.3).<br />
Syntax für ANY: p# Bereichskennung Anfangs-Byte.Bit Datentyp Wie<strong>der</strong>holfaktor<br />
Beispiele: p# M 50.0 Byte 10 // 10 Bytes im Speicherbereich Merker MB 50... MB 59<br />
p# A 10.0 BOOl 4 // 4 Bit im Speicherbereich Ausgänge A 10.0.... A 10.3<br />
p# DB 10. DBX5.0 S5TIME 3 // 3 Daten vom Typ S5TIME, die in DB10 gespeichert sind<br />
// und zwar in DB10 Byte 5 ... 10<br />
Beispiel: Verwendung <strong>der</strong> Systemfunktion SFC20 „BLKMOV“ unter FUP<br />
Die Systemfunktion SFC20 „BLKMOV“ (Block-Move) kopiert einen Quelldatenblock (SRCBLK) in einen Zieldatenblock<br />
(DSTBLK)t. Im Beispiel werden 16 Byte vom Prozessabbild <strong>der</strong> Eingänge ab E1.0 in den Merkerbereich ab<br />
M10.0 kopiert. Der Ausgang RET_VAL gibt eine Information über das Gelingen <strong>der</strong> Operation aus.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 19
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
2.9.4 Adresszusammenhang Bit, Byte, Wort, Doppelwort<br />
Es ist wichtig zu wissen, wie Datentypen im Systemspeicher angeordnet sind. Es gibt nämlich keine getrennten<br />
Speicherbereiche für Bits, Bytes, Worte o<strong>der</strong> Doppelworte!<br />
Dies eröffnet dem STEP7-Programmierer bei <strong>der</strong> Verwendung <strong>von</strong> Absoluten Operanden (o<strong>der</strong> Symbolen) einige<br />
elegante Operationen, stellt aber für Einsteiger eine ernstzunehmende Gefahr dar, die zu schweren<br />
Programmierfehlern führen kann!<br />
Die folgende Tabelle zeigt, wie die verschiedenen Datentypen miteinan<strong>der</strong> verzahnt sind:<br />
Angenommen, es handelt sich um Operanden aus dem Merkerbereich. Dann lassen sich aus <strong>der</strong> Tabelle<br />
beispielsweise folgende Werte für die Operanden ablesen:<br />
BOOL: M10.0 =1; M 10.1 =1; ... M 10.7 =0; ... usw ... M13.0 =1; M13.1 =0; ... M13.7 =0<br />
BYTE: MB 10 = 17 Hex; MB 11 = 07 Hex; MB 12 = F0 Hex; MB 13 = 41 Hex<br />
WORD: MW 10 = 1707 Hex MW 11 = 07F0 Hex MW12 = F041 Hex<br />
DWORD: MD 10 = 1707F041 Hex<br />
Der Systemspeicher ist also Byteweise organisiert: Binäre Operanden sind auf das jeweilige Byte bezogen, in dem<br />
sie vorkommen und die Nummer <strong>von</strong> Wörtern und Doppelwörtern bezieht sich auf das höchstwertigste Byte!<br />
Das folgende Beispiel zeigt, wie diese Verzahnung <strong>von</strong> Datentypen sinnvoll verwendet werden kann.<br />
Beispiel: Es sollen 16 Bit Eingangsdaten parallel Ausgangsdaten zugewiesen werden<br />
Angenommen, die Eingangsdaten sind: E11. 0 ...<br />
E12.7 und die Ausgangsdaten sind: A0.0 ... A1.7<br />
Die Operanden sind wie nebenstehend im<br />
Speicher angeordnet. Daher kann wie folgt parallel<br />
zugegriffen werden:<br />
Vorsicht Programmierfehler!<br />
Die oben beschriebene Mehrfachnutzung <strong>von</strong> Speicherplatz für unterschiedliche Datentypen führt bei STEP7-<br />
Einsteigern häufig zu Programmierfehlern! Da beispielsweise die Merker M10.0...M10.7 Untermengen <strong>von</strong> MB10<br />
sind, verän<strong>der</strong>t man durch Schreibzugriff auf MB10 auch automatisch diese Merker. Ebenso verän<strong>der</strong>t man durch<br />
Schreiben auf MW10 auch automatisch den Inhalt <strong>von</strong> MB11 usw.<br />
Tip: Zur Vermeidung solcher Fehler sollte man in einem STEP7-Projekt die Operanden getrennt nach Datentypen in<br />
festgelegten Speicherbereichen ansiedeln! Am besten macht man hierfür ein Konzept vor <strong>der</strong> eigentlichen<br />
Programmierarbeit und erspart sich so die Mühe des Fehlersuchens.<br />
Beispiel:<br />
Typ festgelegter Adressraum Reihenfolge <strong>der</strong> Vergabe ... bis<br />
Merker-Bits: MB10 ... MB19 M10.0 M10.1 M10.2 ... M19.7<br />
Merker-Bytes: MB20 ... MB39 MB20 MB21 MB22 ... MB39<br />
Merker-Worte: MB40 ... MB59 MW40 MW42 MW44 ... MW58<br />
Merker-Doppelworte MB60 ... MB99 MD60 MD64 MD68 ... MD96<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 20
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
3 Beispiele in FUP/KOP und AWL<br />
Die folgenden kleinen Programmbeispiele sind zum Vergleich jeweils in den 3 Sprachen dargestellt. FUP und KOP<br />
sind im Sprachumfang gleich.<br />
Insbeson<strong>der</strong>e bei den etwas komplexeren Funktionen zeigt sich, dass FUP und KOP sehr ähnlich sind. Daher sollte<br />
man nicht mit FUP und KOP gleichermaßen arbeiten, son<strong>der</strong>n sich für eine <strong>der</strong> beiden Sprachen entscheiden!<br />
3.1 Logische Verknüpfung<br />
3.2 Flip Flop und Flankenerkennung<br />
Gezeigt ist ein ein FlipFlop mit dominantem<br />
Rücksetzeingang.<br />
Flankenerkennungen benötigen<br />
einen freien binären Operanden zum<br />
Speichern des früheren Signalzustands,<br />
hier M1.0.<br />
Gezeigt ist die Verwendung <strong>der</strong><br />
Operation „P“ zur Erkennung einer<br />
positiven, d.h. ansteigenden Flanke.<br />
3.3 Timer<br />
Der Zeitwert ist vom Datentyp<br />
S5Time!<br />
Neben dem verwendeten Impulstimer<br />
gibt es noch Timer für<br />
Einschaltverzögerung, Ausschaltverzögerung<br />
und speichernde<br />
Einschaltverzögerung.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 21
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
3.4 Zähler<br />
Mit positiver Flanke 0→1 an S wird<br />
<strong>der</strong> Zähler auf den Wert ZW<br />
eingestellt. ZW ist im Format<br />
C# Wert = 0..999<br />
Neben dem dargestellten<br />
Rückwärtszähler gibt es auch<br />
Vorwärts- und Vorwärts/Rückwärtszähler.<br />
3.5 Arithmetische Operation<br />
Addition zweier Integerzahlen.<br />
3.6 Bausteinaufruf<br />
Gezeigt ist <strong>der</strong> bedingte Bausteinaufruf:<br />
FC2 wird nur dann<br />
bearbeitet, wenn die Variable „E3“<br />
den Wert TRUE hat.<br />
Außerdem gibt es noch einen<br />
absoluten Bausteinaufruf (Bearbeitung<br />
immer, ohne Bedingung).<br />
Unter FUP darf <strong>der</strong> Eingang EN<br />
dann einfach unbeschaltet bleiben<br />
(s.a. Abschnitt 3.5)<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 22
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
3.7 MOVE (Laden und Transferieren)<br />
Mit MOVE können alle Datentypen<br />
bis 32Bit Breite behandelt werden.<br />
(Byte, Wort, Doppelwort, INT,<br />
REAL, TIME, S5-TIME, DATE,<br />
TIME_OF_DAY etc.)<br />
Ausnahme: nicht zulässig für Bit-<br />
Operanden!<br />
Im Beispiel wird auf ein Strukturelement<br />
zugegriffen (z.B. vom<br />
Datentyp INT).<br />
4 Handhabung <strong>der</strong> CPU<br />
4.1 Betriebszustände und Übergänge<br />
Die Betriebszustände <strong>der</strong> CPU können mit dem Schlüssel-Schalter an <strong>der</strong> CPU (STOP - RUN - RUN-P) o<strong>der</strong> durch<br />
Einstellungen am Programmiergerät (siehe unten) eingestellt werden. Der Schlüsselschalter hat dabei höhere<br />
Priorität. Das Verhalten <strong>der</strong> CPU hängt vom jeweiligen Betriebszustand ab:<br />
STOP: Das Anwen<strong>der</strong>programm wird nicht bearbeitet. Ausgänge sind auf 0 gesetzt. Die CPU prüft, ob Hardwareo<strong>der</strong><br />
Systemfehler vorliegen. Das Urlöschen ist möglich (siehe Abschnitt 4.3)<br />
ANLAUF: Bevor die CPU nach dem Einschalten mit <strong>der</strong> Bearbeitung des Anwen<strong>der</strong>programms beginnt, veranlaßt<br />
das Betriebssystem den Aufruf des OB100 (Neustart). Im OB100 kann man Voreinstellungen für den Start des<br />
zyklischen OB1-Programms vornehmen.<br />
RUN: Bearbeitung des zyklischen OB1-Anwen<strong>der</strong>programms<br />
RUN-P: RUN-Zustand, in dem zusätzlich Bausteine vom Programmiergerät geladen werden können.<br />
Vorsicht! Nach Ablauf des Ladens setzt die CPU mit den neuen Bausteinen die zyklische Bearbeitung fort!<br />
HALT: Dies ist eine selten verwendete Betriebsart zu Testzwecken. Dabei werden die Grundtakte <strong>der</strong> Zeitsteuerung<br />
angehalten und die Timer bleiben stehen.<br />
4.2 Laden des Anwen<strong>der</strong>programms<br />
Programm-Bausteine sind im Ladespeicher <strong>der</strong> CPU<br />
abgelegt. Für Testzwecke und im Labor genügt<br />
normalerweise das Ablegen <strong>der</strong> Bausteine im RAM.<br />
Dies geschieht vom SIMATIC-Manager aus mit:<br />
Zielsystem ⇒ Laden ⇒ Objekt, z.B. <strong>S7</strong>-Programm<br />
Das EPROM wird angesprochen mit<br />
Zielsystem ⇒ RAM nach ROM kopieren<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 23
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
4.3 Urlöschen <strong>der</strong> CPU<br />
Beim sogenannten „Urlöschen“ wird <strong>der</strong> Arbeitsspeicher und RAM-Ladespeicher <strong>der</strong> CPU gelöscht. Außerdem<br />
werden alle CPU- und Baugruppenparameter auf die Default-Einstellungen zurückgesetzt. Man sollte die CPU vor<br />
dem Laden eines neuen Anwen<strong>der</strong>programms urlöschen. Die CPU muß dabei im Betriebszustand STOP sein. Zum<br />
Urlöschen mit dem Programmiergerät sind vom SIMATIC Manager aus die folgenden Schritte erfor<strong>der</strong>lich:<br />
Erreichbare Teilnehmer ⇒ CPU auswählen ⇒ Zielsystem ⇒ Betriebszustand ⇒ CPU auf „STOP“<br />
Und dann: ⇒ Zielsystem ⇒ Urlöschen<br />
4.4 Verhalten <strong>der</strong> CPU bei Netzausfall<br />
Um die CPU vor Datenverlust zu schützen, gibt es je nach CPU verschiedene Methoden:<br />
• Batteriepufferung<br />
Viele CPU’s haben eine Batteriepufferung. Dadurch sind Codebausteine (OB,FC,FB) und Datenbausteine (DB)<br />
geschützt. Ebenso die remanenten Merker, Zeiten und Zähler (siehe auch unter ‘Remanenz’). Nicht remanente<br />
Operanden erhalten nach Netzausfall automatisch den Wert 0.<br />
• EPROM, Memory-Card<br />
Verschiedene CPU’s haben einen Slot für Memory-Card o<strong>der</strong> einen eingebauten E(E)PROM-Bereich. Sofern das<br />
Programm in den EPROM-Bereich geladen wurde, sind Code- und Datenbausteine vor Datenverlust bei Netzausfall<br />
geschützt - auch ohne Batteriepufferung.<br />
CPU’s ohne Batterie-Fach<br />
Falls eine CPU keine Batterie hat (zB. CPU 312IFM), existiert ein E(E)PROM-Bereich zum Schutz <strong>der</strong> Daten bei<br />
Stromausfall. Nach dem normalen Laden des <strong>S7</strong>-Programms in den RAM-Bereich <strong>der</strong> CPU sichert man die Daten<br />
wie folgt:<br />
SIMATIC Manager (Online) ⇒ die betreffende CPU markieren ⇒ rechte Maustaste<br />
⇒ Zielsystem ⇒ RAM nach ROM kopieren<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 24
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
5 Funktion (FC)<br />
Im diesem Abschnitt werden die wesentlichen Aspekte bei <strong>der</strong> Erstellung und Verwendung <strong>von</strong> Funktionen<br />
behandelt. Das geschieht am Beispiel eines speziellen Multiplizierers.<br />
Beispiel:<br />
Es soll eine Funktion erstellt werden, die das Ergebnis Y = A*B*C zurückliefert. Die Variablen sind alle vom Typ DINT<br />
(Ganzzahl, 32 Bit). Wenn die Faktoren zu groß sind, wird <strong>der</strong> zulässige Zahlenbereich <strong>von</strong> Y überschritten und das<br />
Ergebnis ist falsch! Deshalb sollte <strong>der</strong> Erfolg <strong>der</strong> Berechnung dem aufrufenden Baustein mitgeteilt werden.<br />
Wegen Y= A*B*C= (A*B)*C kann die Berechnung<br />
<strong>der</strong> Multiplikation aus zwei hintereinan<strong>der</strong>geschalteten<br />
Multiplizierern mit jeweils 2 Eingängen<br />
zusammengesetzt werden.<br />
STEP7 stellt fertige Multiplizierer mit zwei Eingängen<br />
zur Verfügung. In <strong>der</strong> Liste <strong>der</strong> Programmelemente<br />
ist die Operation MUL_DI (Multiplikation für Variable<br />
vom Typ DINT) zu finden.<br />
Die Operanden EN und ENO kommen in FUP/KOP<br />
bei <strong>der</strong> Darstellung <strong>von</strong> FC‘s, FB‘s und aufwendigen<br />
Programmelementen, vor, wie auch die nebenstehende<br />
Beschreibung <strong>von</strong> MUL_DI zeigt.<br />
aus <strong>der</strong> Online-Hilfe zu MUL_DI<br />
5.1 Die Operanden EN (Enable) und<br />
ENO (Enable Out)<br />
Wenn unter FUP/KOP eine Funktion aufgerufen wird, erscheint ein Block mit den Bausteinparametern, die <strong>von</strong><br />
außen entsprechend beschaltet werden. Eine Beson<strong>der</strong>heit sind dabei die Operanden EN auf <strong>der</strong> Eingangs- und<br />
ENO auf <strong>der</strong> Ausgangsseite. Sie werden zur Programmsteuerung und zur Behandlung <strong>von</strong> Laufzeitfehlern während<br />
<strong>der</strong> Bearbeitung verwendet.<br />
Die Operanden EN und ENO sind dem Wert des Statusflags „BIE“ (Binärergebnis) <strong>der</strong> CPU fest zugeordnet und<br />
brauchen deshalb im Baustein nicht deklariert zu werden.<br />
EN<br />
ENO<br />
entspricht dem Wert <strong>von</strong> BIE vor <strong>der</strong> Bearbeitung,<br />
entspricht dem Wert <strong>von</strong> BIE nach <strong>der</strong> Bearbeitung des jeweiligen Funktionsblocks.<br />
Unter AWL treten diese Operanden nicht auf. Hier wird stattdessen direkt mit dem Statusflag „BIE“ gearbeitet<br />
EN (Enable)<br />
Der betreffende Funktionsblock wird nur dann bearbeitet, wenn EN = 1 ist. Im an<strong>der</strong>en Fall wird er übersprungen. Im<br />
Zusammenhang mit einem Bausteinaufruf ist EN die Bedingung, ob <strong>der</strong> Baustein tatsächlich bearbeitet wird o<strong>der</strong><br />
übersprungen wird.<br />
Bearbeitung des Funktionsblocks dann, wenn: EN = 1<br />
ENO (Enable Out)<br />
Der Wert <strong>von</strong> ENO bzw. BIE wird durch Programmanweisungen im betreffenden Funktionsblock festgelegt. Es gilt<br />
folgende Konvention zur Programmsteuerung:<br />
Man setzt ENO in Abhängigkeit <strong>von</strong> evtl. Laufzeitfehlern durch einem Schreibzugriff auf das Statusflag „BIE“<br />
(Binärergebnis) auf folgenden Wert:<br />
Bearbeitung des Bausteins ohne Fehler: BIE = 1 (ENO = 1)<br />
Fehler aufgetreten: BIE = 0 (ENO = 0)<br />
Die letzte Operation vor dem Verlassen des Bausteins sollte also die Zuweisung eines entsprechenden Wertes auf<br />
das BIE-Flag sein. Damit wird <strong>der</strong> ENO des gesamten Bausteins festgelegt.<br />
Hierfür wird unter AWL die Operation „SAVE“ verwendet. BIE wird wird dieser Operation auf den Wert des<br />
Statusflags VKE (Verknüpfungsergebnis) gesetzt.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 25
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Mit <strong>der</strong> Operation „SAVE“ wird <strong>der</strong> Inhalt des VKE (Verknüpfungsergebnis) dem BIE zugewiesen<br />
Man erstellt also ein VKE entsprechend <strong>der</strong> Programmsteuerungs-Konvention und weist am Bausteinende durch<br />
eine „SAVE“-Operation den Wert dem BIE-Flag zu.<br />
Da <strong>von</strong> den vielen Operationsbefehlen unter STEP7 lediglich SAVE einen Einfluß auf das BIE-Flag besitzt, gilt<br />
außerdem noch die folgende Regel:<br />
Wenn keine Operation „SAVE“ vorkommt, ist:<br />
ENO = EN<br />
Beispiel: BIE soll mit dem Wert <strong>von</strong> Merker M1.0 belegt werden. In den verschiedenen Sprachen sieht die Operation<br />
so aus:<br />
FUP KOP AWL<br />
U M1.0<br />
SAVE<br />
5.2 Erstellen einer Funktion<br />
Selbstverständlich muß ein Baustein bereits existieren, ehe er aufgerufen werden kann! Ideshalb wird als erstes die<br />
Funktion erstellt. Im Deklarationsteil wird die Schnittstelle <strong>der</strong> Funktion nach außen festgelegt:<br />
5.2.1 Deklarationsteil<br />
Die Deklarationstabelle enthält die Lokalen Variablen <strong>der</strong> Funktion.<br />
Als Eingänge (Deklarationstyp „in“) vom<br />
Datentyp DINT werden dem Baustein die<br />
drei Faktoren A, B, C übergeben. Der<br />
Ausgang Y (Deklarationstyp „out“) ist<br />
ebenfalls vom Datentyp DINT. Alle<br />
Formalparameter werden mit dem<br />
Anfangswert 0 initialisiert<br />
Das Zwischenergebnis A*B kann nach<br />
Verlassen des Bausteins ‘vergessen’ werden; deshalb wird es als temporäre Variable deklariert (Deklarationstyp<br />
„temp“).<br />
5.2.2 Anweisungsteil in FUP und AWL<br />
Anweisungsteil in FUP<br />
Wenn unter FUP <strong>der</strong> EN Eingang unbeschaltet ist, wird <strong>der</strong> Block bearbeitet!<br />
Zur Ermittlung des Baustein-ENO kann man hier einfach den ENO des ersten Blocks auf den EN des zweiten<br />
‘durchschleifen’ (dann den ENO auf den EN des nächsten ...usw.). Der ENO des letzten Funktionsblocks muß über<br />
die Operation „SAVE“ nach außen weitergegeben werden. Würde oben die Save-Anweisung gelöscht werden, würde<br />
ein Überlauf-Fehler des zweiten Funktionsblocks nicht weitergegeben werden!<br />
Im letzten Netzwerk wird als letzte Anweisung über die Operation SAVE <strong>der</strong> Baustein-ENO gesetzt.<br />
Meistens hat man es aber mit weniger komplexen Programmelementen zu tun, die selbst keine EN/ENO-Anschlüsse<br />
haben (z.B Binäre Verknüpfungen, FlipFlops, Zähler etc). Dann muß man den Wert des Baustein-ENO’s eben selbst<br />
programmieren. Dabei ist die bereits beschriebene Konvention zu beachten.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 26
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Anweisungsteil desselben Netzwerks in AWL:<br />
Folgende AWL-Operationen sind im<br />
Zusammenhang mit dem Binärergebnis-Flag<br />
BIE beson<strong>der</strong>s interessant:<br />
Operation<br />
Beschreibung<br />
SAVE Wert <strong>von</strong> VKE → BIE<br />
CLR setzt VKE → 0<br />
SET setzt VKE → 1<br />
NOT negiert das VKE<br />
5.3 Aufrufen <strong>der</strong> Funktion<br />
Aufruf unter FUP:<br />
Unter FUP erfolgt <strong>der</strong> Aufruf des FC mit dem<br />
Programmelement „FC“. Dort ist <strong>der</strong> bereits<br />
erstellte FC1 vorhanden und kann einfach<br />
ins Netzwerk gezogen werden.Falls <strong>der</strong><br />
Aufruf <strong>von</strong> einer Bedingung abhängen soll,<br />
wird <strong>der</strong> EN-Eingang entsprechend<br />
beschaltet (Bearbeitung erfolgt, wenn EN=1<br />
o<strong>der</strong> wenn EN unbeschaltet ist).<br />
Im Beispiel trägt <strong>der</strong> Merker 1.0 die<br />
Information, ob das Ergebnis Y stimmt.<br />
Aufruf unter AWL:<br />
Unter AWL erfolgt <strong>der</strong> Aufruf mit <strong>der</strong><br />
Operation „CALL“. Falls <strong>der</strong> Aufruf <strong>von</strong> einer<br />
Bedingung abhängig sein soll, muß durch<br />
entsprechende Sprunganweisungen die<br />
Zeile mit „CALL“ übersprungen werden.<br />
5.4 Fehlerbehandlung und Statusmeldungen<br />
Manchmal reicht die bereits beschriebene Verwendung <strong>von</strong> EN/ENO zur Fehlerbehandlung nicht aus, um im<br />
aufrufenden Baustein ausreichende Informationen über den Bearbeitungsstatus zu bekommen.<br />
In solchen Fällen ist es gebräuchlich, im FC einen zusätzlichen Ausgangsparameter für Statusinformationen zu<br />
deklarieren. Den Datentyp wählt man je nach Anfor<strong>der</strong>ungen. Der ENO wird als Sammelmeldung benutzt: ‘irgend<br />
etwas ist passiert’, wenn ENO=0.<br />
Im aufrufenden Baustein hat man zunächst nur ENO zu überwachen. Erst wenn ENO=0 ist, wird die<br />
Statusinformation ausgewertet.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 27
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
6 Datenbaustein (DB)<br />
In diesem Abschnitt werden die Erstellung, Adressierung <strong>der</strong> Daten und die Einsatzmöglichkeiten <strong>von</strong> DB’s<br />
behandelt. Das spezielle Umgehen mit Instanz-DB’s wird im Abschnitt 8 zusammen mit Funktionsbausteinen erklärt.<br />
Die Datenstruktur und Länge <strong>von</strong> DB’s wird vom Anwen<strong>der</strong>programm festgelegt. Die Adressierung in<br />
Datenbausteinen ist auf Bytes bezogen, ebenso wie im Speicher <strong>der</strong> CPU. Die maximale Länge eines DB und die<br />
Anzahl <strong>der</strong> Datenbausteine hängt ab <strong>von</strong> <strong>der</strong> jeweiligen CPU.<br />
Beispiel: CPU 312 IFM (kleinste CPU <strong>der</strong> Reihe <strong>S7</strong>-300)<br />
Größe eines DB:<br />
max. 6 kByte (6144 Byte)<br />
Anzahl Datenbausteine: DB 1 ... DB 63 DB0 ist reserviert für Systemdaten<br />
Grundsätzlich können zwei verschiedene DB-Typen unterschieden werden:<br />
• Instanz-DB<br />
dient einem FB als „Gedächtnis“ und ist deshalb in seiner Datenstruktur festgelegt. Die Datenstruktur entspricht<br />
<strong>der</strong> Deklarationstabelle des zugehörigen FB und kann nicht verän<strong>der</strong>t werden.<br />
• Global-DB (oft auch nur als als ‚Datenbaustein‘ bezeichnet)<br />
Anwen<strong>der</strong>-Speicherbereich, <strong>der</strong> in seiner Datenstruktur frei vereinbart werden kann<br />
Grundsätzlich kann man auf alle DB’s (auch auf Instanz-DB’s) lesend und schreibend zugreifen durch Anweisungen<br />
in irgendwelchen Codebausteinen (OB, FC, FB).<br />
6.1 Erzeugen eines Datenbausteins<br />
Beim Erstellen eines neuen DB’s wird festgelegt, um welchen Typ es sich handeln soll. Ein neuer DB wird erstellt<br />
vom SIMATIC Manager aus mit:<br />
<strong>S7</strong>-Programm ⇒ Bausteine ⇒ Einfügen ⇒ <strong>S7</strong>-Baustein ⇒ Datenbaustein<br />
Nach Eintragen <strong>der</strong> DB-Nr (zB. „DB2“) und öffnen des Objekts erscheint ein Fenster „Neuer Datenbaustein“. Hier<br />
wird <strong>der</strong> Typ festgelegt:<br />
Die erste Auswahlmöglichkeit betrifft einen<br />
Datenbaustein, bei dem die Datenstruktur frei<br />
festgelegt weden kann.<br />
Mit <strong>der</strong> letzten Auswahlmöglichkeit kann ein<br />
sogenannter Instanz-DB erzeugt werden. Bei<br />
diesem liegt die Datenstruktur fest: sie wurde<br />
bereits festgelegt in den Deklarationen des<br />
zugeordneten Funktionsbausteins.<br />
6.2 Festlegen <strong>der</strong> Datenstruktur<br />
Nachdem ein neuer DB als „Datenbaustein“ definiert wurde (s. vorheriger Abschnitt) erscheint eine<br />
Deklarationstabelle zum Festlegen <strong>der</strong> Datenstruktur. Eingetragen wird jeweils ein Name, Datentyp, Anfangswert und<br />
Kommentar. Die lokale Adresse vergibt STEP7 automatisch.<br />
Man beachte die unterschiedlichen<br />
Datentypen. In <strong>der</strong> linken Spalte<br />
„Adresse“ ergibt sich automatisch die<br />
lokale Adresse.<br />
Beispiel für einen DB: (Deklarationssicht)<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 28
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Sobald die DB-Deklaration abgeschlossen und <strong>der</strong> DB abgespeichert ist, kann <strong>der</strong> Datenbaustein in <strong>der</strong> sogenannten<br />
„Datensicht“ betrachtet werden mit: Ansicht ⇒ Datensicht<br />
In <strong>der</strong> Spalte ‘Aktualwert’ ist<br />
zu sehen, daß die Daten<br />
bereits auf den Anfangswert<br />
initialisiert wurden.<br />
Derselbe DB in „Datensicht“<br />
Tip: Man sollte für den DB einen symbolischen Namen festlegen (zB. „DB_Name“)! Dann kann man bequem auf die<br />
einzelnen Datensätze zugreifen, z.B.mit „DB_Name“.Messwert[1]), s.a. nächster Abschnitt.<br />
6.3 Adressierung <strong>der</strong> Daten<br />
Der folgende Abschnitt betrifft den Zugriff auf Daten sowohl in Instanz- als auch in Global-Datenbausteinen.<br />
Die CPU hat für die Adressierung <strong>der</strong> jeweiligen Datenbausteine 2 Register zur Verfügung, so daß gleichzeitig zwei<br />
DB’s komfortabel adressiert werden können:<br />
DB-Register<br />
DI - Register<br />
speichert die Nummer des (globalen) Datenbaustein<br />
speichert die Nummer des Instanz-Datenbausteins<br />
Grundsätzlich gibt es gibt zwei Möglichkeiten, auf Daten zuzugreifen:<br />
6.3.1 Vollständige Adressierung <strong>der</strong> Daten in einem Schritt<br />
Diese Adressierungsart ist nur in Zusammenhang mit dem DB-Register verfügbar. Für jeden Datenzugriff wird die<br />
DB-Nummer mit angegeben. Die Methode ist bei etwas höherem Schreibaufwand sicherer in Projekten mit mehreren<br />
Datenbausteinen (Programmierfehler).<br />
Ein beson<strong>der</strong>er Vorteil besteht darin, daß die Namen <strong>der</strong> deklarierten Datentypen zur Adressierung direkt verwendet<br />
werden können. Dazu muß allerdings vorher für den DB eine symbolische Bezeichnung definiert werden (Symbol-<br />
Editor).<br />
Syntax: bei absoluter Adressierung: DB-Nummer . Adresse<br />
bei symbolischer Adressierung: „DB-Name“ . Daten-Name<br />
Beispiele<br />
Absolute Adressierung: DB1. DB X2.5 Erklärung <strong>der</strong> Adressbezeichner s. Abschnitt 7.3.2<br />
DB10. DB W0<br />
Symbolische Adressierung: „Geschwindigkeit“.x_alt Geschwindigkeit ist <strong>der</strong> symb. Name für den DB, z.B. DB10<br />
x_alt ist Daten-Name in <strong>der</strong> DB-Deklaration <strong>von</strong> DB10<br />
„Motor“.Leistung Motor ist <strong>der</strong> symbolische Name für den DB,,<br />
Leistung ist Daten-Name in <strong>der</strong> DB-Deklaration <strong>von</strong> DB3<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 29
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
6.3.2 Adressierung mit: DB ‘Öffnen’ bzw. DI ‘Öffnen’<br />
Vorteil dieser Adressierung ist die kürzere Schreibweise. Wenn im Projekt nur höchstens 2 Datenbausteine existieren<br />
(ein DB und ein Instanz-DB), ist die Methode auch übersichtlich. Allerdings müssen die einzelnen Daten absolut<br />
adressiert werden! Die Namen <strong>der</strong> deklarierten Daten können lei<strong>der</strong> nicht verwendet werden.<br />
Den DB ‘öffnen’ ist nichts an<strong>der</strong>es, als dem DB- o<strong>der</strong> DI-Register die entsprechende DB-Nummer zuzuweisen. Dann<br />
können die Daten dieses Datenbausteins in kürzerer Schreibweise adressiert werden, nämlich durch Angabe <strong>der</strong><br />
Adresse innerhalb des DB.<br />
Die Zuweisung <strong>der</strong> DB-Nummer zum jeweiligen Register geschieht in AWL durch die Operation „AUF“ (öffnen,<br />
aufschlagen):<br />
AUF DB [DB-Nummer] bzw. AUF DI [DB-Nummer]<br />
in FUP/KOP gibt es ein Programmelement ‘Datenbaustein Öffnen’<br />
Beispiel:<br />
FUP: AWL: AUF DB 10; AUF DI 10<br />
Die folgenden Bezeichnungen werden verwendet, um innerhalb eines DB die gewünschten Daten absolut zu<br />
adressieren:<br />
Wichtige Bezeichnungen:<br />
Format Datentyp Beispiel Erklärung<br />
DB X BOOL DB X2.5 Bit5 im Byte2 ... in dem DB, dessen Nummer im DB-Register steht<br />
DB B BYTE DB B2 Byte 2 ... in dem DB, dessen Nummer im DB-Register steht<br />
DB W WORD DB W2 Wort 2 (d.h. Byte 2,3) ... in dem DB, dessen Nummer im DB-Register steht<br />
DB D DWORD DB D4 Doppelwort 4 (d.h. Wort 4,6 ... in dem DB, dessen Nummer im DB-Register steht<br />
o<strong>der</strong> Byte 4,5,6,7)<br />
DI X BOOL DI X2.5 Bit5 im Byte2 ... in dem DB, dessen Nummer im DI-Register steht<br />
DI B BYTE DI B2 Byte 2 ... in dem DB, dessen Nummer im DI-Register steht<br />
DI W WORD DI W2 Wort 2 (d.h. Byte 2,3) ... in dem DB, dessen Nummer im DI-Register steht<br />
DI D DWORD DI D4 Doppelwort 4 (d.h. Wort 4,6 ... in dem DB, dessen Nummer im DI-Register steht<br />
o<strong>der</strong> Byte 4,5,6,7)<br />
Beispiele:<br />
AUF DB 10 DB10 öffnen: DB-Nummer → DB-Register<br />
L DB W0 Lade Datenwort 0 <strong>von</strong> dem Datenbaustein, dessen Nummer im DB-Register steht, in den Akku1<br />
U DB X2.3 UND-Verknüpfung mit Bit 3 <strong>von</strong> Byte 2 in dem DB, dessen Nummer im DB-Register steht<br />
AUF DI 11 DB11 als Instanz-DB öffnen: DB-Nummer → DI-Register<br />
L DI B3 lade Byte 3 <strong>von</strong> dem Datenbaustein, dessen Nummer im DI-Register steht<br />
6.4 Weitere Operationen mit Datenbausteinen<br />
Unter AWL sind außerdem die folgenden Operationen bei <strong>der</strong> Verwendung <strong>von</strong> Datenbausteinen wichtig:<br />
Weitere wichtige Operationen mit DB’s<br />
Länge des geöffneten DB: L DBLG Lade Länge des DB in Akku1<br />
bzw: L DILG Lade Länge des Instanz-DB in Akku1<br />
Nummer des geöffneten DB: L DBNO Lade Nummer DB in Akku1<br />
bzw: L DINO Lade Nummer Instanz-DB in Akku1<br />
DB’s tauschen TDB tauscht Inhalt DB-Register mit Inhalt DI-Register<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 30
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
7 Funktionsbaustein (FB)<br />
7.1 Unterschied zur Funktion<br />
Beim Aufruf eines FB muß ein Instanz-DB angegeben werden, <strong>der</strong> für diese Instanz des FB als Speicher dient.<br />
Wesentlicher Unterschied zu FC’s ist die Möglichkeit, statische Variable zu deklarieren, <strong>der</strong>en Wert beim Verlassen<br />
des FB erhalten bleiben.<br />
Im Instanz-DB werden neben den statischen Variablen auch die aktuellen Werte <strong>der</strong> übergebenen Parameter (in, out,<br />
in_out) gespeichert. Ansonsten gelten diesselben Eigenschaften wie bei Funktionen.<br />
7.2 Anwendungsbeispiel: Zeitliche Ableitung eines Meßsignals<br />
Das folgende Beispiel zeigt, wie ein Funktionsbaustein und <strong>der</strong> Instanz-Datenbaustein zusammenarbeiten. Im FB10<br />
wird <strong>der</strong> Differenzenquotient ∆x/∆T gebildet, z.B. zur Berechnung <strong>der</strong> Geschwindigkeit aus einem gemessenen Weg.<br />
Durch erneuten Aufruf des FB10 mit einem an<strong>der</strong>en Instanz-DB könnte beispielsweise die Beschleunigung berechnet<br />
werden.<br />
Eingangsgröße ist <strong>der</strong> aktuelle Meßwert x. Der alte Meßwert x_alt wird als statische Variable (Deklarationstyp „stat“)<br />
deklariert. Die Messung soll in gleichen Zeitabständen erfolgen, <strong>der</strong> Wert <strong>von</strong> ∆T kann daher als konstanter<br />
Eingangsparameter beim Aufruf des FB10 übergeben werden.<br />
7.2.1 FB Erstellen<br />
FB10:<br />
Deklaration <strong>der</strong> lokalen Variablen<br />
FB10: Anweisungsteil<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 31
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
7.2.2 FB Aufrufen<br />
Es muß dafür gesorgt werden, daß die<br />
Bearbeitung des FB in gleichen Zeitabständen<br />
erfolgt. Dies kann sehr einfach mit dem OB35,<br />
ein periodischer Zeitinterrupt o<strong>der</strong> „Weckalarm“,<br />
realisiert werden (s.a. Abschnitt 10.2,<br />
Weckalarm)<br />
Vom Betriebssystem wird dem OB35 beim<br />
Aufruf die Abtastzeit übergeben (lokale Variable<br />
„OB35_EXC_FREQ“). Mit „PEW288“ wird ein<br />
direkter Peripheriezugriff auf eine analoge<br />
Eingangsbaugruppe mit <strong>der</strong> Adresse 288<br />
veranlaßt.<br />
Beim Aufruf des FB10 (symbolischer Name<br />
„d/dt“) muß <strong>der</strong> Name des Instanz-DB<br />
angegeben werden, hier DB10<br />
(„GeschwDB“)<br />
OB35: Aufruf des FB10<br />
7.2.3 Instanz-DB<br />
Beim Aufruf des FB wird <strong>der</strong> Instanz-DB (hier DB10) angegeben. Wenn STEP7 feststellt, daß es ihn noch nicht gibt,<br />
wird er automatisch aus <strong>der</strong> FB-Deklarationsliste erstellt. Der Datenbausteins kann er in zwei Darstellungs-arten<br />
angezeigt werden:<br />
DB10 in „Deklarationssicht“<br />
DB10 öffnen ⇒ Ansicht ⇒<br />
Deklarationssicht<br />
DB 10 in „Datensicht“<br />
DB10 öffnen ⇒ Ansicht<br />
⇒ Datensicht<br />
In <strong>der</strong> Datensicht ist zusehen, daß die Daten bereits mit den deklarierten Anfangswert initialisiert sind.<br />
Wenn <strong>der</strong> FB10 mehrmals im Programm verwendet wird (z.B. Berechnung <strong>von</strong> Geschwindigkeit und<br />
Beschleunigung), muß für jede Instanz des FB10 ein eigener Instanz-DB angegeben werden.<br />
Auch <strong>von</strong> an<strong>der</strong>en Codebausteinen kann lesend und schreibend auf einen Instanz-DB zugegriffen werden!<br />
z.B. um Daten neu zu initialisieren (s.a. Abschnitt 7.3 Adressierung <strong>der</strong> Daten).<br />
Beispiel:<br />
mit absoluter Adressierung: T DB10.DB W6 Transferiere Inhalt <strong>von</strong> Akku1 nach: Datenwort 6 <strong>von</strong> DB10<br />
mit symbolischer Adressierung: T „GeschwDB“.x_alt Transferiere Inhalt <strong>von</strong> Akku 1 nach: x_alt im<br />
Datenbaustein „GeschwDB“<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 32
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
8 Ereignisgesteuerte Programmbearbeitung<br />
Im Abschnitt 2.2.1 (Organisationsbausteine) wurde bereits gezeigt, daß vom Betriebssystem die verschiedenen OB’s<br />
gestartet werden und zwar in Abhängigkeit <strong>von</strong> bestimmten Systemereignissen. In diesem Kapitel werden die<br />
Zusammenhänge bei den wichtigsten OB’s genauer beleuchtet. Beson<strong>der</strong>e Aufmerksamkeit verdient dabei die<br />
Frage, wann die Aktualisierung <strong>von</strong> Daten erfolgt.<br />
8.1 Zyklische Programmbearbeitung (OB1)<br />
Hinweis: Im nachfolgenden Text kommt häufig <strong>der</strong> CPU-Speicher vor. In diesem Zusammenhang ist die Tabelle im<br />
Abschnitt 2.7 (Anwen<strong>der</strong>speicher in <strong>der</strong> CPU) hilfreich für das Verständnis.<br />
Vor Beginn des OB1 werden die Daten <strong>der</strong> Eingangsperipherie gelesen und in dem CPU-Speicherbereich PAE<br />
(Prozeßabbild <strong>der</strong> Eingänge) abgelegt. Für die gesamte Dauer des OB1-Zyklus wird mit diesen Daten gearbeitet,<br />
wenn in Operationen auf ‚Eingänge‘ zugegriffen wird (E,EB, EW, ED) . Erst zu Beginn des nächsten Zyklus wird das<br />
PAE aktualisiert.<br />
Die so „eingefrorenen“ Eingangsdaten haben den<br />
Vorteil, daß das Programm trotz möglicher<br />
Än<strong>der</strong>ungen an <strong>der</strong> Peripherie während des OB1-<br />
Zyklus über konsistente, d.h. wi<strong>der</strong>spruchsfreie<br />
Eingangsdaten verfügt. Nachteilig ist selbstverständlich,<br />
daß Än<strong>der</strong>ungen an <strong>der</strong><br />
Eingangsperipherie erst im nächsten Zyklus bemerkt<br />
werden.<br />
Entsprechend den PAE-Daten, Merkern, an<strong>der</strong>en<br />
Daten und Anweisungen des Programms wird <strong>der</strong><br />
OB1 abgearbeitet. Anweisungen im OB1 hinsichtlich<br />
<strong>der</strong> Ausgänge verän<strong>der</strong>n den CPU-Speicherbereich<br />
PAA (Prozeßabbild <strong>der</strong> Ausgänge). Sie betreffen<br />
aber nicht die eigentlichen, an <strong>der</strong> Peripherie<br />
befindlichen Ausgänge!<br />
Erst am Ende des OB1 wird <strong>der</strong> Wert des PAA auf<br />
die Ausgänge transferiert.<br />
Beim Auftreten <strong>von</strong> irgendwelchen<br />
Systemereignissen wird <strong>der</strong> OB1 entsprechend <strong>der</strong><br />
Priorität <strong>der</strong> zugehörigen OB’s unterbrochen und<br />
nach <strong>der</strong>en Bearbeitung wie<strong>der</strong> fortgesetzt.<br />
Falls es spezielle Problemstellungen erfor<strong>der</strong>n, kann auch innerhalb des OB1-Zyklus direkt auf die Peripherie<br />
zugegriffen werden. Dies geschieht durch Lese/Schreibzugriffe auf den CPU-Speicherbereich PE (Peripheriebereich<br />
Eingänge) bzw. PA (Peripheriebereich Ausgänge) .<br />
Beispiel: L PEB 12 (lade PEB 12 in Akku1)<br />
T PAW 2 (transferiere Inhalt <strong>von</strong> Akku1 nach PAW2<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 33
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
8.2 Anlaufbearbeitung und Initialisierung (OB100)<br />
Mit dem OB100 (‘Neustart’) kann das Anlaufverhalten <strong>der</strong> CPU programmiert werden.<br />
Der OB100 unterbricht mit sehr hoher Priorität an<strong>der</strong>e OB’s, bevor <strong>der</strong> CPU-Betriebszustandswechsel STOP→RUN<br />
passiert und <strong>der</strong> erste OB1-Zyklus beginnt.<br />
Daher können im OB100 sehr gut Initialisierungs-Routinen programmiert werden. Weil <strong>der</strong> Baustein zur Laufzeit nur<br />
ein einziges Mal aufgerufen wird, eignet sich <strong>der</strong> OB100 auch zum Aufruf <strong>von</strong> einmaligen zeitaufwendigen<br />
Berechungen und für Dokumentationszwecke.<br />
Sicherlich macht es bei <strong>der</strong> Steuerung einer Anlage durchaus Unterschiede, ob beispielsweise ein Anlauf<br />
STOP→RUN erfolgt, weil mit dem Schlüsselschalter eingeschaltet wird o<strong>der</strong> ob plötzlich eine eingebrochene<br />
Netzspannung wie<strong>der</strong>kehrt. Deshalb wird vom Betriebssystem die Vorgeschichte in lokale Variable des OB100<br />
eingetragen.<br />
8.2.1 Lokale Variable des OB100<br />
Bei <strong>der</strong> Programmierung des OB100 werden <strong>von</strong> STEP7 automatisch einige lokale Variable deklariert, die im<br />
Anwen<strong>der</strong>programm verwendet werden können. Die zugehörigen Daten werden beim Aufruf des OB100 vom<br />
Betriebssystem übergeben. Die Informationen betreffen u.a. die Anlaufmethode, Start-Datum und Uhrzeit, Ursache<br />
des letzten Stops, Än<strong>der</strong>ung <strong>der</strong> Systemkonfiguration.<br />
Die folgende Tabelle <strong>der</strong> lokalen Variablen ist dem <strong>Siemens</strong> Handbuch ‘System- und Standardfunktionen,<br />
Referenzhandbuch’ entnommen. Die Variable OB100_STRT_INFO ist dort im Abschnitt 1.17 genauer<br />
aufgeschlüsselt.<br />
8.2.2 Anwendungsbeispiel<br />
Im folgenden Beispiel soll das Programm unterschiedlich reagieren, je nachdem ob <strong>der</strong> Anlauf manuell o<strong>der</strong> durch<br />
Spannungswie<strong>der</strong>kehr erfolgt ist. Dazu werden die Informationen <strong>der</strong> lokalen Variablen OB100_STRTUP genutzt.<br />
Über die Variable ist bekannt (siehe Tabelle):<br />
Variable Typ Deklaration Beschreibung<br />
OB100_STRTUP BYTE TEMP Anlaufmethode:<br />
16#81 = Manueller Neustart<br />
16#82 = Automatischer Neustart, z.B bei Spannungswie<strong>der</strong>kehr<br />
Im OB100 wird daher <strong>der</strong> tatsächliche Wert <strong>von</strong> OB100_STRTUP abgefragt und die Anlaufmethode ermittelt.<br />
Wichtig: die gefundene Information muß in einer statischen Variable abgelegt werden, damit auch außerhalb vom<br />
OB100 darauf zugegriffen werden kann!<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 34
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Beschreibung des Beispiel-Programms<br />
Wenn die SPS manuell gestartet wurde, soll während des OB1-Zyklus ständig <strong>der</strong> Ausgang „Manuell_START“=1<br />
sein, wenn die SPS AG automatisch (durch Netzwie<strong>der</strong>kehr) gestartet wurde, soll <strong>der</strong> Ausgang<br />
„Stromversorgung_Start“=1 sein.<br />
Im OB100 wird also die Variable OB100_STRTUP verglichen mit bestimmten Testdaten. Der 16Bit-Vergleicher<br />
verlangt allerdings Variablen o<strong>der</strong> Zahlen vom Typ Integer, so daß die Variable OB100_STRTUP erst noch <strong>von</strong> Byte<br />
nach Integer umgewandelt werden muß. Hierfür wird das Programmelement ‘MOVE’ verwendet (in AWL:<br />
Laden...Transferieren). Damit kein statischer Speicher verbraucht wird, wird in <strong>der</strong> Deklarationstabelle eine<br />
temporäre Variable Temp_Int vom Typ INT eingeführt.<br />
Im OB1-Zyklus kann bei Bedarf auf die Informationen Manuell_Start und Stromversorgung_Start <strong>von</strong> Anfang an<br />
zugegriffen werden. Die entsprechenden Ausgänge <strong>der</strong> I/O-Peripherie werden allerdings erst am Ende des ersten<br />
OB1-Zyklus gesetzt.<br />
Symboltabelle:<br />
Symbol Operand Datentyp Kommentar<br />
Manuell_Start A 4.0 BOOL A4.0=1, wenn Anlauf manuell war<br />
(Schlüsselschalter o<strong>der</strong> durch PG)<br />
Symbol Operand Datentyp Kommentar<br />
Stromversorrgung_Start A 4.1 BOOL A4.1=1, wenn Anlauf automatisch war<br />
(Netzwie<strong>der</strong>kehr)<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 35
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
8.3 Weckalarm = Periodischer Zeitinterrupt (OB30..OB38)<br />
Eine periodische Unterbrechung <strong>der</strong> zyklischen OB1-Bearbeitung ist mit den Organisationsbausteinen OB30 bis<br />
OB38 möglich. Allerdings ist die verfügbare Anzahl <strong>der</strong> Weckalarm-OB’s abhängig <strong>von</strong> <strong>der</strong> jeweiligen CPU, wie die<br />
nachfolgende Tabelle zeigt:<br />
CPU<br />
verfügbare Weckalarm-OB's<br />
CPU 312 IFM --- --- --- --- --- --- --- --- ---<br />
CPU 313 --- --- --- --- --- OB35 --- --- ---<br />
CPU 314 --- --- --- --- --- OB35 --- --- ---<br />
CPU 314 IFM --- --- --- --- --- OB35 --- --- ---<br />
CPU 315 --- --- --- --- --- OB35 --- --- ---<br />
CPU 614 --- --- --- --- --- OB35 --- --- ---<br />
CPU 412-1 --- --- OB 32 --- --- OB35 --- --- ---<br />
CPU 413-1 --- --- OB 32 --- --- OB35 --- --- ---<br />
CPU 414-1 --- --- OB 32 OB 33 OB 34 OB35 --- --- ---<br />
CPU 416-1 OB 30 OB 31 OB 32 OB 33 OB 34 OB 35 OB 36 OB 37 OB 38<br />
verfügbare Weckalarm-OB’s, voreingestelltes Zeitraster und Priorität<br />
Weckalarm-OB’s Zeittakt in ms Prioritätsklasse<br />
OB 30 5000 7<br />
OB 31 2000 8<br />
OB 32 1000 9<br />
OB 33 500 10<br />
OB 34 200 11<br />
OB 35 100 12<br />
OB 36 50 13<br />
OB 37 20 14<br />
OB 38 10 15<br />
Weckalarme unterbrechen den OB1-Zyklus periodisch, d.h. in gleichen Zeitabständen. Der Zeittakt startet mit dem<br />
CPU-Zustandswechsel STOP→RUN. Das voreingestellte Zeitraster kann bei <strong>der</strong> Parametrierung <strong>der</strong> CPU verän<strong>der</strong>t<br />
werden (siehe unten). Weckalarme werden eingesetzt beispielsweise beim Aufruf <strong>von</strong> Regler-Algorithmen o<strong>der</strong> <strong>von</strong><br />
irgendwelchen an<strong>der</strong>en Operationen, die periodisch, d.h. in gleichen Zeitabständen durchgeführt werden sollen.<br />
8.3.1 Einstellung des Aufrufintervalls<br />
Die voreingestellten Werte für das Aufrufintervall (Zeit zwischen zwei Aufrufen) und die Priorität des Aufrufs können<br />
bei <strong>der</strong> Parametrierung <strong>der</strong> CPU mit dem SIMATIC-Manager verän<strong>der</strong>t werden:<br />
Die betreffende SIMATIC-Station mit rechter Maustaste anklicken, dann ⇒ Objekteigenschaften.<br />
es erscheint das Fenster ‘Hardware-Konfiguration’. Die ausgewählte CPU in <strong>der</strong> rechten Maustaste anklicken,<br />
⇒ Objekteigenschaften ⇒ Weckalarm<br />
Nun kann das Aufrufintervall eingetragen werden. Es sind ganzzahlige Vielfache <strong>von</strong> 1 ms möglich:<br />
Zeittakt = n * Grundtakt 1 ms;<br />
Die Zeitdauer zwischen zwei Aufrufen (Aufrufintervall) ist einstellbar <strong>von</strong> 1ms...1 Minute.<br />
Das Aufrufintervall sollte an das Programm und die Notwendigkeiten angepaßt sein! Es muß mindestens so groß<br />
sein, daß die Anweisungen des Weckalarms auch abgearbeitet werden können. Außerdem ist folgendes zu<br />
berücksichtigen:<br />
Wenn das Aufrufintervall zu klein gewählt wird, kommen OB’s <strong>der</strong> kleineren Prioritätsklassen wegen <strong>der</strong> häufigen<br />
Unterbrechungen nicht zügig voran. Dies gilt insbeson<strong>der</strong>e für das zyklische OB1-“Hauptprogramm“: Es droht ein<br />
Programmabbruch wegen Zykluszeitüberschreitung.<br />
8.3.2 Anwendungsbeispiel<br />
Es sei verwiesen auf das Anwendungsbeispiel aus dem Abschnitt 8.2 (Zeitliche Ableitung eines Meßsignals) , in dem<br />
ein Periodischer Zeitinterrupt benutzt wird.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 36
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
8.4 Prozeßalarm = I/O-Interrupt (OB40)<br />
Prozeßalarm ist ein Systemereignis, das <strong>von</strong> einer Peripherie-Eingangsbaugruppe ausgelöst wird. Neben <strong>der</strong> CPU-<br />
Fähigkeit zur Auswertung solcher Prozeßalarme ist allerdings auch eine spezielle Eingangsperipherie notwendig, um<br />
den Interrupt auszulösen. Zu solchen Baugruppen gehören beispielsweise schnelle Zähler und Positioniermodule.<br />
Normale I/O-Baugruppen sind nicht alarmfähig!<br />
Im folgenden Beispiel wird am Beispiel einer CPU 312IFM, die bereits Onboard einige I/O’s, da<strong>von</strong> 4 Eingänge mit<br />
Alarmfähigkeit besitzt, die wesentlichen Schritte gezeigt.<br />
8.4.1 Alarm-Freischaltung in <strong>der</strong> CPU<br />
Die CPU muß entsprechend parametriert werden, damit die entsprechenden Interruptanfor<strong>der</strong>ungen bearbeitet<br />
werden. Dies geschieht mit dem SIMATIC Manager :<br />
Die betreffende SIMATIC-Station mit rechter Maustaste anklicken, dann ⇒ Objekteigenschaften.<br />
es erscheint das Fenster ‘Hardware-Konfiguration’. Die ausgewählte CPU in <strong>der</strong> rechten Maustaste anklicken,<br />
⇒ Objekteigenschaften ⇒ Integrierte Funktion<br />
Ausgewählt wird die Integrierte Funktion<br />
‚Alarmeingang‘.<br />
Mit ‚Parametrieren‘ wird das nächste<br />
Fenster gewählt, in dem die Bedingungen<br />
zur Freischaltung eines Prozeßalarms<br />
definiert werden können.<br />
Im diesem Beispiel soll <strong>der</strong> Alarm dann<br />
auftreten, wenn entwe<strong>der</strong> am Alarmeingang1<br />
eine steigende Flanke o<strong>der</strong> am<br />
Alarmeingang2 eine fallende Signalflanke<br />
erscheint.<br />
8.4.2 Alarmbearbeitung<br />
Die CPU reagiert auf die Interruptanfor<strong>der</strong>ung <strong>der</strong> peripheren Baugruppe durch Start des OB40. Somit wird man im<br />
OB40 die entsprechenden Anweisungen zur Alarmbearbeitung (Interruptroutine) eintragen.<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 37
Dipl.Ing. Norbert Heinlein<br />
FH Frankfurt, Labor für <strong>Automatisierungstechnik</strong><br />
Literaturangaben<br />
Im Labor für <strong>Automatisierungstechnik</strong> liegen folgenden Handbücher im Zusammenhang mit STEP7 aus. Sie werden<br />
alle <strong>von</strong> <strong>der</strong> Firma <strong>Siemens</strong> AG herausgegeben:<br />
1. Elektronische Handbücher auf CD-ROM (aktuelle Ausgabe)<br />
enthalten als PDF-Dateien die Gesamtdokumentation zu STEP7 und Softwareerweiterungen,<br />
Hardwaredokumentation zu <strong>S7</strong>, SIMATIC NET, WinCC, PC<strong>S7</strong>, WinAC u.a.<br />
(in deutsch, englisch, französisch, spanisch, italienisch)<br />
2. Dokumentationspaket: „STEP7-Grundwissen V5“ enthält die folgenden Handbücher<br />
Getting Started: Erste Schritte und Übungen mit STEP7 V5.0 (1998)<br />
Handbuch: Programmieren mit STEP7 V5.0 (1998)<br />
Handbuch: Hardware konfigurieren und Verbindungen projektieren mit STEP7 V5.0 (1998)<br />
Umsteigerhandbuch: Von S5 nach <strong>S7</strong> (1997)<br />
3. Dokumentationspaket: „STEP7-Referenzhandbücher V5“ enthält die folgenden Handbücher<br />
Referenzhandbuch: Systemsoftware für <strong>S7</strong>-300/400, System- und Standardfunktionen (1998)<br />
Referenzhandbuch: Funktionsplan (FUP) für <strong>S7</strong>-300/400 (1998)<br />
Referenzhandbuch: Kontaktplan (KOP) für <strong>S7</strong>-300/400 (1998)<br />
Referenzhandbuch: Anweisungsliste (AWL) für <strong>S7</strong>-300/400 (1998)<br />
4. Handbuch: SCL für <strong>S7</strong>-300/400, Bausteine programmieren (1996)<br />
5. Handbuch: GRAPH für <strong>S7</strong>-300/400, Ablaufsteuerungen programmieren (1997)<br />
6. Handbuch: Automatisierungssystem <strong>S7</strong>-300, Integrierte Funktionen <strong>der</strong> CPU 312 IFM/ 314 IFM (1996)<br />
7. Handbuch: Automatisierungssystem <strong>S7</strong>-300, Aufbauen einer <strong>S7</strong>-300 (1995)<br />
8. Handbuch: Kommunikation mit SIMATIC (1997)<br />
9. Tabellenheft: Operationsliste (AWL) für <strong>S7</strong>-300, CPU312IFM, CPU313, CPU314<br />
<strong>S7</strong>kurs_2004.doc 27.10.05 Programmieren mit STEP 7 Seite 38