06.11.2013 Aufrufe

Simatic S7 von Siemens - Portal Automatisierungstechnik der tsm

Simatic S7 von Siemens - Portal Automatisierungstechnik der tsm

Simatic S7 von Siemens - Portal Automatisierungstechnik der tsm

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!