Handbuch_GK473_S7_Profibus_DE.doc 17/32 Baumer IVO GmbH & Co. KG
04.05.11 Villingen-Schwenningen, Germany
4.7 Programmbaustein OB82
Der „Diagnose-Alarm” OB82 "I/O Point Fault" wird im Gegensatz zu seinem Namen nicht bei DP-Slave
Alarm ausgeführt, sondern bei "Warnungen" (Vorliegen Externer Diagnosedaten, keine Statische
Diagnose).
Kommendes und gehendes Ereignis können getrennt ausgewertet werden.
Wenn der OB82 nicht im Projekt eingebunden ist, geht die SPS bei Auftreten eines solchen
Ereignisses in STOP. Um dies zu verhindern genügt es, den OB82 ohne Programmcode einzubinden.
Das nachfolgend beschriebene Programm im OB82 ermittelt zunächst die Logische Basisadresse des
DP-Slaves, der die Warnmeldung ausgelöst hat, speichert diese in Merkerwort 5 und prüft dann, ob es
sich um ein kommendes oder gehendes Ereignis handelt und verzweigt dann in unterschiedliche
Programmteile. In beiden Fällen wird in diesem Beispiel allerdings das gleiche getan. Die
Diagnosedaten (10 Byte) werden konsistent in den Datenbaustein DB20 kopiert. Da dieser Vorgang
mehrere Zyklen lang dauern kann, ist eine Wiederholungsschleife enthalten die SFC13 solange
wiederholt bis der Vorgang abgeschlossen ist (BUSY).
Zu Beginn des Programms wird auf die Ausgangsbaugruppe der S7 (Ausgänge Adr. 4 und 5) ein
charakteristisches Bitmuster geschrieben, so dass das Auftreten von OB82 an den LEDs der S7
sichtbar wird. Die LEDs können per Tastendruck gelöscht werden (siehe OB1).
L W#16#5555 // Visualisierung des Ereignisses auf den
T AW 4 // LEDs der Ausgangsbaugruppe Adr 4
L #OB82_MDL_ADDR // Logische Basisadresse des DP-Slaves
T MW 5
L #OB82_EV_CLASS // Ereignisklasse und Kennungen
L B#16#39 // Kennung kommendes Ereignis
// (B#16#38: gehendes Ereignis)
== I // Gleichheit?
SPB KOMM
GEHT: NOP 0
CALL "DPNRM_DG" // symbolisch für SFC13
REQ :=TRUE
LADDR :=W#16#3FE // Diagnoseadresse 1022=3FEh,
// siehe Hardware Konfig Slave
RET_VAL:=MW20 // beliebiges freies Merkerwort
RECORD :=P#DB20.DBX 0.0 BYTE 11 // Ziel ist Datenblock DB20,
// Beginn Byte 0, Länge 6+5=11 Byte
BUSY :=M1.0 // beliebiges MerkerBit für die Busy Kennung;
// Aufruf wiederholen solange Busy
U M 1.0 // Frage MerkerBit M1.0 ab; setze VKE entsprechend