Diplomarbeit

Werbung
DIPLOMARBEIT
Feldbus-Netzwerkmanagement mit SNMP
ausgeführt am Institut für Computertechnik
der Technischen Universität Wien
unter der Anleitung von
o.Univ. Prof. Dr. Dietmar Dietrich
und
Univ. Ass. Dipl. Ing. Richard Schmalek
Univ. Ass. Dipl. Ing. Roman Weisgärber
Univ. Ass. Dipl. Ing. Thilo Sauter
Dr. Manfred Siegl
als verantwortlich mitwirkende Universitätsassistenten
durch
Martin Knizak
Türkenbundgasse 10; 2102 Bisamberg
Matr.Nr. 8525426
Wien, 25. Februar 1999
........................................
(Unterschrift)
Feldbus-Netzwerkmanagement mit SNMP
Abstract
Feldbusse erlauben den Einsatz von einfachen Sensoren und Aktoren ohne großen Overhead an
Protokoll. Um aber auf diese Werte ohne detailiertes Fachwissen zugreifen zu können, erscheint
es wünschenswert, dies an Hand eines weit verbreiteten und leicht verständlichen Protokolls zu
machen. Ein Protokoll das diese Vorzüge besitzt, ist SNMP (Simple Network Management).
In der vorliegenden Ausarbeitung werden die theoretischen Grundlagen dargelegt und aufbauend
auf diese Lösungsmöglichkeiten vorgestellt. Die, für diese Aufgabe am besten geeignete, wurde
aufbauend auf der von Funkamateuren verwendeten Programmsammlung KA9Q auf einem PC
unter MS/DOS implementiert. Da auf einen modularen Aufbau geachtet wurde, können die für
das Feldbussystem PROFIBUS gewonnenen Erkenntnisse leicht auf andere Systeme übertragen
werden.
Die erstellte Anwendung ist kostengünstig und ohne Vorkenntnisse verwendbar. Es handelt sich
aber nicht um ein in zeitkritischen Umgebungen einsetzbares System, da die verwendeten
Protokolle, wie etwa das Internetprotokoll, dies nicht zulassen.
Inhaltsverzeichnis
1. Situationsanalyse
1
2. Aufgabenstellung und Lösungsansatz
5
2.1. Feldbusse .................................................................................... 5
2.2. Netzwerkmanagementprotokolle .................................................. 6
3. Das ISO/OSI Modell
7
4. SNMP und unterlagerte Protokolle
9
4.1. IP ................................................................................................ 9
4.2. UDP.......................................................................................... 12
4.3. SNMP........................................................................................ 13
4.4. Die MIB-Struktur ...................................................................... 15
4.5. Zugriff auf Elemente der MIB.................................................... 17
4.6. ASN.1 (Abstract Syntax Notation One) ...................................... 19
5. Der PROFIBUS
22
5.1. Profibus-FMS (Fieldbus Message Spezifikation) ....................... 22
5.2. Profibus-DP (Dezentrale Peripherie) ........................................ 23
5.3. Profibus-PA (Prozeßautonatisierung)........................................ 23
5.4. Schichten 1 und 2 ...................................................................... 23
5.5. Schicht 7 ................................................................................... 24
6. Analyse der Kopplungsmöglichkeiten
28
6.1. Router mit PROFIBUS-Protokoll .............................................. 29
6.2. Router mit SNMP-Protokoll....................................................... 30
6.3. Gateway .................................................................................... 31
7. Interne Informationsstrukturen
33
7.1. Definition der neuen MIB.......................................................... 34
7.2. Beschreibung in ASN.1.............................................................. 35
8. Grundsätzliche Konzeption der Tasks
43
9. Realisierung der SNMP-Seite
45
9.1. KA9Q ........................................................................................ 45
9.2. Starten des vorhandenen Systems .............................................. 46
I
Inhaltsverzeichnis
9.3. Einfügen eines Tasks in den Kernel ........................................... 47
9.4. Datenstruktur von UDP und Zugriffsverfahren.......................... 49
9.5. Darstellung von ASN.1 Paketen in C-Strukturen........................ 50
9.6. Zugriff auf im System vorhandene Werte ................................... 50
10. Realisierung der PROFIBUS-Seite
54
10.1. Installation der PROFIBUS-Karte........................................... 54
10.2. Test der PROFIBUS-Karte ...................................................... 54
10.3. Projektierung der PROFIBUS-Seite......................................... 55
10.4. Der zweite Teil der Struktur Feld_Knoten................................ 56
10.5. Der PROFIBUS-Task .............................................................. 58
10.6. Zusätze beim SNMP-Task ........................................................ 60
11. Zusammenfassung der gemachten Änderungen
65
12. Der Weg eines Paketes durch das Gateway
67
13. Erstellung einer beispielhaften Anwendung
70
14. Resümee und Aussichten
74
II
Situationsanalyse
1. Situationsanalyse
Noch vor einigen Jahren war ein Stand-alone-Rechner gang und gäbe. Heute jedoch bilden für
sich alleine arbeitende Computer eine Seltenheit. Nicht nur in Firmen und wissenschaftlichen
Einrichtungen ist die Vernetzung üblich geworden, sondern auch in privaten Haushalten wird der
Computer immer öfter via Modem mit anderen Rechnern verbunden. Diese Verbindungen basieren auf den unterschiedlichsten Hardware-Komponenten. Einen gemeinsamen Punkt dieser Vernetzung bildet das Internetprotokoll. Dieses Transportprotokoll ist für nahezu alle Typen von
Rechnern und physikalischen Netzwerken erhältlich. So stellt es kein Problem dar, einen UNIXRechner mit einer Ethernet-Karte und einen MS-DOS-Rechner, der an einen Tokenring angeschlossen ist, über einen Router miteinander zu verbinden. Dies hier in kurzen Worten dargestellte
Gebilde ist allgemein unter dem Begriff Internet bekannt. Falls ein Netzwerk aus Sicherheits- oder
anderen Gründen nicht mit anderen Netzwerken verbunden ist, nennt man es Intranet.
Aber nicht nur in den Bereichen, wo große Datenmengen transportiert werden sollen und die
Übermittlungszeit als unangenehm, aber nicht als kritischer Parameter angesehen wird, hat die
Vernetzung Einzug gehalten. Auch in der Zell- und Feldebene geht man daran, immer mehr zu
vernetzen. In diesen Bereichen handelt es sich um eher kleine Datenmengen, die aber meist in
Echtzeit übermittelt werden müssen. Speziell für diese Bedürfnisse zugeschnitten, wurden eigene
Bussysteme entwickelt - die Feldbusse. Im Gegensatz zum Internet existieren etliche Feldbussysteme, die von Firmen oder Firmengruppen entwickelt worden sind und von diesen unterstützt
und beworben werden. Von einem einheitlichen Standard ist man bei den Feldbussen weit entfernt. Selbst die erste europäische Norm über Feldbusse (EN50170) enthält drei unterschiedliche
Systeme (nämlich PROFIBUS, P-Net und WorldFIP). Ob sich so wie beim Internetprotokoll ein
einheitlicher Standard herausbilden wird, kann aus heutiger Sicht noch nicht gesagt werden. Falls
sich jedoch ein System durchsetzt, muß es mit schon bestehenden wie dem Internet interagieren
können, da es notwendig ist, Feldbusse nicht nur als Insellösungen anzusehen, damit die Vorteile
voll ausschöpft werden.
Um die Abläufe auf einem Feldbus zu protokollieren und unter Umständen auch zu visualisieren,
genügt ein einfacher PC (Personal Computer) mit einer dem Feldbus entsprechenden
Einsteckkarte und einem gängigen Programm, wie zum Beispiel MS-Excel oder Access. Mit
dieser Ausrüstung lassen sich einfache Statistiken leicht und kostengünstig erstellen und auch
graphisch aufbereiten. Ein Nachteil ist hingegen die Konzentration auf einen einzelnen Rechner.
Es lassen sich zwar die Protokolldateien leicht mit Diskette oder auf elektronischem Weg auch
mit anderen Geräten weiterverarbeiten, es bestehen aber viele Vorteile, die eine allgemein
genormte Übermittlung der Rohdaten wünschenswert machen. Eine Einbindung von Feldbussen
in das Internet mittels SNMP ist dabei ein zweckmäßiger Ansatz, da SNMP eine standardisierte,
globale Struktur bietet, die für das Internet maßgeschneidert ist.[SIE95]
1
Situationsanalyse
Diese und ähnliche Überlegungen führen zu dem Schluß, daß es gut wäre, die zwei schon heute
existierenden, aber getrennten Welten des Internets und der Feldbusse zu verbinden. Damit wäre
der Einsatz des jeweils der Situation angepaßten Systems möglich, da man mit dem anderen
ebenfalls darauf zugreifen könnte.
Ein gerne in diesem Zusammenhang erwähntes Beispiel sind Temperatursensoren. Bei mehren
Sensoren, deren Werte man über Internet zugänglich haben möchte gibt es derzeit zwei Wege:
1. Man verbindet jeden Sensor mit einem zentralen Computer. Dies hätte einen enormen Verkabelungsaufwand zur Folge. Weiters müßte dafür gesorgt werden, daß genügend ansprechbare Eingabeports vorhanden wären.
Temperatursensoren
PC
Internet
Abb. 1.1
Temperatursensoren Variante 1
2. Man plaziert neben jeden Sensor einen Computer oder ein anderes Internet-taugliches Gerät.
Dies würde eine große Zahl an Internet Geräten erfordern. Ein weiterer nicht zu unterschätzender Faktor wäre die notwendige Anzahl an Internetadressen, da bei dieser Variante
jeder Sensor eine eigene besitzen müßte.
2
Situationsanalyse
Pc mit angeschlossenem Temperatursensor
Internet
Abb. 1.2
Temperatursensoren Variante 2
Jede dieser beiden extremen Varianten, so wie auch eine Mischung beider, hat bedeutende Nachteile. Eine Lösung dieses Problems bietet die Verbindung der Internets mit einem Feldbus. Alle
Sensoren können dann ohne großen Verkabelungsaufwand an den Feldbus angeschlossen werden.
Der Feldbus selbst ist mit einer Internetadresse ansprechbar und liefert über eine wie auch immer
geartete Verbindung die gewünschten Daten.
3
Situationsanalyse
Temperatursensor mit Feldbusknoten
Feldbus
Internet
PC
Abb. 1.3
Temperatursensoren Variante 3
Die Begriffe PC und Internet stehen hier nur als Synonyme für einerseits ein mit Feldbusanschluß
und LAN Anschluß ausgestattetes Gerät sowie für ein bestehendes Netzwerk zur
Kommunikation.
4
Aufgabenstellung und Lösungsansatz
2. Aufgabenstellung und Lösungsansatz
Auf Grund dieser anfänglich gestellten Überlegungen ergibt sich folgende Ausgangssituation: Eine
Kopplung von Feldbussen und Internet-Geräten wird angestrebt. Die folgenden Seiten werden
ausgehend von diesem Erfordernis zeigen welche Möglichkeiten sich bieten, welche Vorteile sie
verheißen und welche Schlüsse daraus zu ziehen sind.
Primäre Aufgaben, die sich stellen, sind:
• Art der Einbindung ins Inter- oder Intranetz
• Auswahl des Feldbussystems
• Ausgehend von diesen Erkenntnissen ergibt sich eine ausgearbeitete Implementation
Da es nicht zielführend ist, grundlegende Überlegungen auf eine spezielle Implementierung auszurichten, wurde ein PC als Kopplgerät gewählt. Für dieses Gerät existieren eine Menge von
Programmen, die leicht und kostengünstig zu erwerben sind. Weiters sind für fast alle Feldbusse
PC-Einsteckkarten am Markt. Dies schränkt die Auswahl des Systems nicht ein. Die Programmiersprache C, die gewählt wurde, ist weit verbreitet, und für die unterschiedlichste Hardware
gibt es C-Compiler. Obwohl es verschiedene Varianten davon gibt, kann man davon ausgehen,
daß eine Portierung auf andere Systeme möglich ist, wenn man versucht, alle compilerspezifischen
Befehle zu vermeiden und nur Ansi C-Befehle verwendet. Diese Voraussetzungen ermöglichen
auch, die gesamte Implementierung mit Ausnahme der Hardwaretreiber auf anderen Systemen als
PCs unter MSDOS zu verwenden. Das als Grundlage verwendete Programmpaket hat als
weiteren Vorteil, daß es auch auf UNIX, CPM und Amiga-Geräten funktionsfähig ist.
2.1. Feldbusse
Um den unterschiedlichen Anforderungen der Anwender gerecht zu werden, entstanden speziell
auf einfache Sensoren und Aktuatoren sowie auf kurze Reaktionszeiten zugeschnittene Vernetzungssysteme für die Feldebene, die Feldbusse. Derzeit sind mehrere unterschiedliche Systeme
dabei, international genormt zu werden. Drei dieser Systeme sind bereits in einer europäischen
Norm zusammengefaßt. Dies sind P-Net, PROFIBUS und World-FIP. Zusätzlich zu diesen in der
EN50170 [EN50170] genormten Bussen gibt es noch Interbus-S, CAN und LON, um nur einige
zu nennen. Viele Firmen verwenden auch proprietäre Systeme.
Die Struktur dieser Systeme ist sehr unterschiedlich. Eine grobe Einteilung kann beispielsweise
durch die Anzahl der Master-Stationen getroffen werden. Die Monomastersysteme wie etwa
PROFIBUS-DP und -PA oder Interbus-S bieten größere Geschwindigkeiten und einfachere
5
Aufgabenstellung und Lösungsansatz
Programmierung. Sie sind jedoch zentral ausgerichtet und damit sehr von der Funktionfähigkeit
der Masterstation abhängig. Eine Verteilung der Aufgaben auf mehrere intelligente Geräte ist
nicht möglich. Multimastersysteme wie PROFIBUS-FMS, P-Net oder LON haben zwar nicht die
große Geschwindigkeit, aber bei Ausfall eines Masters bleibt der Rest des Systems funktionsfähig.
Eine Modularisierung und Verteilung der Aufgaben auf verschiedene Geräte ist nicht nur
möglich, sondern Grundidee dieser Systeme.
Bei der Auswahl des Feldbusses wurde ein zum Zeitpunkt der Erstellung schon genormtes System
verwendet, da die zukünftige Entwicklung der anderen Systeme nicht vorhergesagt werden kann.
Von diesen Systemen ist PROFIBUS das im deutschsprachigen Raum verbreitetste und wurde
deshalb für die Implementierung verwendet. Eine Erweiterung des Konzeptes auf andere
Bussystemen ist nach derselben Strategie leicht möglich.
Da PROFIBUS in mehreren Varianten erhältlich ist, bleibt noch die Frage offen welche letztendlich für die Implementierung ausgewählt werden sollte. Da PROFIBUS-FMS im Normalfall
aus mehreren Mastern und auch mehreren Slaves besteht, die anderen Varianten aber nur aus
einem Master bestehen, kann man aus dem FMS-Spezialfall mit nur einem Master die Grundstruktur für alle anderen ableiten. Die sich ergebenden programmtechnischen Änderungen werden
im entsprechenden Abschnitt noch genauer erörtert.
2.2. Netzwerkmanagementprotokolle
Nachdem das Feldbussystem ausgewählt ist, bleibt noch die Frage, wie die Information auf der
Internetseite verfügbar sein und dargestellt werden soll. Da es sich um Werte eines Netzwerkes
handelt, liegt es nahe, die verschiedensten Tools und Protokolle des Internets auf ihre Tauglichkeit für diesen Zweck zu untersuchen.
Die einfachsten Netzwerktools wie etwa ping und traceroute helfen nur, den Weg durch das Netz
bzw. die Existenz einer anderen Station zu erkunden. Um die Netzwerkskonfiguration oder Werte
zu erfragen, sind effizientere Werkzeuge und Protokolle nötig. Diese stellen dann auch eine gute
Strukturierung ihrer Werte zur Verfügung. Die zwei bekanntesten Protokolle sind CMIP
(Common Management Information Protokol) und SNMP (Simple Network Management
Protokol). SNMP ist das ältere und stellt die Werte in einem hierarchisch geordneten Namensraum dar. Der Nachteil dieses Protokolls ist, daß es nicht genau in das OSI- Modell paßt. Der
Vorteil ist, daß es weit verbreitet und einfach aufgebaut ist. CMIP ist ein von ISO genormtes
Protokoll. In CMOT wird beschrieben, wie CMIP für das Management von TCP/IP Netzen
verwendet werden kann. Wie SNMP verwendet es ebenfalls einen Namensraum zur Darstellung
des Netzes. Die Vorteile sind die Normung und die Konformität zu ISO. Nachteilig ist die geringe
Verbreitung. Der Verbreitung wegen, die die Nachteile bei weitem aufwiegt, wurde für die
Implementierung SNMP ausgewählt.
6
Das ISO/OSI Modell
3. Das ISO/OSI Modell
Um den Austausch von Daten zwischen Rechnern zu ermöglichen, erstellte man um 1980 von der
International Organisation of Standartisation (ISO) ein Referenzmodell, das rechnerunabhängig
war. Das so entstandene, noch keine spezielle Implementierung fordernde OSI (Open Systems
Interconnection)-Modell ist in 7 Schichten unterteilt. Jede Schicht stellt der darüberliegenden ihre
Dienste zur Verfügung und nimmt die der darunterliegenden in Anspruch. Da eine
Kommunikation immer zwischen den beiden Partnerschichten stattfindet und die Daten ohne
inhaltliche Interpretation von der darunterliegenden Schicht als „black box“ übertragen werden,
steigt beim Hinunterwandern der Date die Länge des Paketes immer mehr an (ausgenommen es
muß ein Paket auf Grund der maximalen Länge geteilt werden, dann steigt nur die Gesamtsumme
der Längen an). Bei der Partnerstation wird das Datenpaket wie eine Zwiebel geschält, bis in der
Partnerschicht nur mehr die Nutzdaten, oder die der darüberliegenden Schicht zu übergebenden
Daten plus eigene Informationen vorhanden sind.
Schicht 7
Anwendungsschicht
(application layer)
Schicht 6
Darstellungsschicht
(presentation layer)
Schicht 5
Sitzungsschicht
(session layer)
Schicht 4
Tranportschicht
(transport layer)
Schicht 3
Vermittlungsschicht
(network layer)
Schicht 2
Sicherungsschicht
(data link layer)
Schicht 1
Bitübertragungsschicht
(physical layer)
Abb. 3.1
OSI 7-Schichten-Modell
Das OSI-Modell unterteilt die Datenübertragung in folgende Schichten:
Schicht 7: Anwendungsschicht (application layer)
7
Das ISO/OSI Modell
Hier werden dem Anwendungsprozeß die von ihm verstandenen logischen Einheiten
wie Files Variablen usw. angeboten. Kopplungen auf dieser Ebene werden Gateways
genannt.
Schicht 6: Darstellungschicht (presentation layer)
Eine eventuell notwendige Anpassung der Datenformate (andere Reihenfolge der
Felder oder Bytes), aber auch eine gewünschte Verschlüsselung der Daten fallen in den
Aufgabenbereich dieser Schicht.
Schicht 5: Sitzungsschicht (session layer)
Aufgabe dieser Schicht ist es, einen geregelten Kommunikationsablauf zwischen den
beiden Kommunikationspartnern sicherzustellen. Ebenfalls in den Aufgabenbereich
fallen Synchronisation und Wiederholung bei Unterbrechung.
Schicht 4: Transportschicht (transport layer)
In diesem Layer wird die entweder verbindungsorientierte oder verbindungslose
Kommunikation für die darüberliegenden Schichten zur Verfügung gestellt. Zur
darunterliegenden Schicht werden Pakete in der für das Netz verträglichen Größe
weitergereicht.
Schicht 3: Vermittlungsschicht (network layer)
Hier wird der Weg der Datenpakete durch das Netz geregelt. Routingalgorithmen, die
den Weg nach etwa der Zeit oder den Kosten optimieren, leiten in dieser Schicht die
Datenpakete weiter. Geräte, die nur bis zu dieser Schichte implementiert sind, werden
Router genannt.
Schicht 2: Sicherungsschicht (data link layer )
Im Gegensatz zu der darüberliegenden Schicht findet hier eine Sicherung der Übertragung auf genau einer Teilstrecke statt. Auftretende Fehler sollten erkannt und
behoben werden. Bridges sind Koppl-Geräte, die nur bis zu dieser Schicht
implementiert sind.
Schicht 1: Übertragungsschicht (physical layer)
In dieser Schicht erfolgt nur die Definition der physikalischen Übertragung, jegliche
Korrektur ist höheren Schichten vorbehalten. Wenn aus übertragungstechnischen
Gründen ein Netz auf dieser niedrigen Ebene geKopplt werden muß, so macht man dies
mit einen Repeater.
8
SNMP und unterlagerte Protokolle
4. SNMP und unterlagerte Protokolle
SNMP setzt in der Schicht 4 auf das UDP auf. Es gibt Varianten, bei denen TCP verwendet wird.
Dies hat jedoch den Nachteil, daß einerseits eine Verdopplung der in dieser Schicht übertragenen
Header-Daten stattfindet, andererseits zwischen diesen Schichtendpunkten eine verbindungsorintierte Verbindung aufgebaut werden muß. Dies ist insbesondere deshalb von Nachteil, weil
SNMP auch zur Fehleranalyse und Beseitigung verwendet wird.
4.1. IP
Eines der gebräuchlichsten Netzwerke ist das Ethernet; deshalb wurde bei der hier beschriebenen
Implementierung auf dieser Basis aufgebaut. Dies ist jedoch keine Einschränkung, da über die
genormten Schnittstellen das darauf aufsetzende IP (Internet Protokol) [RFC791] mit jeder
anderen Hardware verwendet werden kann. Das IP hat, wie auch schon der Name vermuten läßt,
etwas mit dem Internet zu tun. Es repräsentiert den Netzwerklayer im OSI Modell. Das in dieser
Schicht stattfindende Routing wird an Hand der bekannten Internetadressen bewerkstelligt
[HUI96].
IP-Paket-Format
Version
Header
Länge
Art des Services
Gesamtlänge
Identifikation
time to live
Flags
Protokoll
Fragment Offset
Kopf-Prüfsumme
Internet Quell Adresse
Internet Ziel Adresse
Optionen
Daten
Abb. 4.1
9
IP-Paket
SNMP und unterlagerte Protokolle
IP, das Internetprotokoll, ist ein der Netzwerkschicht (OSI-Schicht 3) zuzuordnendes Protokoll,
das folgende Felder enthält (Abb. 4.1):
1. Version: Dieses Feld enthält die Versionsnummer des IP, das dieses Paket generiert hat. Pakete
mit einer anderen Nummer als der eigenen Versionsnummer werden verworfen. Derzeit ist die
IP-Version 4 aktuell.
2. Header-Länge: Angabe, aus wie vielen Byte der Header (IP-Paket ohne Daten) besteht. Das
Minimum ist 20 Bytes.
3. Art des Services: Hiermit wird die für dieses Paket Qualität des Services angegeben, die die
Priorität und die Verwendung - wie etwa, daß dieses Paket zur Netzwerkkontrolle bestimmt ist
- angibt. Folgende Arten sind definiert: Network Control, Internetwork Control, CRITIC/ECP,
Flash Override, Flash, Immediate, Priority und Routine. Die verbleibenden 2 Bits geben Delay
(normal oder low) und Throughput (normal oder high) an.
4. Gesamtlänge: Das ist die Länge des Headers plus der Daten, angegeben in Bytes. Das 16-BitFeld läßt 65 535 Bytes als Länge zu, verpflichtend muß ein Gerät aber nur Pakete mit einer
Gesamtlänge von 576 Byte verarbeiten können.
5. Identifikation, Flags und Fragment Offset dienen dazu, wegen ihrer Größe vom Sender
zerlegte Datagramme wieder zusammenzusetzen.
6. Time to live: Dieses Feld hilft, „verirrte“ Pakete aus dem Netz zu entfernen, da das Paket
vernichtet wird, wenn dieses Feld den Wert 0 erreicht hat.
7. Protokoll: Hier wird angegeben, wie die Daten zu interpretieren sind, das heißt für welches auf
IP aufsetzende Protokoll sie gedacht sind. Die wichtigsten sind 1, (Internet Control MessageProtocol), 6, (Transmission Control Protocol) und 17 (User-Datagramm-Protocol).
8. Kopf-Prüfsumme: Um die Fehlerfreiheit zu überprüfen wird auch alleine über den IP-Haeder
eine Prüfsumme gebildet.
9. Quell- und Zieladresse: Hier befinden sich die Internetadressen, die Umsetzung in die
hardwareeigenen Adressen erfolgt erst in den darunterliegenden Schichten.
10. Optionen: In diesem Feld können bis zu 40 Byte an Informationen untergebracht werden.
Hierbei handelt es sich meist um Routing- und Sicherheitsfunktionen.
IP ist hardwareunabhängig und kann damit auf verschiedene Schichten 1 und 2 (z. B. Ethernet,
Token Ring, FDDI) aufgesetzt werden. In seinem Header sind unter anderem die allgemein
bekannten Internetadressen angegeben, die eine weltweit eindeutige Identifizierung eines
Netzwerkteilnehmers erlauben. Meist wird IP in der Kombination TCP/IP [MAR94] verwendet.
Dies ist der Unterbau für Programme wie Ping, Telnet, FTP und Rlogin, die verbindungsorientierte Dienste benötigen. TCP [RFC793], das Transmission Control Protocol, ein Protokoll
der Schicht 4 (Transportschicht), stellt den Verbindungsaufbau her. TCP stellt dem Benützer
10
SNMP und unterlagerte Protokolle
dieser Schicht eine verbindungsorientierte Punkt-zu-Punkt Verbindung zur Verfügung. Dazu sind
die Zerlegung eines Datenstroms bei der Quelle und eine Rückwandlung am Ziel notwendig.
Quell Port Adresse
Ziel Port Adresse
Laufende Nummer
Bestätigungs Nummer
Daten Offset
Flags
Fenstergröße
Prüfsumme
Urgent Pointer
Optionen
Daten
Abb. 4.2
TCP-Paket
Die Felder des TCP-Kopfes (Abb. 4.2) sind:
1. Die Adresse des Quell- und des Ziel-Ports. Damit läßt sich bestimmen, für welches Service
diese TCP-Verbindung verwendet wird. Die wichtigsten Ports sind 20 für FTP file-tranfer, 21
für FTP-Kontrolldaten, 23 für Telnet-Sitzungen und 25 für SMTP.
2. Die laufende Nummer gibt die Nummer der ersten im Datenfeld enthaltenen Bytes an. Damit
ist es möglich, die einzelnen Pakete wieder zusammenzusetzen.
3. Die Bestätigungsnummer gibt die nächste vom Partner erwartete laufende Nummer an. Damit
wird die Flußkontrolle durchgeführt.
4. Der Daten-Offset ist die Länge des TCP-Headers gemessen in 32-Bit-Wörtern.
5. Die Flags steuern die Operationen des Protokolls.
6. Die Fenstergröße, die auch jedes Mal mit übertragen wird, hilft bei der Flußsteuerung. Damit
wird angegeben, wie viele Pakete gesendet werden dürfen, ohne eine Bestätigung erhalten zu
haben. Damit kann die Geschwindigkeit der beiden Partner aufeinander abgestimmt werden.
7. Die Prüfsumme dient zum Auffinden von Übertragungsfehlern.
8. Der Urgent Pointer
11
SNMP und unterlagerte Protokolle
9. Im Optionen-Feld können weitere Zusatzbedingungen für das Protokoll, wie etwa die
maximale Segmentgröße, definiert werden.
Dem Kopf folgen die zu übermittelnden Daten. Obwohl TCP verbindungsorientierte Dienste
anbietet, ist das darunter liegende IP selbst ein verbindungsloses Protokoll.
Um den Aufwand zur Wartung eines Netzwerks gering zu halten, verwendet man statt TCP das
User Datagram Protocol (UDP), das verbindungslos arbeitet. Im Gegensatz zu TCP, das einen
Header von mindestens 20 Byte benötigt (die Optionen können es noch verlängern), kommt UDP
mit einem Minimum von 8 Byte aus. Dieser Header enthält nur die wichtigsten Daten von Quelle
und Ziel.
4.2. UDP
Das User Datagram Protocol ist ein einfaches auf IP aufsetzendes Protokoll, das außer einem
Quell- und Ziel-SAP nur noch eine Prüfsumme und eine Kontrollnummer für jedes Paket enthält.
Wie eingangs erwähnt, ist UDP [RFC768] ein verbindungsloses Protokoll. Ob eine Zustellung
erfolgte oder nicht muß also vom Anwender in geeigneter Form sichergestellt werden. In dem hier
betrachteten Fall stellt UDP eine (die) einfache Verbindung zum Internetlayer dar.
Quell Port Adresse
Ziel Port Adresse
Länge
Prüfsumme
Daten
Abb. 4.3
UDP-Paket
Die einzelnen Felder des UDP-Protokolls haben folgende Bedeutung:
1. Nummer des Quell- und Ziel-Ports. Damit kann festgelegt werden, für welche Anwendung die
Daten bestimmt sind. Die wichtigsten sind:
7 echo ... Sendet ein empfangenes Datenpaket zurück zum Sender,
53 Nameserver ... über diesen Prozeß werden die Namen der Netzwerkstationen administriert,
67 Bootps ... über dieses Port kann eine Konfiguration hinuntergeladen werden,
68 Bootpc ... hier werden die eingehenden Konfigurationen empfangen,
69 TFTP ..ist ein einfaches (nicht das verbindungsorientierte) File Transportprotokoll,
12
SNMP und unterlagerte Protokolle
123 NTP ... ist das für die Systemzeit zuständig Protokoll,
161 SNMP ... ist das Eingangsport für Netzwerkmanagement-Anfragen,
162 SNMP ... dieses Port ist als Eingang für Traps reserviert.
Die beiden letzten sind die für SNMP wichtigen Eingangs-Ports. Als Ausgang-Port kann jedes
beliebige, noch nicht vergebene Port verwendet werden. Wichtig ist nur, daß die Antwort an
das gewählte zurückgeschickt wird.
2. Die Länge des gesamten UDP-Paketes (Daten plus Header) wird in Bytes angegeben. Das ist
die Länge der Daten plus acht.
3. Die Prüfsumme hilft, Übertragungsfehler zu erkennen.
4. Das Datenfeld enthält die von der darüberliegenden Schicht übergebenen Daten.
Wie man auch an den über UDP laufenden Diensten sieht, eignet es sich für kurze Nachrichten,
bei denen auf einen Verbindungsauf- und abbau zur Herstellung einer verbindungsorientierten
Kommunikation verzichtet wird.
4.3. SNMP
Das Simple Network Management Protocol ist ein einfaches, zur Netzwerk Administrierung
geeignetes Protokoll. Obwohl SNMP [RFC1157] in den späten 80er Jahren durch CMIP ersetzt
werden sollte, erfreut es sich bis heute einer großen Beliebtheit. Die große Verbreitung und die
geplante Erweiterung zu SNMPv2 gibt diesem Protokoll einen Vorsprung, der von den anderen
zwar auf dem Papier existierenden aber kaum verbreiteten, vielleicht auch besseren in nächster
Zeit nicht aufgeholt werden wird.
Bei der Implementierung von SNMP unterscheidet man zwischen Managementstationen und den
ihnen zugeordneten Agenten. Zwischen diesen beiden Arten von Stationen findet die Kommunikation statt.
Die Kommunikation zwischen diesen wird über 5 verschiedene PDUs (Protocol Data Unit)
realisiert. Dies sind GetRequest und GetNextRequest, durch die eine Management-Station einen
oder mehrere Werte aus einem Agenten holt; SetRequest setzt einen Wert in einem Agenten. Die
restlichen 2 PDUs werden vom Agenten zum Manager gesendet. GetResponse kommt als
Antwort auf eine Get- oder Set-Aktion des Managers (Abb. 4.4).
13
SNMP und unterlagerte Protokolle
Version
PDU-Type
Abb. 4.4
Community
Daten
AnfrageNummer
Error
Status
Error
Index
Nutzdaten
Objekt 1
Wert 1
Objekt 2
Wert 2
Objekt 3
Wert 3
Objekt n
Wert n
SNMP Paket Struktur für Get-, GetNext-, SetRequest und GetResponse PDU
Die Trap-PDU (Abb. 4.5) gibt dem Agenten die Möglichkeit, selbst die Initiative zu ergreifen und
spezielle Ereignisse seinem Manager anzuzeigen.
Version
PDU
Type
Enterprise
Community
AgentenAdresse
Abb. 4.5
Daten
Trap-Art
generell
Trap-Art
speziell
Objekt 1
Wert 1
Objekt 2
Wert 2
Objekt 3
Wert 3
Objekt n
Wert n
SNMP Paket Trap PDU
14
Timestamp
Nutzdaten
SNMP und unterlagerte Protokolle
4.4. Die MIB-Struktur
In der MIB (Managemen Information Base) [RFC1156] sind die für ein Netzwerk oder für eine
Komponente eines Netzwerks wichtigen Parameter hierarchisch in einer Baumstruktur angeordnet. (Abb. 4.6) Die Zahlen geben eine laufende Nummer innerhalb der Hierarchiestufe an und
können austauschbar mit der alphanumerischen Bezeichnung verwendet werden.
\
ccitt(0)
iso(1)
joint-iso-ccitt(2)
org(3)
dod(6)
internet(1)
mgmt(2)
experimental(3)
private(4)
snmpV2(6)
snmpModules(3)
mib-2(1)
system(1)
sysDescr(1)
sysObjectID(2)
sysUpTime(3)
sysContact(4)
sysName(5)
sysLocation(6)
sysServices(7)
enterprises(1)
interfaces(2)
ifNumber(1)
universitiesOfAustria(1093)
ifTable(2)
tuwien(51)
ifEntry(1)
fieldBus(6)
ifIndex(1)
ifDescr(2)
iso.org.dod.internet.mgmt.mib-2.system.SysUpTime
1.3.6.1.2.1.1.3
iso.org.dod.internet.private.enterprises.universitiesOfAustria.tuwien.fieldBus
1.3.6.1.4.1.1093.51. fieldBus number e.g. 6
Abb. 4.6
MIB-Struktur
Gewisse Objekte wie beispielsweise SysUpTime müssen in jeder Implementierung vorhanden sein.
Um ein Gerät als SNMP-tauglich bezeichnen zu können, müssen je nach Art des Gerätes folgende
Gruppen entweder ganz oder gar nicht implementiert sein (Knoten, die Bestandteil der MIB-II
[RFC1213] - einer Erweiterung der ursprünglichen MIB - sind werden kursiv geschrieben):
system
In dieser Gruppe befinden sich eine Systembeschreibung (sysDescr), ein Verweis auf den
Hersteller (sysObjectID), die Zeit, wie lange diese Station schon in Betieb ist
15
SNMP und unterlagerte Protokolle
(sysUpTime), der Name einer Kontaktperson (sysContact), der Name des Gerätes
(sysName), eine Beschreibung des physikalischen Standorts (sysLocation) und ein
Codes, welche Service dieses Gerät zur Verfügung stellt (sysService).
Interfaces
In dem Bereich befinden sich eine Variable, die angibt, wie viele Interfaces das Gerät
besitzt (ifNumber), und eine Tabelle, in der genauere Informationen über diese enthalten
sind (ifTable).
At
Die Gruppe, die Adress-Übersetzungs-Gruppe, wurde in der MIB-II den einzelnen
Protokollen beigefügt. Sie besteht aus einer Tabelle, die eine Zuordnung zwischen IPund physikalischer Adresse angibt.
IP
In der Internetprotokollgruppe wird angegeben, ob es sich um einen Host oder um ein
Gateway handelt (ipForwarding), wie die default TTL lautet (ipDefaultTTL), wie viele
Datagramme empfangen worden sind (ipInReceives), wie viele davon einen Fehler im
Format (ipInHdrErrors) oder bei der Adresse (ipInAddrErrors) hatten, wie viele Pakete
weitergeleitet wurden (ipForwDatagrams), wieviele an ein unbekanntes Protokoll
gesendet wurden (ipInUnknownProtos), wieviele aus Resourcenmangel verworfen
werden mußten, wie viele tatsächlich zugestellt werden konnten (ipInDelivers) und
ähnliche statistische Werte für die hinausgehenden Pakete. Weiters befinden sich hier
eine Tabelle, die die Internetadressen des Knotens verwaltet (ipAddrTable), einer
Tabelle für Routingfunktionen (ipRoutingTable) und einer Tabelle für die Zuordnung
von physikalischer zu Internet-Adresse.(ipNetToMediaTabele)
ICMP
Die Internet ControlMessageProtocol-Gruppe enthält nur Zähler äquivalent zu denen der
IP-Gruppe.
TCP
Die TransmissionControlProtocol-Gruppe enthält außer den statistischen und den für das
Protokoll wichtigen Werten eine Tabelle, die über die TCP verwendenden Aplikationen
Auskunft gibt (tcpConnTable).
UDP
Die Gruppe gibt Auskunft über die hereingekommenen Pakete (udpInDatagrams), wie
viele davon eine unbekannte Portadresse (udpNoPort) oder einen Formatfehler
(udpInErrors) hatten und wie viele Pakete diese Schicht Richtung Netzwerk verlassen
haben. Weiters ist eine Tabelle mit der Zuordnung von lokalem Port zu lokaler Internetadresse enthalten (udpTable).
EGP
Diese Gruppe Muß nur für Geräte, die das Exterior Gateway Protocol implementiert
haben, eingerichtet werden.
Transmission
Die Gruppe stellt einen Platzhalter für medienspezifische MIBs in der MIB-II dar.
SNMP
Die Gruppe gibt statistische Auskunft über SNMP-Pakete. Es werden die hereinkommenden und hinausgehenden fehlerhaften Pakete nach Fehlerkategorien gezählt:
zu lange PDU
(snmpInTooBigs)
kein solcher Name vorhanden
(snmpInNoSuchName) (snmpOutNoSuchName)
Wertformat falsch
(snmpInBadValues)
(snmpOutBadValues)
Schreibzugriff nicht erlaubt
(snmpInReadOnly)
(snmpOutReadOnly)
Fehler beim Generieren des Paketes (snmpInGenErrs)
16
(snmpOutTooBigs)
(snmpOutGenErrs)
SNMP und unterlagerte Protokolle
Ebenfalls wird Auskunft über die Anzahl der eingelangten Get (snmpInTotalReqVars)
und Set-Anfragen (snmpInTotalSetVars) gegeben. Letztendlich kann man auch
Autentication Traps erlauben und verbieten (snmpEnableAuthTraps).
Für das hier entworfene Gateway sind, um es SNMP-tauglich zu machen, die Gruppen System,
Interfaces, Address Translation, IP, ICMP, UDP und SNMP zu implementieren. Die restlichen
Gruppen müssen nach der jeweiligen Konfiguration von KA9Q bei Bedarf noch dazugefügt
werden, wenn die den fehlenden Gruppen zugeordneten Protokolle konfiguriert werden.
Im private-Zweig können eigene Objekte definiert werden. Diese können also für die Darstellung
von Feldbusknoten verwendet werden. Damit ist der Feldbus fest im Namensraum verankert.
Solange er im private-Unterzweig der TU-Wien angesiedelt ist, sind noch alle Freiheiten der
Definition offen. Eine Verschiebung in den Management-Unterzweig würde die Definition
weltweit gültig machen, bedarf jedoch einer internationalen Zustimmung.
4.5. Zugriff auf Elemente der MIB
Um auf Elemente der MIB zugreifen zu können, muß man entweder den GetRequest- oder den
GetNextRequest-Befehl verwenden.
Sys-MIB ....... 1.3.6.1.2.1.1
Sys-MIB.sysContact
Sys-MIB.sysName
Sys-MIB.sysLocation
..........
..........
..........
get(Sys-MIB.sysContact.0)
liefert
getnext(Sys-MIB.sysContact.0) liefert
getnext(Sys-MIB.sysLocation.0) liefert
Knizak
PC74
Kompetenzzentrum
Knizak
PC74
Kompetenzzentrum
getnext(Sys-MIB.sysContact)
Beispiel 4.1
liefert
Knizak
MIB-Adressierung von einfachen Variablen
Um den ersten verwenden zu können, muß man auf das MIB Element genau zugreifen. Das
bedeutet bei einfachen Variablen wie etwa der SysUpTime, daß man dem Pad (Namen) eine ".0"
als Identifier anhängen muß (Beispiel 4.1). Mit dem GetNextRequest-Befehl wird jeweils auf das
nächstfolgende Element im Namensraum zugegriffen. Dieser Befehl erlaubt es, die gesamte MIB
zu durchsuchen, ohne die einzelnen Elemente genau zu kennen. Es wird dabei nicht nur innerhalb
eines Unterbaums gesucht, sondern auch zum nächsten gewechselt.
Bei Tabelleneinträgen steht hinter dem Namen ein das gewünschte Tabellenelement eindeutig
identifizierender Ausdruck. Dies kann eine einzelne Zahl sein oder auch eine, in der üblichen
17
SNMP und unterlagerte Protokolle
punktierten Schreibweise dargestellte, Internetadresse oder Kombinationen von beiden und noch
mehr (Beispiel 4.2).
Interfaces-MIB ....... 1.3.6.1.2.1.2
get(Interfaces-MIB.1.ifDescr.1)
liefert die verbale Beschreibung des ersten
Interfaces
getnext(Interfaces-MIB.1.ifDescr.1)
liefert die verbale
Beschreibung des zweiten
Interfaces
oder
get(Interfaces-MIB.1.ifDescr.2)
Beispiel 4.2
MIB-Adressierung einer einfachen Tabelle
Ein weiterer Vorteil des GetNext-Befehls ist, daß die Adresse des ausgelesenen Wertes mitgeliefert wird. Damit weiß man, ob man sich noch in der Tabelle befindet, oder schon, da man das
Ende erreicht hat, im nächsten Element. Wenn die eindeutige Identifizierung einer Internetadresse
bedarf, erhält man bei der Abfrage des Status mit getNext auch gleich mitgeliefert, um welche
TCP-MIB
.................
TCP-MIB.13.1.1
1.3.6.1.2.1.6
steht für den Status in der TCP Verbindungstabelle
GetNext(TCP-MIB.13.1.1)
liefert den Status des ersten Eintrags in dieser
Tabelle, gleichzeitig werden auch die zur
Identifikation notwendigen Parameter geliefert, mit
denen der Status des nächsten Tabelleneintrages
gelesen werden kann
Beispiel an zurückgelieferten Daten:
lokale
lokale
remote
remote
Internetadresse
Portadresse
Internetadresse
Portadresse
128.130.80.61
1090
128.130.80.57
1040
zu dieser Verbindung wird der Status angegeben.
Der Aufruf des Status der nächsten Verbindung lautet:
GetNext(TCP-MIB.13.1.1.128.130.80.61.1090.128.130.80.57.1040)
Beispiel 4.3
MIB-Adressierung in einer komplexeren Tabelle
Verbindung es sich handelt [ROS91].
18
SNMP und unterlagerte Protokolle
Durch diese Art der Verwendung des GetNext-Befehles werden viele notwendige Informationen
automatisch ohne eigens dafür notwendige Anforderung mitgeliefert (Beispiel 4.2).
4.6. ASN.1 (Abstract Syntax Notation One)
Um SNMP Pakete übertragen zu können, braucht man zusätzlich zu der Struktur der MIB und
den generellen Regeln von SNMP eine genaue Anleitung, wie diese Nachrichten zu codieren sind.
Bei SNMP wurde dazu nichts Neues geschaffen, sondern man verwendet einen Teil von ASN.1.
Ohne hier genauer auf ASN.1 einzugehen, kann man sich die codierten Ausdrücke dreigeteilt
vorstellen. Das erste Feld enthält, um welche Art von Daten es sich handelt, das mittlere Feld gibt
die Länge an, und zuletzt folgt der Wert selbst. Diese Struktur wird auch bei größeren Einheiten
beibehalten. Dann heißt das ganze Typ „Sequence of“, gefolgt von der Länge und dann den
Daten, die wie beschrieben auch in Typ, Länge und Wert codiert sind.
seqence
of
Abb. 4.7
Länge:14
Daten
OID
Länge: 7
43.6.1.2.1.1.1
INTEGER
Länge: 1
16
NULL
Länge: 0
ASN.1 schematisch (sysuptime, 16, Nullwert)
In Abb. 4.7 sind zwei Besonderheiten enthalten. Normalerweise beginnt die OID mit 1.3. Da aber
in diesen Hierachieebenen nur wenige Unterzweige vorhanden sind, werden diese beiden nach der
Formel: erste Ebene mal 40 plus zweite Ebene zusammengefaßt. Der Nullwert wird dazu
verwendet, wenn man für irgend etwas einen Wert zur Codierung laut ASN.1 braucht, ihn aber
nicht kennt.
Ein Teilaspekt, nämlich nicht die formale Beschreibung, sondern die genaue Codierung der
einzelnen Datentypen soll hier näher beschrieben werden, da sie für das Verständnis der CProgramme nötig ist. Wie anfangs erwähnt, kommt zuerst der Typ, dann die Länge und dann der
Wert. Der Typ ist ein Byte lang. Die ersten beiden Bits geben die Art des Typs an: universial,
applikationsweit, contextspexifisch oder privat. Darauf folgt, ob es sich um einen zusammengesetzten Typ handelt oder nicht. Die letzten fünf Bit geben die Nummer des Typs innerhalb der
festgelegten Gruppe an (Beispiel 4.4).
19
SNMP und unterlagerte Protokolle
Beispiele aus der Klasse Universal:
INTEGER
STRING
NULL_TYP
OID
SEQUENCE
0x02
0x04
0x05
0x06
0x30
Beispiele aus der Klasse Contextspezifisch:
GETREQUEST
GETNEXTREQUEST
GETRESPONSE
SETREQUEST
TRAP
codiert
0xA0
0xA1
0xA2
0xA3
0xA4
Nummer innerhalb der Klasse
0
1
2
3
4
Beispiel 4.4
ASN.1-Klassen
Nach dem Typenfeld folgt die Länge. In ASN.1 existieren zwei Formen, die bestimmte und die
unbestimmte. Bei der unbestimmten wird das Ende durch zwei Nullen angezeigt (Beispiel 4.3).
SNMP verlangt aber, daß immer die bestimmte Form verwendet wird. Diese Form kann immer in
einer langen Form dargestellt werden. Im ersten Byte ist das höchste Bit auf Eins gesetzt. Die
weiteren geben in vorzeichenloser Integerdarstellung die Anzahl der folgenden Bytes an. Die
durch diese Bytes definierte Zahl gibt nun den endgültigen Wert der Länge an. Bei Zahlen kleiner
als 128 kann statt dieser Darstellung auch eine kurze Form verwendet werden. Da bei diesen
Zahlen das höchste Bit Null ist, kann gleich im ersten Byte die Länge angegeben werden
[GOR92].
20
SNMP und unterlagerte Protokolle
Beispiel Längenangabe:
Länge Integer
Bitdarstellung
Hex-Darstellung
Kommentar
1
1
6
6
127
127
00000001
10000001 00000001
00000110
10000001 00000110
01111111
10000001 01111111
01
81 01
06
81 06
7F
81 7F
kurze
lange
kurze
lange
kurze
lange
128
10000001 10000000
81 80
Beispiel 4.5
Form
Form
Form
Form
Form
Form
lange Form
(nicht in kurzer
darstellbar)
ASN.1-Längenangabe
Die danach folgende Darstellung des Wertes nimmt so viele Bytes wie im Längenfeld angegeben
in Anspruch. Die genaue Interpretation ist vom Typ abhängig.
21
Der PROFIBUS
5. Der PROFIBUS
Profibus existiert derzeit in 3 Ausführungsformen (Abb. 5.1).
Automation für
allgemeine Verwendung
PROFIBUS-FMS
EN50170 T1 + T2
Verwendungsspezifische
Profile:
Textilmaschinen
Gebäudeautomation
Sensoren und Aktuatoren
SPS
Prozeßautomation
PROFIBUS-PA
DIN 19 245 T4
für eigensichere
Übertragung lt.
IEC 1158-2
Fabrikautomation
PROFIBUS-DP
EN50170 T1 + T3
große Übertragungsraten
für dezentrale Peripherie
Abb. 5.1
PROFIBUS-Varianten
5.1. Profibus-FMS (Fieldbus Message Spezifikation)
Diese Variante ist multimasterfähig und unterstützt Baudraten bis zu 1500 Kbaud [BEN92].
Umgesetzt auf das OSI-Modell entfallen, wie bei vielen Feldbussen üblich, die Schichten 3 bis 6
zugunsten einer besseren Reaktionszeit. Die Anzahl der Geräte ist auf 127 begrenzt, wobei nicht
mehr als 32 ohne Repeater verbunden sein dürfen; ebenfalls dürfen nicht mehr als drei Repeater
sich auf der Übertragungsstrecke zwischen zwei Geräten befinden. Um trotzdem 127 Master bzw.
Slaves verbinden zu können ist eine Baumstruktur notwendig. Die Programmierung erfolgt durch
Erstellen von KBL (KommunikationsBeziehungsListe) und OV (ObjektVerzeichnis) für die
Eigenschaften der Profibus-Verbindung und meistens durch SPS Programmierung der restlichen
Teile, es existieren aber auch schon vereinzelt PC-Einsteckkarten, die über ein
Visualisierungsprogramm oder über eine DDE-Schnittstelle den Bus ansprechen.
22
Der PROFIBUS
5.2. Profibus-DP (Dezentrale Peripherie)
Diese Variante zeichnet sich durch eine höhere Geschwindigkeit von bis zu 12 Mbaud aus
[POP96]. Die Programmierung ist einfacher, es ist aber nur ein Monomastersystem. Meist müssen
die Slaves nur ihre Stationsadresse mitgeteilt bekommen - entweder durch DIL-Schalter oder
direkt über den Bus. Die Programmierung erfolgt im Masters, wobei in einer Konfigurationsdatei
jedem Slave ein Ein- bzw. Ausgangsbereich des Master zugewiesen wird. Diese können dann
angesprochen werden, als befänden sie sich direkt im Master. Da die Kommunikation in
Hintergrund und nicht ausprogrammierbar abläuft, entfallen bei dieser Variante die Schichten 3-7.
5.3. Profibus-PA (Prozeßautonatisierung)
Diese Ausführung von Profibus ist ähnlich der DP-Variante. Sie stellt lediglich eine Erweiterung
um Profile für spezielle Geräte und die Möglichkeit einer anderen Schicht-1-Implementierung
nach IEC 1158-2, um Profibus auch im eigensicheren Bereich verwenden zu können.
5.4. Schichten 1 und 2
Die Schichten 1 und 2 sind bei PROFIBUS-FMS und -DP gleich aufgebaut und entsprechen der
Norm EN50170 Teil 2. PROFIBUS-PA kann wahlweise ebenfalls so aufgebaut sein oder für den
eigensicheren Betrieb die Norm IEC 1158-2 als Schicht 1 verwenden.
Die Schicht 1 ist meist nach der US Norm RS485, die je nach Kabellänge bis zu 12Mbit/s erlaubt.
Die möglichen Übertragungsgeschwindigkeiten sind 9.6, 19.2, 187.5, 500, 1500 kbit/s und 12
Mbit/s. Angeschlossen werden die Geräte mit einen 9-Pin Sub-D Stecker. Um die maximale
Länge zu vergrößern, sind zwischen zwei Geräten bis zu drei Repeater erlaubt. Im gesamten
Netzwerk dürfen aber mehr Repeater sein. Diesen scheinbaren Widerspruch löst man durch eine
baumartige Struktur der Repeater. Ferner werden Repeater benötigt, da pro Segment maximal nur
32 Geräte angeschlossen sein dürfen. Weiters ist auch die Übertragung mittels Glasfaser erlaubt.
Der Data Link Layer ist für DP und PA die letzte implementierte Schicht des OSI Modells.
Insgesamt sind bis zu 127 Stationen ansprechbar. Diese unterteilen sich in Master, Stationen, die
die Kontrolle über den Bus haben können, und Slaves, die nur nach Aufforderung durch einen
Master Daten senden können. Die Masterstationen sind als logischer Tokenring aufgebaut (Abb.
5.2). In der Zeit, in der ein Master dieses Token besitzt, kann er mit Slaves oder anderen Mastern
kommunizieren. Danach muß er es an den nächsten ihm bekannten Master weitergeben. Die
Weitergabe wird dadurch geregelt, daß eine Umlaufzeit vorgegeben wird. Wenn ein Master
bemerkt, daß diese überschritten wird, muß das Token weitergegeben werden. Um zu wissen, an
welcher Adresse sich der nächst Master befindet, wird das sogenannte Gap-update durchgeführt.
23
Der PROFIBUS
logischer Token-Ring
Master
Slaves
Abb. 5.2
physikalischer
Bus
Busstruktur PROFIBUS
Dabei werden in regelmäßigen Abständen Telegramme an die Adressen zwischen der eigenen und
der des nächsten bekannten Masters geschickt. Wenn sich von solch einer Adresse ein Master
zurückmeldet, hat man einen neuen gefunden, und es muß nur mehr der restliche Adreßbereich
regelmäßig durchsucht werden. Dieser Vorgang erlaubt es, während des Betriebes neue Geräte
einzufügen. Um eine gesicherte Übertragung der Daten zu gewährleisten, sind die Datenpakete
mit einer Hammingdistanz von 4 abgesichert. Eine Fehlerkorrektur wird jedoch nicht vorgenommen.
Folgende Dienste werden von der Schicht 2 zur Verfügung gestellt:
1. Send Data with Acknowledgement,
2. Send And Request Data With Replay,
3. Send Data with NoAcknowledgement,
4. Cyclic Send And Request Data With Replay.
PROFIBUS-FMS verwendet alle 4 Dienste. PROFIBUS-DP und -PA verwenden nur die Dienste
2 und 3.
5.5. Schicht 7
PROFIBUS-FMS ist die einzige der drei Varianten, bei der eine Schicht 7 implementiert ist. Hier
werden die Kommunikationsobjekte und die Applikationsservices beschrieben. Die für den
24
Der PROFIBUS
Anwender wichtigsten zwei Listen sind das Objektverzeichnis (OV) und die Kommunikationsbeziehungsliste (KBL). Beide werden bei der Projektierung erstellt und bilden die Grundlage für
jede Verbindung.
In der KBL steht für jede projektierte Verbindung eine Zeile. Die Zeilennummer entspricht meist
der Kommunikationsreferenz, die alleine für die eigentliche Verbindung im Betrieb genügt.
Weiters sind die physikalischen Adressen von Ziel und Quelle, die SAP-Nummern von beiden und
die die Kommunikation betreffenden Parameter (Abb. 5.3) angegeben.
KR
L
Rem
D
Type
SAP
ADR
SAP
1
3
11
4
MMAZ
2
4
10
4
3
62
27
5
Verb
S
R
CC
CC
D
1
1
MMAZ
D
1
1
MSAZ
D
1
0
CI
PDU
PDU
Serv.
Serv.
C
S
R
S
100
241
241
30
30
100
241
204
30
30
241
241
30
0
......
Abb. 5.3
Kommunikationsbeziehungsliste (schematisch)
KR
Die Kommunikationsreferenz ist eine der Kommunikationsbeziehung eindeutig
zugeordnente Zahl. Sie alleine genügt, um den Emfänger eines Dienstes zu beschreiben.
LSAP
Für jede Kommunikationsbeziehung muß ein Dienstzugangspunkt auf lokaler Ebene
definiert werden. Dieser darf bei Master-Master-Beziehungen nur für eine verwendet
werden. Bei Master-Slave-Verbindungen wird ein Default-SAP verwendet.
RemADR
Die remote-Address ist die physikalische Busadresse des Kommunikationspartners.
DSAP
Ist der lokale Dienstzugangspunkt der Partnerstation. Dieser darf nur für eine
Kommunikationsbeziehung verwendet werden.
Type
Dieses Feld gibt an, um welche Art von Beziehung es sich handelt. Es wird zwischen
Master-Master, Master-Slave, zyklisch oder azyklisch und mit oder ohne Slaveinitiative unterschieden.
SCC
(souce receive confirmed counter) Hiermit wird angegeben, wie viele PDUs gesendet
werden dürfen, ohne eine Bestätigung erhalten zu haben.
RCC
Diese Zahl gibt an, wie viele PDUs die Partnerstation ohne Empfangsbestätigung
senden darf.
25
Der PROFIBUS
CI
Das zyklische Kontrollintervall gibt die Zeit in msec an, nach der spätestens eine
PDU zwischen beiden Stationen ausgetauscht werden muß. Bei azyklischer MasterSlave-Verbindung muß dieser Wert 0 sein.
PDU S
Gibt die maximal mögliche PDU-Länge des Senders an.
PDU D
Gibt die maximal mögliche PDU-Länge des Empfängers an.
Die beiden letzten Werte können für hochpriore und niederpriore PDUs auch unterschiedlich angegeben
werden.
Serv.S
Gibt die vom Gerät als Server unterstützten Dienste an. Dieser Wert ist bitweise
codiert. Jedes Bit in diesem Byte steht für einen unterstützten Dienst.
Serv.S
Gibt die vom Gerät als Client unterstützten Dienste an. In diesem Beispil unterstützt
das Gerät sowohl als Server als auch als Client die Dienste Lesen und schreiben.
Das Objektverzeichnis besteht aus einem Teil, in dem die Variablentypen beschrieben sind, und
einem Teil in dem die Zuordnung von physikalischem Speicher zu den am Netz bekannten
Objektnamen steht (Abb. 5.4).
Objekt Code
Index
Typ
Länge
Passwort
Adresse
Symbolischer Name
5
2
Integer16
5
4
Integer 32
7
41
2
1
00
43FF1234
Temperatur
7
518
4
1
00
44FF1235
Entfernung
Abb. 5.4 Objektverzeichnis (schematisch)
Die Felder im OV haben folgende Bedeutung:
Objektcode
Dies gibt an um welche Art von Objekt es sich handelt. 5 entspricht eine Datentyp, 7
steht für Variable.
Index
Diese Zahl gibt eine fortlaufende Nummer innerhalb des OV an. Es wird
durchlaufend und nicht zwischen Objekttypen unterscheidend gezählt.
26
Der PROFIBUS
Typ
Mit diesem Verweis auf einem Objekttyp wird festgelegt, um welche Art von
Variable es sich handelt. In diesem Fall sind es 2 für Integer16 und 4 für Integer 32.
Passwort
Damit kann man den Zugriff auf Variablen mit einem Paßwort „schützen“. Es
handelt sich aber eher um einen Schutz vor unbeabsichtigter Veränderung, da es
weder codiert ist, noch irgenwelche anderen Schutzmaßnahmen implementiert sind.
Adresse
Dies ist eine vom Hersteller und Gerät abhängige physikalische Adresse, unter der
die diesem Objekt zugeordneten Daten lokalisiert sind.
Symbolischer Name Zur leichteren Verständlichkeit kann man auch alphanumerische Namen vergeben.
Die Abfrage über diese symbolischen Namen ist optional möglich, aber leider bei
kaum einem PROFIBUS-Gerät implementiert.
Zu den zwei wichtigen Tabellen benötigt man grundsätzlich nur noch das Wissen, welche Dienste
zur Verfügung stehen. Jedes PROFIBUS-Mastergerät muß die Dienste Initiate, Abort und Reject
zum Auf- und Abbau von Verbindungen, Get-OV für das Objektmanagement und Status und
Identify als Zustandsmeldungen zur Verfügung stellen. Weitere bei dieser Arbeit verwendete
Dienste sind Read und Write zum Lesen und Schreiben von Variablen.
27
Analyse der Kopplungsmöglichkeiten
6. Analyse der Kopplungsmöglichkeiten
Bei der Kopplung zweier Netzwerke oder Teilen von Netzwerken unterscheidet man vier Arten
von Kopplungsgeräten: den Repeater, die Bridge, den Router und das Gateway.
7
7
6
6
5
5
4
4
3
3
2
2
1
1
1
Repeater
1
7
7
6
6
5
5
Remote Repeater
4
4
3
3
2
2
1
1
1
1
Abb. 6.1
1
1
Repeater
Repeater verbinden lediglich zwei Segmente ein und desselben LANs (Abb. 6.1). Sie bestehen nur
aus der Schicht 1 des ISO-Modells. Einen Sonderfall stellen Remote Repeater dar, sie sind
zweigeteilt und verbinden räumlich voneinander getrennte Teile eines LANs.
Bridges (Abb. 6.2 oben links) besitzen schon etwas an Intelligenz; sie bestehen aus Schicht eins
und zwei und werden zur Kopplung zwischen zwei Netzen verwendet.
Router (Abb. 6.2 oben rechts) verbinden Netzwerke auf Ebene der Schicht 3. Mit eigenen
Algorithmen steuern sie den Weg eines Datenpaketes zu seinem Bestimmungsort.
28
Analyse der Kopplungsmöglichkeiten
7
7
6
6
5
5
4
4
4
3
3
3
3
3
3
2
2
2
1
1
1
7
6
Bridge
5
2
2
2
2
2
1
1
1
1
1
7
7
7
7
6
6
6
6
5
5
5
5
4
4
4
4
3
3
3
3
2
2
2
2
1
1
1
1
Abb. 6.2
7
6
Router
5
4
Gateway
Bridge, Router und Gateway
Das Gateway (Abb. 6.2 unten) ist die komplizierteste dieser Kopplungsvorrichtungen. Es enthält
alle sieben Schichten des ISO-Modells. Durch diesen Aufbau bedingt ist es möglich, auch die
unterschiedlichsten Netzwerke miteinander zu verbinden [COM94].
6.1. Router mit PROFIBUS-Protokoll
LAN
FAN
FMS
FMS
leer
leer
router
leer
leer
leer
leer
IP
IP
leer
leer
DLL
DLL
FDL
FDL
PYL
PYL
PYL
PYL
Abb. 6.3
Router mit PROFIBUS-Protokoll
Abkürzungen in der Abb.: PYL Physikal Layer; DLL Data Link Layer; FDL Fieldbus Data Link Layer
29
Analyse der Kopplungsmöglichkeiten
Die Überlegung liegt nahe, gleich eines der beiden Protokolle zu verwenden. Angenommen, man
verwendet das PROFIBUS-Protokoll - welche Vorteile, welche Nachteile hätte man? Das
Bindeglied zwischen beiden Netzwerken wäre einfach, da es nur aus den Schichten eins bis
einschließlich drei bestehen müßte (Abb. 6.3). Die Seite mit dem PROFIBUS-Protokoll könnte
vollkommen gleich gelassen werden, der Router würde lediglich als Masterstation in das Netz
aufgenommen. Im Router fügte man dem PROFIBUS Datenpaket lediglich den Ethernet„Vorspann“ und die Prüfsumme hinzu, beziehungsweise in die Gegenrichtung entfernte man
beides. Die gesamte Intelligenz des Systems wäre im Ethernet-Gerät.
Vorteil dieses Lösungsansatzes ist die Einfachheit des Kopplgliedes und der geringe Aufwand im
PROFIBUS-Netz.
Nachteile sind: Alle Ethernetgeräte müssen die Software für das PROFIBUS-Protokoll besitzen.
Die Benutzeroberfläche ist entweder sehr unkomfortabel, da die PROFIBUS-Befehle auf sehr
niedriger Ebene eingegeben werden müssen, oder muß bei Änderung im PROFIBUS-Teil bei allen
Ethernetgeräten neu konfiguriert werden.
Zusammenfassend gesagt: Es ist eine billige, schnelle Lösung, wenn man nur ein oder sehr wenige
Ethernetgeräte hat, die die Daten das anderen Netzes benötigen. Ebenfalls sollten die Anwender
zumindest grundsätzliches Wissen über die PROFIBUS-Norm haben - insbesondere über
Kommunikationsreferenzen und Objektverzeichnisse.
6.2. Router mit SNMP-Protokoll
LAN
FAN
SNMP
SNMP
SNMP
SNMP
router
SNMP
SNMP
UDP
UDP
IP
IP
IP
IP
DLL
DLL
FDL
FDL
PYL
PYL
PYL
PYL
Abb. 6.4
Router mit SNMP-Protokoll
Abkürzungen in der Abb.: PYL Physikal Layer; DLL Data Link Layer; FDL Fieldbus Data Link Layer
30
Analyse der Kopplungsmöglichkeiten
Dieser vielleicht verlockend erscheinende Lösungsansatz (Abb. 6.4) scheidet nach näherer
Betrachtung sofort aus. SNMP ist ein leicht zu bedienendes Protokoll, der Benutzer benötigt also
kein Wissen über die PROFIBUS-Norm. Das Kopplglied entspricht in seiner Komplexität etwa
dem des vorigen Abschnittes. Aber Sinn und Zweck ist es ja, einfache („unintelligente“)
PROFIBUS-Slaves auslesen zu können. Bei diesem Lösungsansatz müßte aber gerade dort die
Protokollumsetzung stattfinden - das heißt die gesamte Intelligenz sein - also ein Widerspruch in
sich.
6.3. Gateway
Gateway
SNMP-Manager
SNMP-Agent-FMS-Master
Field-Device
SNMP
SNMP
FMS
FMS
SNMP
SNMP
leer
leer
SNMP
SNMP
leer
leer
UDP
UDP
leer
leer
IP
IP
leer
leer
DLL
DLL
FDL
FDL
PYL
PYL
PYL
PYL
Abb. 6.5
Gateway
Abkürzungen in der Abb.: PYL Physikal Layer; DLL Data Link Layer; FDL Fieldbus Data Link Layer
Der Lösungsansatz mit Hilfe eines Gateways (Abb. 6.5) ist der aufwendigste. Innerhalb des
Gateways müssen alle Schichten des OSI-Modells zweimal implementiert werden. Zusätzlich wird
eine Applikation benötigt, die die Umsetzung der beiden Protokolle bewerkstelligt. Von der
Bedienung bleibt das einfache SNMP-Protokoll für den Endanwender erhalten. Die den Feldbus
betreffenden Änderungen müssen nur im Gateway vorgenommen werden, beziehungsweise
können dort automatisiert werden. Ein weiterer Vorteil liegt darin, daß bei modularer Programmierung das Profibus-Interface durch das eines anderen Feldbusses ersetzt werden kann.
31
Analyse der Kopplungsmöglichkeiten
Obwohl dies die aufwendigste Form ist, verspricht sie im Endergebnis eine leichte Bedienung
[KNI97]. Auf die Feldbus-Seite kann ohne speziell auf das Bussystem zugeschnittene Software
von jedem berechtigten, am Netz befindlichen User mittels verbreiteter SNMP-Software
zugegriffen werden. Änderungen sind nur vor Ort am Gateway durchzuführen. Alle diese Gründe
führten dazu, daß dieser Weg beschritten wurde.
32
Interne Informationsstrukturen
7. Interne Informationsstrukturen
Die MIB und Zeigerstrukturen in C weisen große Ähnlichkeiten auf. Das ist auch der Grund,
weshalb für die Implementierung als interne Speicherung der Daten eine baumartig aufgebaute
Zeigervariable gewählt wurde. Um den Protokoll-Aufwand möglichst gering zu halten, wurde
eine Abkopplung der SNMP-Seite und der PROFIBUS-Seite bevorzugt.
Prinzipiell stehen zwei unterschiedliche Konzepte der Verbindung zur Verfügung:
Gateway
Managementstation
Abb. 7.1
Feldbusknoten
Put through Gateway
1. Jede ankommende Anfrage wird in PROFIBUS-Kommandos umgeformt und abgesetzt. Durch
eine softwaremäßige Vorkehrung muß hier sichergestellt werden, daß es keine Verwechslung
zu knapp aufeinander erfolgender Anfragen gibt oder die Anzahl ausstehender Aufträge zu
groß wird. Weiters ist Vorkehrung zu treffen, wie auf eine Unterbrechung der Feldbusseite zu
reagieren ist (Abb. 7.1).
33
Interne Informationsstrukturen
Gateway
Managementstation
Feldbusknoten
Abb. 7.2 Gateway mit Feldbusabbild
2. Man schafft ein vereinfachtes Abbild der relevanten Daten des Feldbusses im Gateway (Abb.
7.2). Dies hat eine schnellere Reaktionszeit zur Folge, die Daten sind aber nicht so aktuell.
Weiters ist zu bedenken, daß der Datenverkehr auf Feldbusseite stark erhöht wird. Um die
Vorteile dieser Art zu nützen, muß den Daten ein Zeitstempel aufgeprägt werden. Durch diese
und weitere Informationen über den Zustand des Knotens gewinnt diese Art der Abb. an
Attraktivität.
Der Gewinn an Schnelligkeit und die genauere Information über den Zustand der Feldbussseite
sprachen für eine Implementierung nach der zweiten Methode.
7.1. Definition der neuen MIB
Die Abb. der PROFIBUS-Knoten im Gateway ist der MIB angepaßt. Die dort vorhandenen
Felder sind, wenn auch in etwas anderer Form, im Abbild des Feldbusses zu finden. Folgende
Daten werden zu jedem Knoten gespeichert:
1. Art des Knotens,
2. Beschreibung wo sich der Knoten befindet,
3. Wert des Knotens,
4. Der zu Punkt 3 dazugehörende Zeitpunkt,
5. letzter Wert des Knotens,
6. Der zu Punkt 5 dazugehörende Zeitpunkt,
7. Zustand des Knotens ( Zuverlässigkeitsangabe der Daten),
8. Trap Bedingung (ob und unter welchen Bedingungen eine Ausnahme-Verarbeitung
erfolgt),
34
Interne Informationsstrukturen
9. Zur Trapbedingung gehörender Wert 1,
10. Zur Trapbedingung gehörender Wert 2.
Bei der Auswahl wurde darauf geachtet, daß nur die wichtigsten Werte des Knotens in die MIB
aufgenommen werden. Dies soll die Übersichtlichkeit steigern und die schon vorhandene MIB
nicht unnötig überladen.
fieldBus
fBTypeDescr(1)
fBTemperatureSensor(1)
fBStatus(2)
fBLightSensor(3)
fBAccess(2)
fBTable(1) fBInDatagrams(1)
fBEntry(1)
fBAIndex(1)
fBAKind(2)
fBADescr(3)
fBAType(4)
fBAValue(5)
fBATime(6)
fBAValueOld(7)
fBATime(7)
fBATrap(9)
fBAValue1(10)
fBAValue2(11)
fBAStatus(12)
Abb. 7.3
fBDevDescr(3)
fBOutDatagrams(2)
fBInErrors(3)
fBEntries(4)
fBMaxEntries(5)
LAN-FAN-MIB
Die drei in dieser MIB enthaltenen Unterbäume haben unterschiedliche Funktionen. Der erste
stellt alle Arten von ansprechbaren Knoten zur Verfügung. Nur die hier aufgeführten Arten sind
als OID-Typ verwendbar. Der mittlere enthält alle Knoten und deren Werte. Ebenfalls werden hier
die Trap-Bedingungen verwaltet. Die Werte sind lese und schreibbar. Der dritte und letzte
Unterbaum stellt statistische Werte über das Gateway zur Verfügung und kann daher nur gelesen
werden.
7.2. Beschreibung in ASN.1
Die zuvor gegebene graphische Beschreibung der unter SNMP verfügbaren Werte erfüllt nicht die
von ASN.1 vorgeschriebene Form. Sie wurde jedoch zur besseren Verständlichkeit der echten
Definition vorangestellt.
35
Interne Informationsstrukturen
Definition der LAN-FAN-MIB:
LAN-FAN-MIB DEFINITIONS ::= BEGIN
IMPORTS
-- Importieren von vordefinierten Typen und Objekten
MODULE-IDENTITY, OBJECT-TYPE, snmpModules, IpAddress
FROM SNMPv2-SMI
TEXTUAL-CONVENTION, RowStatus, DateAndTime
FROM SNMPv2-TC
mib-2
FROM RFC1213-MIB;
--LAN-FAN-MIB MODULE-IDENTITY
--
LAST-UPDATED " 25.02.99 13:30"
--
ORGANIZATION "Institut für Computertechnik"
--
CONTACT-INFO
--
"
Martin Knizak
----
e-mail: [email protected]"
--
DESCRIPTION
--
"Die MIB beschreibt Feldbusobjekte und macht so Feldbusse
--
vom Internet her zugänglich"
universtiesOfAustria
OBJECT IDENTIFIER ::= { enterprises 1093}
tuwien OBJECT IDENTIFIER ::= { universtiesOfAustria 51 }
fieldBus
OBJECT IDENTIFIER ::= { tuwien 6 }
fBTypeDescr
OBJECT IDENTIFIER ::= { fieldBus 1 }
--
Der Unterbaum fBTypeDescr beschreibt, um welche Art des
--
zugänglich gemachten Objektes es sich handelt
fBAccess
OBJECT IDENTIFIER ::= { fieldBus2 }
--
Über die sich hier befindlichen OIDs erhält man die im
--
Feldbus vorhandenen Werte
36
Interne Informationsstrukturen
fBDevDescr
OBJECT IDENTIFIER ::= { fieldBus 3 }
--
In diesem Unterbaum befinden sich generelle Beschreibungen
--
des Feldbusse s und des Gateways.
--
=========
-- OIDs im Unterbaum fBTypeDescr
--
=========
fBTemperatureSensor OBJECT IDENTIFIER ::= { fBTypeDescr 1 }
--
Bei diesem Typ handelt es sich um einen
--
Temperatursensor
fBStatus
OBJECT IDENTIFIER ::= { fBTypeDescr 2 }
--
Bei diesem Typ handelt es sich um den Gerätestatus
--
eines Feldbusgrätes
fBLightSensor
OBJECT IDENTIFIER ::= { fBTypeDescr 3 }
--
Bei diesem Typ handelt es sich um einen
--
Helligkeitssensor
--
==========
-- OIDs im Unterbaum fBAccess
--
==========
fBATable OBJECT-TYPE
SYNTAX SEQUENCE OF fBAEntry
ACCESS not-accessible
STATUS mandatory
::= { fBAccess 1 }
fBAEntry OBJECT-TYPE
SYNTAX
FBAEntry
ACCESS not-accessible
STATUS mandatory
INDEX { fBAIndex }
--
DESCRIPTION
37
Interne Informationsstrukturen
--
In diesen Tabelleneinträgen werden die erreichbaren
--
Feldbusknoten beschrieben.
::= { fBATable 1 }
FBAEntry ::=
SEQUENCE {
fBAIndex
INTEGER,
fBAKind
OBJECT,
fBADescr
DisplayString,
fBAType
INTEGER,
fBAValue
INTEGER,
fBATime
TimeTicks,
fBAValueOld
INTEGER,
fBATimeOld
TimeTicks,
fBATrap
INTEGER,
fBAValue1
INTEGER,
fBAValue2
INTEGER,
fBAStatus
INTEGER,
}
---
fBAIndex OBJECT-TYPE
SYNTAX
INTEGER (1..1024)
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"Index der Tabelle"
::= { fBAEntry 1 }
fBAKind OBJECT-TYPE
SYNTAX
OBJECT IDENTIFIER
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"Die OID beschreibt Art und Funktionalität des
Feldbusobjekts."
::= { fBAE ntry 2 }
38
Interne Informationsstrukturen
fBADescr OBJECT-TYPE
SYNTAX
DisplayString (SIZE (0..255))
MAX-ACCESS
read-write
STATUS
current
DESCRIPTION
"Eine verbale Beschreibung des Wertes wie z.B., in welchem Raum sichder
Temperatursensor befindet"
::= { fBAEntry 3 }
fBAType INTEGER OBJECT-TYPE
SYNTAX
INTEGER { INTEGER(0), STRING(1)}
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"Gibt an, um welche Art von Wert es sich handelt. Also ob der Wert eine
Integer Zahl(0) oder ein String(1) ist."
::= { fBAEntry 4 }
fBAValue OBJECT-TYPE
SYNTAX
INTEGER (0..65535) or DisplayString (SIZE (0..255))
--
abhängig von fBAType
MAX-ACCESS
read-write
STATUS
current
DESCRIPTION
"Dieses Feld enthält den aktuellen Wert des mit der OID beschriebenen
Feldbus Objekts."
::= { fBAEntry 5 }
fBATime OBJECT-TYPE
SYNTAX
TimeTicks
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"Gibt den Zeitpunkt an, zu dem der Wert fBAValue ausgelesen wurde. "
::= { fBAEntry 6 }
fBAValueOld OBJECT-TYPE
SYNTAX
INTEGER (0..65535) or DisplayString
(SIZE
(0..255))
--
abhängig von fBAType
39
Interne Informationsstrukturen
MAX-ACCESS
read-write
STATUS
current
DESCRIPTION
"Dieses Feld enthält den letzten Wert des mit der OID beschriebenen
Feldbus Objekts."
::= { fBAEntry 7 }
fBATimeOld OBJECT-TYPE
SYNTAX
TimeTicks
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"Gibt den Zeitpunkt an, zu dem der Wert fBAValueOld ausgelesen wurde."
::= { fBAEntry 8 }
fBATrap OBJECT-TYPE
SYNTAX
INTEGER { sendNoTrap(0),
sendTrapOnGoingOverLimit (1),
sendTrapOnRapidChange(2),
sendTrapOnRapidChange(3)}
MAX-ACCESS
read-write
STATUS
current
DESCRIPTION
"Hier wird angegeben, ob ein Trap gesendet werden soll oder nicht. Die
Option senden ist dreigeteilt:
(1)
Ein Trap wird gesendet, wenn der aktuelle Wert unter den von
fBAValue1 fällt oder über den von fBAValue2 ansteigt (nur möglich,
wenn der Typ des Wertes INTEGER ist).
(2)
Ein Trap wird gesendet, wenn der Unterschied zwischen fBAValue und
fBAValueOld größer als fBAValue1 ist (nur möglich, wenn der Typ
des Wertes INTEGER ist).
(3)
Ein Trap wird gesendet, wenn die Werte fBAValue und fBAValueOld
ungleich sind, das heißt, daß sich der Wert geändert hat. "
::= { fanoAEntry 9 }
fBAValue1 OBJECT-TYPE
SYNTAX
INTEGER (0..65535)
MAX-ACCESS
read-write
STATUS
current
DESCRIPTION
"Dieses Feld enthält den für die Trapbedingung notwendigen 1. Wert."
::= { fBAEntry 10 }
40
Interne Informationsstrukturen
fBAValue2 OBJECT-TYPE
SYNTAX
INTEGER (0..65535)
MAX-ACCESS
read-write
STATUS
current
DESCRIPTION
"Dieses Feld enthält den für die Trapbedingung notwendigen 2. Wert."
::= { fBA Entry 11 }
fBAStatus OBJECT-TYPE
SYNTAX
INTEGER{stausValid(0), statusNoConnection(1),
statusValuesNotGuaranted(2)}
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"Hier wird angegeben, wie sicher der gelesene Wert ist:
(1)
Die Werte sind mit großer Wahrscheinlichkeit gut.
(2)
Über den jetzigen Wert kann keine Aussage getroffen werden, da die
Verbindung zum Feldbus unterbrochen ist.
(3)
Gewisse Umstände
korrekt sind. "
lassen
darauf
schließen,
::= { fanoAEntry 12 }
--
==============
-- OIDs im Unterbaum fBDevDescr
--
==============
fBInDatagrams OBJECT-TYPE
SYNTAX
INTEGER (0..1024)
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"."
::= { fBDevDescr 1 }
fBOutDatagrams OBJECT-TYPE
SYNTAX
INTEGER (0..1024)
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
" Anzahl der vom Gateway weggegangenen Pakete."
::= { fBDevDescr 2 }
41
daß
die
Werte
nicht
Interne Informationsstrukturen
fBInErrors OBJECT-TYPE
SYNTAX
INTEGER (0..1024)
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
" Anzahl der vom Gateway empfangenen fehlerhaften Pakete."
::= { fBDevDescr 3 }
fBEntries OBJECT-TYPE
SYNTAX
INTEGER (0..1024)
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
" Anzahl der in der Tabelle enthaltenen Einträge."
::= { fBDevDescr 4 }
fBMaxEntries OBJECT-TYPE
SYNTAX
INTEGER (0..1024)
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
" Maximal mögliche Anzahl der in der Tabelle enthaltenen Einträge."
::= { fBDevDescr 5 }
END
42
Grundsätzliche Konzeption der Tasks
8. Grundsätzliche Konzeption der Tasks
Ohne den folgende Kapiteln vorgreifen zu wollen, ist es zu diesem Zeitpunkt notwendig,
grundsätzliche Überlegungen über das Gesamtkonzept anzustellen. Alle Programmteile müssen
auf ein erweitertes MS-DOS-Betriebssystem aufgesetzt sein. Dieses hat folgende Funktionen zu
erfüllen:
1. Starten eines Tasks,
2. Beenden eines Tasks,
3. Übergabe der Prozessor-Kontrolle von einem zu einem anderen Task,
4. Austausch von Informationen zwischen den Tasks über geeignete Datenstrukturen.
Auf diese Umgebung wird eine Datenstruktur aufgesetzt, die von allen Tasks verwendet werden
kann. In dieser Struktur befinden sich alle Werte, die sowohl für die LAN- als auch für die
Feldbusseite von Bedeutung sind.
Feldbus
Security
Task
Get/Set
Task
gemeinsame
Datenstruktur
Trap
Task
Feldbus
Task
Datenmanagement
KA9Q
Taskmanagement
Datenzugriff
Hardwaretreiber
MS-DOS
kommuniziert mit
Abb. 8.1 Task-Konzept
Durch diese Konzeption ist es nun möglich, folgende Tasks unabhängig voneinander zu entwerfen
(Abb. 8.1):
43
Grundsätzliche Konzeption der Tasks
1. SNMP Get, Getnext und Set Task:
Dieser hat die Aufgabe, hereinkommende Pakete auf ihre Richtigkeit zu untersuchen und je
nach Anfrage an das für diesen MIB-Unterbaum zuständige Unterprogramm weiterzuleiten.
Um diese Programmgruppe leicht erweitern zu können, haben alle diese Unterprogramme die
gleiche einfache Struktur: Sie müssen nur bei einfachen Variablen mit einer Auswahlanweisung
den richtigen Wert zurückliefern oder angeben, daß ein solcher nicht existiert. Bei Tabellen ist
es etwas komplizierter, folgt aber dem gleichen Konzept.
2. Feldbus-Task:
Dieser hat die Aufgabe, die in der gemeinsamen Datenstruktur aufgezählten Werte zyklisch aus
den jeweiligen Feldbusknoten zu holen. Bei PROFIBUS ist dies bei FMS eine Umsetzung in
KBL-Nummer und OV-Nummer und die darauf folgende Kommunikation mit dem
PROFIBUS-Partner; bei DP und PA ist es nur eine Verschiebung der Daten innerhalb des
Speichers, da die Daten schon im Speicher vorhanden sind. Dies mag unsinnig klingen, ist aber
als Konzept gedacht, um bei Portierung auf andere Feldbussysteme nur den Feldbus-Task
ändern zu müssen.
Die folgenden, nicht implementierten Tasks sind für die prinzipielle Funktion des Gateways nicht
notwendig.
3. Trap-Task:
Dieser durchläuft die gemeinsame Datenstrukur periodisch und löst bei freigegebenem Trap
beim Auftreten der gewählten Bedingung einen Trap aus.
4. Feldbus-Security-Task:
Dieser Task durchläuft ebenfalls die gemeinsame Datenstrukur periodisch, überprüft nach noch
festzulegenden Algorithmen die Zuverlässigkeit der Feldbuswerte und setzt dementsprechend
den Feldbusknotenstatus (FeldBusMIB.fBAccess.fBAStatus).
44
Realisierung der SNMP-Seite
9. Realisierung der SNMP-Seite
Generell erfolgt die Programmierung in C++. Ein modularer Aufbau des Programms soll spätere
Änderungen und Erweiterungen vereinfachen. Die Grundlage für das ganze Projekt wird durch
den Multitasking-Kernel des Programms KA9Q gebildet. Diese Programmsammlung wurde für
den Gebrauch bei Radioamateuren entwickelt und enthält alle gebräuchlichen Dienste des
TCP/IP-Protokolls wie FTP, finger, ping usw. Es ist auch in Quellcode frei erhältlich und verfügt
über einen UDP Teil. Auf diesen wird das SNMP-Protokoll aufgesetzt. Da nur ein SNMP Agent
ohne Trap-Befehl implementiert wird, beschränkt sich das Protokoll auf das Herausfinden, ob das
angeforderte Objekt vorhanden ist oder nicht. Bei erfolgreicher Suche ist das Ergebnis, ansonsten
eine Fehlermeldung zurückzuliefern.
9.1. KA9Q
KA9Q ist das Rufzeichen von Phil Karn, einem Amateurfunker, auf den dieses Programmpaket
zurückgeht [WAD92]. Bei dem Programm handelt es sich um eine Komplettlösung an
Netzwerkdiensten. Es ist frei erhältlich, und zwar im Sourcecode. Dieser wurde von etlichen
anderen Leuten erweitert und verbessert. In dieser letzten Aussage ist auch schon der große
Nachteil zu erahnen:. Es existieren die verschiedensten unterschiedlichen Varianten. Beschreibungen, falls überhaupt vorhanden, sind äußerst lückenhaft und beziehen sich meist auf
nicht vorhandene Versionen.
Die erste Aufgabe war es, eine möglichst vollständige Version mit möglichst guter Dokumentation zu finden. Die so gefundene Sammlung ließ sich gut mit Borland C++ 3.1 compilieren, die
Compilierung mit der Version 4.0 konnte trotz größerer Anstrengungen nicht erfolgreich durchgeführt werden. Dies lag daran, daß eine nicht dokumentierte Änderung der Parameter der
„longjump“-Funktion von Borland gemacht wurde und deren Auswirkung auf die einzelnen
Programmteile nicht kompensiert werden konnte. Ein weiterer Vorteil dieser Programmsammlung, der aber nicht ausgetestet wurde, ist, daß der Code auch für Amiga- und UNIXSysteme geschrieben ist. Man kann beim Compilieren durch Optionen diese speziellen Teile
aktivieren, wie dies im vorliegenden Fall mit dem MS-DOS-Teil gemacht wurde.
Zwar werden mit den meisten Versionen Treiber für die verschiedenen Arten von Hardware
mitgeliefert, doch wird bei Ethernetkarten empfohlen, einen auf die jeweilige Karte genau abgestimmten Treiber zu verwenden. Folgende Hardware wird von den meisten Versionen unterstützt:
die seriellen Ports COM1-4 für Modem oder Terminal Node Controler, Modems, Ethernet
Karten, Clarkson Treiber, Baycom AX.25 Treiber, DRSI PCPA 8530 Karte, HAPN 8273
Adapter; High speed DRSI/HAPN Treiber, Eagle 8530 Karten, NET/ROMControler, Single- und
multi-port KISS Terminal Node Controler und PACcom PC100. Zu diesen Hardware45
Realisierung der SNMP-Seite
komponenten entsprechend werden die Low-Level-Protokolle KISS, SLIP, PPP, NHRS, ARCnet
und Ethernet unterstützt.
Agent
MIB
ftp
finger
telnet
ping
SMTP
TCP
hope
RIP
SNMP
UDP
IP (ICMP)
SLIP / PPP
ax25 / KISS
Modem
TNC
Paket Treiber
Ethernet
Abb. 9.1KA9Q Dienste (auszugsweise)
Aufbauend auf diese vorhandene Grundstruktur (Abb. 9.1KA9Q Dienste (auszugsweise)) wurde
eine der Aufgabenstellung entsprechende Konfiguration vorgenommen. Von den Hardwaremöglichkeiten wurden eine Ethernetkarte und ein zusätzlicher Pakettreiber mit dem Namen
3c509.com installiert. Weitere Netzanbindungen wurden nicht eingerichtet.
9.2. Starten des vorhandenen Systems
Nachdem das Programm mit den richtigen Optionen compiliert und gelinkt worden war, dies
erfolgte mit dem dem Sourcecode beigefügten Makefile, konnte daran gegangen werden, es in
Betrieb zu nehmen. Ein Makefile ist meist eine angenehme Arbeitsersparnis, in diesem Fall ist es
aber eine unbedingte Notwendigkeit, da ein Erkennen der gegenseitigen Abhängigkeit bei einigen
Dutzend C-Files samt dazugehörigen Headerfiles und einem halben Dutzend Libraries ohne
genaue Beschreibung, die in diesem Falle (wie erwähnt) nicht vorhanden ist, äußerst schwierig
und zeitaufwendig wäre (vielleicht auch unmöglich, da für einzelne Programme spezielle
Segmentzuweisungen notwendig sind). Zuerst muß der Pakettreiber mit dem Parameter der ihm
zugewiesenen Interruptadresse gestartet werden. Hier wurde die auch den Einschränkungen
entsprechende Nummer 61hex gewählt. Jetzt kann KA9Q durch Starten des Files net.exe in Betrieb
genommen werden. Um die notwendigen Einstellungen nicht jedesmal neu eingeben zu müssen,
46
Realisierung der SNMP-Seite
erweist es sich als sinnvoll, diese in der Datei autoexec.nos (Listing 9.1
abzuspeichern. In ihr wird jedesmal beim Starten von net.exe ausgeführt.
autoexec.nos)
attach packet 0x61 e 8 1500
ifconfig e ipaddress 128.130.80.74
ifconfig e netmask 0xffffffff
ifconfig e broadcast 255.255.255.255
route add default e
ftype binary
eol standart
Listing 9.1
autoexec.nos
Die in dem Listing angegebenen Grundeinstellungen bewirken, zeilenweise erklärt, folgendes:
(1) Dem Kanal e (der Name ist frei wählbar) wird der Pakettreiber, der dem Interrupt 61hex
zugeordnet ist, zugewiesen.
(2) Dem Kanal e wird seine Internetadresse zugewiesen. In diesem Fall ist das die Adresse des PC
74 am Institut für Computertechnik (128.130.80.74).
(3) Dem Kanal e wird seine Netzwerkmaske zugewiesen.
(4) Dem Kanal e wird die am Netzwerk vorhandene Broadcast-Adresse mitgeteilt.
(5) Da noch andere Treiber vorhanden sein könnten, muß dem Programm mitgeteilt werden, daß
alle ausgehenden Pakete über diesen Kanal erfolgen sollen.
(6) Diese Zeile besagt, daß Files binär übertragen werden.
(7) Für eol ist das Standardformat zu verwenden.
Außer diesen Einstellungen wurden bei der vorliegenden Arbeit keine weiteren verwendet.
9.3. Einfügen eines Tasks in den Kernel
Bevor an das Einfügen eines neuen Tasks gegangen werden kann, muß kurz der allgemeine
Aufbau von KA9Q beschrieben werden. Der erste Teil dient zur Speicherverwaltung. In diesem
werden die in C üblichen Funktionen wie etwa malloc redefiniert und teilweise auch in verschiedenen Formen angeboten. Diese Formen ermöglichen, daß beim Fehlen von Systemressourcen keine Fehlermeldung zurückgegeben wird, sondern auf deren Freiwerden gewartet
wird. Ein weiterer großer Teil ist der des Taskmanagements. Hier werden Funktionen zur Bearbeitung der Tasks, zum Starten, Beenden, Suspendieren und zum Warten auf ein Ereignis zur
Verfügung gestellt. Untereinander kommunizieren die einzelnen Programmteile über Message
Buffer. Weiters steht eine beachtliche Anzahl von Protokollen zur Verfügung, die ihre Dienste
über Funktionsaufrufe zugänglich machen.
47
Realisierung der SNMP-Seite
Um einen Task eizufügen, der bei Programmbeginn gestartet wird, muß man in config.c die
Struktur daemon um den gewünschten Task erweitern. Dazu ist ein Name, unter dem er im
System aufscheint, die Größe des erforderlichen Stacks und der Name des C-Programms in diese
Struktur einzutragen (Listing 9.2 Änderungen in config.c).
/* daemons to be run at startup time */
struct daemon Daemons[] =
{
{ "killer", 512,
killer },
{ "gcollect", 256,
gcollect },
{ "timer",
1024, timerproc },
{ "network", 1536, network },
{ "keyboard", 250,
keyboard },
{ "Das ist der neue Task", 250,
neu },
{ NULLCHAR, 0,
NULLVFP }
};
Listing 9.2
Änderungen in config.c
In dem oben gezeigten Beispiel wurde ein Task mit dem C-Programmnamen neu.c eingefügt, der
in der Taskliste unter „Das ist der neue Task“ aufscheint. Da ein Task auch für die mit ihm
arbeitenden Mechanismen definiert sein muß, ist auch eine Änderung in demon.h vorzunehmen
(Listing 9.3 daemon.h eingefügte Zeile).
/* In snmp_sok.c: */
void neu __ARGS((int,void*,void*));
Listing 9.3
daemon.h eingefügte Zeile
Der so eingefügte Task (Listing 9.4 Neuer Task mit Endlosschleife) besteht prinzipiell aus zwei
Teilen: einem, der einmal durchlaufen wird, und zweitens entweder aus einem Funktionsaufruf,
der den Task wieder aus dem System entfernt, oder einer Endlosschleife, in der ein Aufruf für eine
Taskwechselfunktion enthalten sein muß - wie etwa pwait (definiert in ksubr.h) oder pause
(definiert in timer.h). Das Listing, der nach der obigen Änderungen in config.c in einer Endlosschleife läuft und seinen Namen abwechselnd von Ablauf 1 in Ablauf 2 und umgekehrt ändert. Der
pause-Befehl gibt den Prozessor für andere Tasks frei.
48
Realisierung der SNMP-Seite
#include “timer.h“
Void neu(i,v1,v2)
int i;
void v1;
void v2;
{
for(;;)
{
chname(Curproc,"Ablauf 1");
pause(100);
chname(Curproc,"Ablauf 2");
pause(100);
}
}
Listing 9.4 Neuer Task mit Endlosschleife
9.4. Datenstruktur von UDP und Zugriffsverfahren
KA9Q stellt sowohl den Zugriff auf IP als auch auf UDP-Pakete zur Verfügung. Um diese
Funktionen verwenden zu können, muß man quasi den Kanal öffnen und angeben, welche Portadresse einem bestimmten C-Programm zugeordnet ist. Nachdem diese Zuordnung stattgefunden
hat, wird dieses C-Programm beim Eintreffen eines Paketes auf dieser Portadresse aufgerufen.
Innerhalb dieses Tasks, muß man nun die Daten mit der receive-Funktion anfordern und weiterverarbeiten. Der Erhalt dieser Daten erfolgt über mbuf (Listing 9.5),
/* Basic message buffer structure */
struct mbuf {
struct mbuf *next; /* Links mbufs belonging to
single packets */
struct mbuf *anext; /* Links packets on queues */
int16 size;
/* Size of associated data
buffer */
int refcnt;
/* Reference count */
struct mbuf *dup;
/* Pointer to duplicated
mbuf*/
char *data;
/* Active working pointers */
int16 cnt;
};
Listing 9.5
Struktur mbuf
einer Datenstruktur, die ein Array mit den Nutzdaten enthält und zum Austausch von Daten
zwischen verschiedenen Tasks dient. Um einen Dienst anzustoßen, übergibt man einen mbuf
mittels der Sendfunktion an den gewünschten Protokoll-Task.
9.5. Darstellung von ASN.1 Paketen in C-Strukturen
Die vom UDP-Task zur Verfügung gestellte Funktion zum Empfang von Paketen recv_udp(struct
*udp_cb, struct *socket, struct **mbuf) bietet die Rohdaten in der Struktur mbuf an. Diese
49
Realisierung der SNMP-Seite
Struktur enthält unter anderem ein Array of char, in dem die Daten dann auch wirklich enthalten
sind. Da es unhandlich und unübersichtlich ist, mit so einer unstrukturierten Ansammlung von
Daten zu arbeiten, führt die Funktion asn_to_c eine Umsetzung in eine C-Zeiger-Struktur nach
Abb. 9.2 aus.
Pointer
asn_pack
nr (int)
oid_seq
laenge (int)
flags (int)
version (int)
oid (char[128])
name (char[64])
typ (int)
art (int)
wert (*)
error (int)
next (*)
error_ind (int)
oids (*)
oid_seq
oid_seq
flags (int)
flags (int)
oid (char[128])
oid (char[128])
typ (int)
typ (int)
wert (*)
wert (*)
next (*)
next (*)
Abb. 9.2
NIL
C Struktur
Bei dieser Struktur entspricht asn_pack genau einem hereinkommenden SNMP-Paket.Für jede in
ihm enthaltene Anfrage muß eine oid_seq angereiht werden. Die dazu inverse Funktion hat den
Namen c_to_asn. Die beiden Funktionen asn_to_c und c_to_asn sind in dem neuen C-Modul
asn_subr.c enthalten. Definiert sind sie, um einen leichteren Zugriff auf sie zu ermöglichen, in
snmp_sok.h.
9.6. Zugriff auf im System vorhandene Werte
Da auf große Modularität geachtet wurde, ist die Abarbeitung der SNMP Anfragen für alle zu
implementierenden Gruppen gleich aufgebaut (Listing 9.6
Tabelle Unterbaum). Eine Schleife
durchsucht eine Tabelle, ob ein gesuchter Unterbaum vorhanden ist. Falls dieser (bei einem GetBefehl) oder der nächst größere (bei einem GetNext-Befehl) existiert, wird die in der Tabelle
stehende Prozedur aufgerufen.
50
Realisierung der SNMP-Seite
struct u_mib {
// Stukur zur Zuordnung zwischen OID des
//Unterbaumes und
der dazugehörigen Funktion
void
(*u_fkt_mib) __ARGS((struct oid_seq *, int));
//Pointer auf die den Unterzweig bearbeitende
//Funktion
int
n1[128];
//OID des Unterbaumes
};
void
void
void
void
void
void
void
m_system
m_if
m_at
m_ip
m_icmp
m_udp
m_snmp
__ARGS(());
// Definition der Namen, um die
__ARGS(()); // Funktionen auch in anderen
__ARGS(());
// C-Programmen unterbringen zu
__ARGS(());
// können
__ARGS(());
__ARGS(());
__ARGS(());
struct u_mib mibs[] =
{
{m_system,
{m_if,
{m_at,
{m_ip,
{m_icmp,
{m_udp,
{m_snmp
{0,
// Tabelle, in der die Zuordnungen
// eingetragen sind
43,6,1,2,1,1,-1},
//Zuordnung OID //1.3.6.1.2.1.1 zur
Funktion m_system
43,6,1,2,1,2,-1},
//Zuordnung OID //1.3.6.1.2.1.2 zur
Funktion m_if
43,6,1,2,1,3,-1},
//Zuordnung OID //1.3.6.1.2.1.3 zur
Funktion m_at
43,6,1,2,1,4,-1},
//Zuordnung OID //1.3.6.1.2.1.4 zur
Funktion m_ip
43,6,1,2,1,5,-1},
//Zuordnung OID //1.3.6.1.2.1.5 zur
Funktion m_ icmp
43,6,1,2,1,7,-1},
//Zuordnung OID //1.3.6.1.2.1.7 zur
Funktion m_udp
43,6,1,2,1,11,-1},
//Zuordnung OID //1.3.6.1.2.1.11 zur
Funktion m_snmp
0,0,0,0,0,0,0,0}
//Abschluß der Tabelle, um //schleifenmäßige
Verarbeitung
//durchführen zu können
};
Listing 9.6
Tabelle Unterbaum
In dieser Funktion muß dann nur mehr der fehlende Rest der OID verglichen werden und je nach
Anfrage das Ergebnis zurückgeliefert werden. In der System-Gruppe, einer nur aus einfachen,
nicht zusammengesetzten Elementen bestehenden Gruppe, läßt sich dies mit einer case-Anweisung, die die letzte Ziffer als Auswahlkriterium hat, bewerkstelligen (Listing 9.7).
51
Realisierung der SNMP-Seite
void m_system(oid_s_p,l)
//übergebene Parameter:
//Pointer auf die zu
//
bearbeitende OID Struktur
//Integerzahl die die Tiefe des //
Unterbaumes angibt
struct oid_seq *oid_s_p;
int
l;
{
switch(oid_s_p->oid[l]){
case 1:
free(oid_s_p->wert);
// Lösc hen des alten Wertes
oid_s_p->wert = calloc(20,sizeof(char));
//Bereitstellen eines Speicherbereiches
//für den neuen Wert
strcpy(oid_s_p->wert,"Gerätebezeichnug");
//einfügen des neuen Wertes
oid_s_p->typ = STRING;
break;
case 2:
...........//für End-OID 2-7 sind hier analoge
//Einträge
...........................
break;
}
}
Listing 9.7
Prozedur m_system
Zuvor muß noch eine Unterscheidung zwischen Get und GetNext getroffen werden. Bei Get ist
sicherzustellen, daß der Auswahlzahl eine Null folgt. Bei GetNext ist eventuell eine Korrektur der
Adresse nötig, wenn es sich um eine Weitergabe aus einer Vorgruppe handelt. Bei der Auslesung
von im Programm vorhandenen Werten ist dieser an der betreffenden Stelle als extern zu
kennzeichnen. Wie schon an Hand der MIB erklärt, ist das Auslesen einer Tabelle durch einen
Endindex gekennzeichnet, der das Element angibt. Als Beispel für eine Tabelle sei hier der Zugriff
auf die ifTabelle gezeigt (siehe folgenden Ausschnitt aus der Interfaces MIB; die ganze Funktion
hat nicht nur einen, sondern 23 Einträge in der Tabelle).
52
Realisierung der SNMP-Seite
void m_if(oid_s_p,l,art)
//Funktion zur Abarbeitung
//der MIB Interfaces
struct oid_seq *oid_s_p;
int
l,art;
{
int
*i_p,i;
switch(oid_s_p->oid[l]){
//Auswahl, welches Element
//der MIB gewält wurde
//1. Element Anzahl der
//Interfa ces
case 1:
free(oid_s_p->wert);
oid_s_p->wert = calloc(1,sizeof(int));
oid_s_p->wert=2;
oid_s_p->typ = INTEGER;
break;
case 2:
//2. Element Interfaces//Tabelle
//wenn nur Tabelle angewählt
//wurde mit GetNext muß MIB-Nummer
//des ersten Elements der Tabelle
//eingesetzt werden
if((oid_s_p->oid[l+1]==1)&&(oid_s_p->oid[l+2]==-1)&&
(art==GETNEXTREQUEST))
{oid_s_p->oid[l+2]=1;
oid_s_p->oid[l+3]=1;
oid_s_p->oid[l+4]=-1;
}
else
//Bei GetNext muß das nächste
//Element zurückgeliefert werden
if((oid_s_p->oid[l+1]==1)&&(oid_s_p->oid[l+4]==-1)&&
(art==GETNEXTREQUEST))
if(liste[oid_s_p->oid[l+3]].index==-1)
//Falls letztes Element in Spalte
//Übergang zur nächsten
{oid_s_p->oid[l+3]=1;
oid_s_p->oid[l+2]++;}
else
oid_s_p->oid[l+3]++;
i=oid_s_p->oid[l+3];
switch(oid_s_p->oid[l+2]){
case 1:
//der erste Eintrag ist die
//Interface-Nummer
free(oid_s_p->wert);
oid_s_p->wert = calloc(1,sizeof(int));
oid_s_p->wert= i;
oid_s_p->typ = INTEGER;
break;
case 2: // der zweite Eintrag ist die
//Interface-Besdchreibung
//Für die weiteren Felder der Tabelle erfolgen
//äquivalente Einträge
53
Realisierung der PROFIBUS-Seite
10. Realisierung der PROFIBUS-Seite
Da bei der Implementation der SNMP-Seite schon ein Multitasking Kernel gewählt wurde, ist es
einfacher, auch das PROFIBUS-Protokoll in diese Umgebung einzubetten. In der ersten
Ausbauphase wird die Komunikationsbeziehungsliste statisch vor den Start des Programmes
geladen. Eine dynamische Erweiterung der KBL des Gateways kann als Erweiterung implementiert werden. Der Zugriff auf den PROFIBUS erfolgt über von Treibermodulen zur Verfügung
gestellte Funktionsaufrufe.
10.1. Installation der PROFIBUS-Karte
Die Implementierung erfolgte mit einer PC-Einsteckkarte CIF 11 der Firma Hilscher. Bevor die
Karte in Betrieb genommen werden kann, sind sie und der PC entsprechend zu konfigurieren.
Folgende Einstellungen müssen auf der Karte selbst vorgenommen werden:
J1: 1-2, J2: 2-3
für Verwendung des Speicherbausteins 27C020 auf der Karte
J3: 1-2, 5-6, 7-8, 10-11
für Verwendung des 28F256A-120 FlashROMS auf der Karte
J5: IRQ5
für Verwendung des Interrupt 5 des PC
J6: A17, A14, A13, A12, A11 für Verwendung der Basisadresse 0xD800 für das DualportMemory der Karte
J7: 2-3
für Verwendung des Interruptbetriebes
J8: 1-3, 2-4, J9: 1-2, J10: 1-2, J11: offen, J12: offen, J13: 1-2 für Verwendung im
PROFIBUS-Netz
Nachdem die richtige Einstellung der Jumper auf der Karte vorgenommen worden ist, muß auch
noch das PC-Setup dementsprechend geändert werden. Der Basisadressbereich, in diesem Fall
0xD800, muß für 2 kByte geschützt werden und darf hier nicht als Shadow-RAM benutzt
werden, da sonst ist ein Betrieb des Dual-Port-Memory nicht möglich ist.
10.2. Test der PROFIBUS-Karte
Im Lieferumfang der PC-Karte ist auch eine Projektierungs- und Testsoftware mit dem Namen
COMPRO inkludiert, mit deren Hilfe die Funktion der Karte überprüft werden kann. Weiters wird
diese Software auch zur Konfiguration der Karte verwendet. Um den Aufwand gering zu halten,
54
Realisierung der PROFIBUS-Seite
wird dieses Programm mit einem Batch-Programm aufgerufen (Listing 10.1 Compro.bat), das
folgenden Zeilen enthält, um COMPRO auf die zuvor durchgeführte Karteneinstellungen
abzustimmen.
Inhalt von CPRUN.BAT:
@ECHO OFF
CLS
ECHO Starting ComPro ..
COMPRO /A:D800 /H:IRQ /I:5
Listing 10.1
Compro.bat
Mit diesem Batch-Programm wird die Adresse des Dual-Port-Memory auf 0xD800 gesetzt und
Interrupt 5 als der für die Karte verwendete angegeben. Das Programm COMPRO benötigt viel
konventionellen Speicher, deshalb ist es eventuell notwendig, nicht verwendete Treiber aus
CONFIG.SYS und AUTOEXEC.BAT zu entfernen.
Um sicherzugehen, daß die bisherigen Schritte erfolgreich waren, empfiehlt es sich an dieser
Stelle, mit einem Bus-Monitor festzustellen, ob die Karte im Profibus-Karte als Busteilnehmer
aufscheint. Bei der hier vorliegenden Testimplementation in Kompetenzzentrum des Institutes für
Computertechnik wurde der Karte die Teilnehmeradresse 11 zugeteilt. Diese müßte zu diesem
Zeitpunkt auch am Bus-Monitor angezeigt werden.
Um eventuelle Fehlerquellen auszuschalten, sollte beim Einschalten der Profibuswand die
Hilscher-Karte schon in Betrieb sein, damit etwaige andere Master nicht die vorhandenen SAPs
bei Slaves, die eventuell nur wenige besitzen, belegen und die Karte keinen Zugriff mehr
bekommt.
10.3. Projektierung der PROFIBUS-Seite
Um eine Kommunikation zu einem anderen Profibus-Gerät aufbauen zu können, müssen die
Teilnehmeradresse der Karte eingestellt und die Kommunikationsbeziehnungsliste (KBL) erstellt
werden. Diese Projektierung wird mit dem oberhalb erwähnten Programm COMPRO durchgeführt. Es wird damit eine Projektdatenbank erstellt und in ein EEPROM auf der Karte
hinuntergeladen. Es müssen hier alle Einträge für die Sektionen BUS, KBL-Header und KBL
gemacht werden. Die Sektionen OV-Header und S_OV_0 sind in diesem Fall nicht notwendig, da
die Karte nur als Client arbeitet und keinerlei Variablen für andere Master zur Verfügung stellt.
55
Realisierung der PROFIBUS-Seite
Hier wurden Kommunikationsbeziehungen zu den an der Multivendoranlage vorhandenen FMSSlaves erstellt. Das sind ein Zähler der Firma Hengstler, ein Entfernungsmesser der Firma
Endress+Hauser und Ein/Ausgabe-Module der Firma Weidmüller.
KR
ADRL
SAPL
ADRR
SAPR
SCC
RCC
MPDU
Serv
1
11
1
10
3
1
0
241
30
2
11
2
12
34
1
0
204
30
3
11
3
8
3
1
0
241
30
Listing 10.2
KBL Hilscherkarte
Die in Listing 10.2 ersichtlichen Kommunikationsreferenzen (KR) werden gemeinsam mit der
Objekt Nummer die eindeutige Identifikation eines PROFIBUS Objektes ermöglichen. Die Abkürzungen, die in Abb. 5.3 genauer erklärt sind, lauten wie folgt:
KR
Kommunikationsreferenz
ADRL
lokale Adresse
SAPL
lokaler SAP
ADRR
remot Adresse
SAPR
remot SAP
SCC
Source recive Confirmed Counter
RCC
Destination recive Confirmed Counter
MPDU
maximale PDU-Länge
Serv
unterstützte Dienste
10.4. Der zweite Teil der Struktur Feld_Knoten
Da dieses Konzept auch leicht auf andere Feldbussysteme übertragbar sein soll, wurde auf eine
strikte Trennung von SNMP und Feldbus geachtet. Erst sehr spät werden beide Teile miteinander
verbunden. Deshalb wird hier zuerst nur der für den Feldbus notwendige Teil der Struktur
Feld_Knoten behandelt.
Wie in Kapitel 7 erörtert wurde, wird im Gateway ein Abbild der PROFIBUS-Seite erstellt. Diese
kann entweder in einer dynamischen oder einer statischen Datenstruktur (wie in dieser
Implementation) erfolgen. Eine Änderung von der einen zur anderen Art kann ohne Änderung des
Grundkonzeptes jederzeit erfolgen. Das hier verwendete Array hat die in der MIB angegebene
Länge und hat als Felder Records, die alle in der MIB enthaltenen Tabelleneintragsfelder und
zusätzlich die für den Feldbus und die Verwaltung notwendigen Einträge enthalten (Listing 10.3
56
Realisierung der PROFIBUS-Seite
Zweiter Teil der Struktur Feld_Knoten). Für PROFIBUS sind das Kommunikationsreferenz, die
man aus der KBL entnehmen kann, Objektindex und zur leichteren Auswahl der richtigen
PROFIBUS-Funktionen eine Angabe über den Datentyp. Um alles ganz modular zu halten,
werden noch Felder, ob ein Trap Ereignis aufgetreten ist und ob der Inhalt in der Feldbus
geschrieben werden soll und deshalb nicht überschrieben werden darf. Dieses Schreibeflag muß,
wenn der Feldbus den Wert geschrieben hat, zurückgesetzt werden.
// Konstanten-Definitionen für die Art des Schreibstatus
#define
read_only
-1
//Verbot für SNMP-Seite diese Variable
//zu beschreiben
#define
read
0
//SNMP_Seite liest diesen Wert
//(Normalzustand)
#define
write
1
//SNMP Seite hat diese Variable g esetzt,
//darf von Feldbus erst nach
//Übertragung und Rücksetzung wieder
//beschrieben werden
// Konstanten-Definitionen ob ein Trap aufgetreten ist
#define t_no
0
//kein erlaubter Trap ist aufgetreten
#define t_yes
1
//ein erlaubter Trap ist aufgetreten
struct tabellen_eintrag{
...............
...............
int kbl_nr;
//Nummer der Kommunikationsbeziehung in der KBL
int ov_nr;
//Feldbus-Objektnummer der Variable
int o_type;
//Typ des Objektes (z.B. Integer8, Integer16,
//Integer32, ..... ..)
int read_status;
//angaben über den Zugriffstatus laut obriger
//Konstanten Definitionen
int a_trap;
//Anzeige ob ein erlaubter Trap aufgetreten ist
};
Listing 10.3
Zweiter Teil der Struktur Feld_Knoten
Generell muß darauf geachtet werden, daß diese Datenstruktur allen notwendigen Tasks
zugänglich sein muß und diese die Änderungen so durchführen, daß keine ungültigen Zustände in
einem Record auftreten. Dies erreicht man dadurch, daß während der Änderung eines Records ein
Taskwechsel verboten wird. Bei dem von KA9Q verwendetem Schedulingmechanismus, der jeden
Task für die Abgabe der Resourcen selbst verantwortlich macht, bildet dies keine
Schwierigkeiten. Beim Wechsel auf ein anderes Schedulingsystem wäre dafür extra Sorge zu
tragen.
10.5. Der PROFIBUS-Task
Der Aufbau des PROFIBUS-Task ist sehr an die Vorgaben der Firma Hilscher angelehnt. Die CProgramme drv.c und dpml.c wurden samt dazugehörigen Headerfiles eins zu eins übernommen.
Sie erledigen die Kommunikation mit dem Betriebsystem und der PC-Karte und stellen die zur
57
Realisierung der PROFIBUS-Seite
Kommunikation notwendigen Grundlagen zur Verfügung. Da sie weder Ausgabefunktionen besitzen noch Funktionen beinhalten, die von KA9Q redefiniert wurden, ist diese unveränderte
Übernahme gerechtfertigt. Auf diesen Unterbau setzt das C++ Programm hil-card.cpp auf. Bei
diesem C++ Programm ist gleich auf mehrere Sachen zu achten. Einerseits handelt es sich um das
erste C++ Programm. Für dieses sind einige Änderungen im Makefile vorzunehmen. Alle
Anweisungen, die das Compilieren von C-Programmen zur Folge haben, müssen ein zweites Mal
für die Handhabung von C++ geschrieben werden. Die schon im Abschnitt „Einfügen eines Tasks
in den Kernel“ beschriebenen Ergänzungen müssen natürlich ebenfalls vorgenommen werden.
Andererseits muß auch das Programm der Firma Hilscher umgeschrieben werden. Alle printfBefehle müssen entweder durch tprintf, fprintf oder durch Beschreiben der Variable Feld_Knoten
ersetzt oder gänzlich gestrichen werden. Weiters muß das Programm multitaskingfähig werden.
Alt:
*/
#define ToScr(a)
tprintf(a)
/* MSC graphic output
#define _settextposition( a, b )
...................................................
_settextposition( 8,30);
sprintf( Str, " , Value
=%-7d\n", sVar);
ToScr( Str);
..........................................................
sRet = TeleRcv( &tMyCon, 500 );
Neu:
extern "C"
{
#include "timer.h"
}
//exportiert pause(x)
.............................................
tprintf(" , Value
=%ld\n", (long)sVar);
//dieser Wert wird jetzt am Bildschirm angezeigt
....................................................
pause(500);
//mit diesem Befehl erfolgt ein Taskwechsel
sRet = TeleRcv( &tMyCon, 0 );
//hier wurde die Wartezeit auf 0 gesetzt
Listing 10.4
Änderungen in hil_card.cpp
Dies wird am einfachsten dadurch erreicht, daß man die Funktionsaufrufe, die eine gewisse Zeit
lang auf eine Antwort warten sollen, so umändert, daß zuerst eine Pause programmiert wird und
dann ein Funktionsaufruf mit keiner Wartezeit. Der pause-Befehl aus timer.h nimmt einen
Taskwechsel vor (Listing 10.4 Änderungen in hil_card.cpp).Auf dieses Programm setzen zwei
weitere auf. Das erste, genannt hilscher_z.cpp, stellt Zugriffe auf „normale“ (einfache, wie etwa
Integer8, Integer16 usw.) PROFIBUS-Variablen zur Verfügung. Eh_fmu.cpp ist speziell für den
Entfernungsmesser von Endress und Hauser geschrieben. Dieser verwendet einen speziellen
58
Realisierung der PROFIBUS-Seite
Record zur Übermittlung der Daten. Um die gewünschten herauszuholen, mußten zum
hilscher_z.cpp einige Zusätze gemacht werden. Alle die genannten Programme stellen nur
Funktionen, Typen und Zugriffsverfahren für profibus.cpp zur Verfügung. Profibus.cpp wird wie
vorher für die SNMP-Seite beschrieben als eigener Task in KA9Q eingefügt.
profibus.cpp
Feld_bus
hengst_z.cpp
eh_fmu.cpp
hilscher.cpp
drv.c
drpm.c
PROFIBUS
Hilscher -Karte
Abb. 10.1
Zusammenspiel der PROFIBUS Programmteile
Der Task profibus ist dafür zuständig, die gelesenen PROFIBUS-Daten in die Struktur Feld_Bus
hineinzuschreiben. Davor wird das Feld Wert in das Feld Wert_Alt abgespeichert. Dasselbe
geschieht mit dem Zeit-Feld. Dies alles darf aber nur gemacht werden, wenn nicht das Feld zum
Lesen gesetzt ist. Für die Implementierung von trap Funktionen ist ein eigener Task zuständig.
Die Aufgabe eines weiteren Tasks ist es, die Felder über die Zuverlässigkeit der Daten aktuell zu
halten.
10.6. Zusätze beim SNMP-Task
Zusätzlich zu den für die allgemeine MIB notwendigen Funktionen benötigt man speziell solche,
die Anfragen der Feldbus-MIB beantworten. Dafür wurden in die Funktionsauswahl der Unterbaum fBAcces und fBDescr (Listing 10.6 m_devDescr) eingetragen. Auf Grund der Programmierung ist darauf zu achten, daß die einzelnen Einträge in aufsteigender Reihenfolge eingetragen
werden (Listing 10.5 Erweiterungen in mib.h).
59
Realisierung der PROFIBUS-Seite
struct u_mib mibs[] =
{
{m_system,
43,6,1,2,1,1,-1},
.....................................
// Hier sind die Verweise auf die
// restlichen Unterbäume der MIB eingetragen
.....................................
.....................................
{m_Access,
43,6,1,4,1,1093,51,6,2,-1},
{m_DevDescr, 43,6,1,4,1,1093,51,6,3,-1},
{0,
0,0,0,0,0,0,0,0}
};
Listing 10.5
Erweiterungen in mib.h
In einem eigenen C-Programm, das wie schon vorher beschrieben in das Multitaskingsystem
eingebettet wird, werden diese beiden Funktionen bereitgestellt. Es besitzt einen ähnlichen Aufbau
wie die Unterprogramme zum Auslesen von Systemwerten. Nur werden in diesem Fall Werte aus
der gemeinsamen Struktur Feld ausgelesen.
#include "feld.h"
#include "snmp_sok.h"
extern int f_in, f_out, f_error;
//diese drei Variable müssen vom SNMP-Task
//zur Verfügung gestellt werden für fBDescr
void m_DevDescr(oid_s_p,l,art)
struct oid_seq *oid_s_p;
int
l,art;
{
int i;
switch(oid_s_p->oid[l]){
//da es sich hier um eine
// einfache Liste handelt,
// muß nur nach der Endzah
// entschieden werden
//die erste Fallunterscheidung ist
//zur Gänze dargestellt, bei
//den restlichen wurde alles bis auf
//die Wertzuweisung weggelassen
case 1:
free(oid_s_p->wert);
//Löschen des alten Wertes
oid_s_p->wert = calloc(1,sizeof(int));
//Platz für neuen Wert reservieren
oid_s_p->wert = f_in;
//Wert zuweisen; in diesem Fall
60
Realisierung der PROFIBUS-Seite
//Anzahl der hereinkommenden SNMP-Pakete
oid_s_p->typ = INTEGER;
//Typ des Wertes zuweisen
break;
case 2:
oid_s_p->wert = f_out;
//Wert zuweisen; in diesem Fall
//Anzahl der hinausgehenden SNMP-Pakete
case 3:
oid_s_p->wert = f_error;
//Wert zuweisen; in diesem Fall
//Anzahl der fehlerhaften SNMP-Pakete
case 4:
i=0;
//Berechnung, wie viele Einträge in der
//Struktur Feld vorhanden sind
while(liste[i].index != -1) i++;
oid_s_p->wert = i; ;
//Wert zuweisen; in diesem Fall Anzahl
// der Einträge in der Struktur Feld
case 5:
oid_s_p->wert = 128;
//Wert zuweisen; in diesem Fall Anzahl
//der in der Struktur Feld
//möglichen Einträge
}
}
Listing 10.6
m_devDescr
Bei den in diesem Abschnitt behandelten Werten stößt man auf ein bei SNMP weit verbreitetes
Problem. Die Daten, die zur Verfügung gestellt werden, klingen sehr einfach, werden aber
teilweise von verschiedenen Leuten jeweils verschieden interpretiert. Wie sind also die Werte f_in,
f_out und f_error zu verstehen? Werden die fehlerhaften Pakete auch als einlangende gezählt oder
nicht? Bei dieser Implementation werden sie bei beiden Zählern mitgezählt. Bei anderen Werten,
die SNMP-fähige Geräte unterstützen, kann es jedoch bei unterschiedlichen Herstellern aus
diesem Umstand zu großen Differenzen kommen. Zusammenfassend gesagt: Einige Werte von
SNMP sagen wenig aus, ohne die genaue Auffassung des Herstellers zu kennen. Schön und
übersichtlich wäre es, wenn für alle derartigen Werte verbindliche Vorschriften wie für diese drei
Werte mittels Casediagramm gemacht würden (Abb. 10.2).
61
Realisierung der PROFIBUS-Seite
darüberliegender Layer
f_error
f_in
f_out
darunterliegender Layer
Abb. 10.2
Case Diagramm
Als letztes in diesem Abschnitt über den PROFIBUS-Task soll noch die zweite Funktion, nämlich
f_access angeschnitten werden. Dies speziell aus dem Grund, daß Kenntnis über den Aufbau
dieser Funktion es erheblich erleichtert, mit Tabellen in der MIB umzugehen. Um es
übersichtlicher zu gestalten, werden zuerst die interessanten Zeilen ohne Kommentar in den Text
gestellt und dann genau beschrieben.
void m_Access(oid_s_p,l,art)
struct oid_seq *oid_s_p;
int
l,art;
Diese Zeilen sind für alle aufzurufenden Unter-MIBs gleich und in feld.h definiert.
switch(oid_s_p->oid[l]){
Da die Tabelle an Stelle eins in diesem Unterbaum steht, muß in der charakteristischen Zahlenfolge an dieser Stelle eine 1 stehen.
case 1:
if((oid_s_p->oid[l+1]==1)&&(oid_s_p->oid[l+2]
==-1)&&
62
Realisierung der PROFIBUS-Seite
(art==GETNEXTREQUEST))
{oid_s_p->oid[l+2]=1;
oid_s_p->oid[l+3]=1;
oid_s_p->oid[l+4]=-1;
}
Es existieren zwei Möglichkeiten, Werte aus einer Tabelle einer MIB zu bekommen: Entweder
man spricht einen Wert direkt an und bekommt mit Get diesen oder mit GetNext den nächsten,
oder man verwendet den GetNext-Befehl, um zum ersten Wert der Tabelle zu kommen. Im
zweiten Fall wird die Endung 1.1 gewählt. Der erste Einser steht als Ordnungszahl für die Tabelle,
der zweite für Tabellenindex. Dieser zweite Einser darf auch bei allen anderen Zugriffen nicht
weggelassen werden. Deshalb hat auch die Endung für Zugriffe auf diese einfach indizierte
Tabelle vier Zahlen. Die Zahl -1 wurde als nicht in der MIB vorkommende Zahl als Abschluß
einer OID gewählt.
else
if((oid_s_p->oid[l+1]==1)&&(oid_s_p->oid[l+4]==-1)&&
(art==GETNEXTREQUEST))
if(liste[oid_s_p->oid[l+3]].index==-1)
{oid_s_p->oid[l+3]=1;
oid_s_p->oid[l+2]++;}
Mit dem GetNext-Befehl wird in der MIB jeweils eine Spalte von oben nach unten durchwandert.
Dies ist hilfreich, wenn man z.B. von allen Sensoren wissen möchte, ob ihre Werte zuverlässig
sind. Nachdem das letzte Element einer Spalte erreicht wurde, wird mit dem ersten der nächsten
fortgefahren. Nicht vergessen werden darf, daß der GetNext-Befehl die neue OID zurückliefern
muß, und diese unterscheidet sich in diesem Fall nicht nur in der letzten Stelle.
else
oid_s_p->oid[l+3]++;
i=oid_s_p->oid[l+3];
Nachdem nun unter Umständen Änderungen in der OID vorgenommen worden sind, kann mit
einer case-Anweisung, die auf die dritte Stelle getriggert ist, die Art des Wertes entschieden
werden. Der erste Wert benennt die Tabelle, und der zweite ist Eins, da es sich um einen
Tabelleneintrag handelt. Um allzu lange Ausdrücke zu vermeiden, wurde dem vierten Wert der
Variablenname i zugewiesen. Dieser wählt nun von der bekannten Spalte die richtige Reihe und
somit den gesuchten Wert.
switch(oid_s_p->oid[l+2]){
63
Realisierung der PROFIBUS-Seite
case 1:
free(oid_s_p->wert);
oid_s_p->wert = calloc(1,sizeof(int));
oid_s_p->wert= liste[i-1].index;
oid_s_p->typ = INTEGER;
break;
case 2:
free(oid_s_p->wert);
oid_s_p->wert =
calloc(128,sizeof(char));
strcpy(oid_s_p->wert,liste[i-1].descr);
oid_s_p->typ =STRING;
break;
Die Werte werden jetzt wie bei normalen Variablen zugewiesen. Der einzige Unterschied besteht
darin, daß der Wert aus einem Array stammt. Auch die weiteren Elemente der MIB werden
analog zugewiesen. Deshalb wird diese Funktion nur bis zu dieser Stelle abgebildet.
64
Zusammenfassung der gemachten Änderungen
11. Zusammenfassung der gemachten Änderungen
Die gemachten Änderungen wurde jeweils im Zusammenhang mit den thematischen Hintergründen beschrieben. Es sollen auch hier nicht alle wiederholt werden, sondern nur jene, wo an
verschiedenen Stellen dasselbe Programm mehrmals geändert wurde, und so die Zusammenfassung aus Übersichtsgründen notwendig scheint.
Änderungen in daemon.h: Hier sind alle neu dazugekommenen Tasks nochmals angeführt.
/* In snmp_sok.c: */
void knizak __ARGS((int,void*,void*));
/* In profibus.cpp: */
void profi __ARGS((int,void*,void*));
Listing 11.1
Alle Änderungen in daemon.h
Dazugehörige Änderungen in config.c: Hier sind die Tasks samt Namen und Speicherbedarf in die
Daemon Liste eingetragen.
/* daemons to be run at startup time */
struct daemon Daemons[] =
{
{ "killer", 512,
killer },
{ "gcollect", 256,
gcollect },
{ "timer",
1024, timerproc },
{ "network", 1536, network },
{ "keyboard", 250,
keyboard },
{ "ich knizak",
250,
knizak },
{ "PROFIBUS", 250,
profi },
{ NULLCHAR, 0,
NULLVFP }
};
Listing 11.2
Alle Änderungen in config.c
Makefile: Hier ist eine Zusammenfassung aller Änderungen sowohl für die zusätzlich zu
compilierenden und zu linkenden Programme, als auch die Änderungen für die C++ Programme
gemacht wurden.
65
Zusammenfassung der gemachten Änderungen
.c.obj:
$(CC) -c $(INCLUDE) $(MODEL) $(CFLAGS) $<
.cpp.obj:
$(CC) -c $(INCLUDE) $(MODEL) $(CFLAGS) $<
// Diese Zeile wurde zur comilierung der C++ Programme eingefügt
.asm.obj:
$(ASM) $(AFLAGS) $<;
...............................................
CLIENTS= telnet.obj ftpcli.obj finger.obj \
smtpcli.obj hop.obj tip.obj \
dialer.obj nntpcli.obj bootp.obj \
popcli.obj nettime.obj novelcli.obj \
rlogin.obj sz.obj rz.obj rbsb.obj \
zm.obj hil_card.obj hengst_z.obj \
eh_fmu.obj dpmi.obj drv.obj feld.obj \
asn_subr.obj obl_mib.obj f_mib.obj
// In die Clients-Bibliotek wurden alle Funktionen, Daten und Typen bereitstellenden
// C-Programme aufgenommen
....................................................
NET=
ftpsubr.obj sockcmd.obj sockuser.obj \
socket.obj sockutil.obj \
iface.obj timer.obj ttydriv.obj cmdparse.obj \
mbuf.obj misc.obj pathname.obj audit.obj files.obj \
kernel.obj ksubr.obj alloc.obj getopt.obj \
wildmat.obj lzw.obj \
devparam.obj snmp_sok.obj profibus.obj
// Die beiden „Haupt-Tasks“ wurden in die Net-Bibliotek eingefügt
.....................................................
$(CC) -c $(CFLAGS) $(MODEL) *.c
$(CC) -c $(CFLAGS) $(MODEL) *.cpp
$(ASM) $(AFLAGS) *.asm
// Auch die Direktiven zur Compilierung mußten um die C++ erweitert werden
Listing 11.3
Änderungen im Makefile
66
Der Weg eines Paketes durch das Gateway
12. Der Weg eines Paketes durch das Gateway
In diesem Abschnitt wird ein GetRequest nach der Kontaktperson auf seinem Weg durch das
Gateway verfolgt.
Die Ethernet-Karte liefert über den Pakettreiber über Interrupt 0x61 Ethernet-Pakete an den IPTask von KA9Q (Abb. 12.1). Dieser Task stellt an der Protokollnummer (17) fest, daß dieses an
den UDPZiel
Type
Prüf-Summe
Ethernet-Frame 00 00 00 00 00 00 00 00 00 00 00 00 80 00
00 00 00 00
IP
00 00 00 00
Quelle
00 00 00 00
00 00 00 00
Quelle
Ziel
80 82 50 01
80 82 50 3D
0E 56 00 A1 00 B1 60 A3
UDP
Quell- ZielPort Port
SNMP
30 26
SNMP-Daten
Version
Community
02 01 00 04 06 70 75 62 6C 69 63
A1 19
02 01 29
02 01 00 02 01 00
PDU
Nummer
Fehler
30 0C
Abb. 12.1
06 08
30 0E
2B 06 01 02 01 01 01 00
05 00
hereinkommendes Ethernet-Paket
Task weiterzuleiten ist. Dieser entfernt, wie auch die vorhergegangenen, die für ihn bestimmten
Steuerinformationen und leitet es laut Port-Adresse (161) an den SNMP-Task weiter. Bis hierher
erfolgte die Weitergabe in der Form von Message-Buffern.
Der SNMP-Task wandelt über die Funktion asn_to_c diese nicht strukturierten Daten in eine
leicht zu bearbeitende Zeigerstruktur um (Abb. 12.2).
67
Der Weg eines Paketes durch das Gateway
asn_pack
Pointer
nr (int)
36
laenge (int)
42
version (int)
0
name (char[64])
“public”
art (int)
A0
error (int)
0
error_ind (int)
0
oids (*)
->oid_seq
oid_seq
flags (int)
0
oid (char[128]) 1.3.6.1.2.1.1.4.0.-1
Abb. 12.2
typ (int)
1
wert (*)
->“Knizak”
next (*)
->NULL
Pointerstruktur mit Get (sysContakt)
Über die Einträge in mib.h wird nun zur Funktion m_system gesprungen, die den gewünschten
Wert zurückliefert
Nun wandelt der SNMP-Task mittels der Funktion c_to_asn die Pointerstruktur wieder in einen
mbuf um. Dieser wird an udp_send weitergeleitet. Dort wird er mit Header-Daten und Kontrollsumme versehen und an ip_send weitergeleitet. Dort erhält es genauso wie auch dann für das
Ethernet, die entsprechend Kontrolldaten (Abb. 12.3).
68
Der Weg eines Paketes durch das Gateway
Das fertige Paket wird über den Pakettreiber und die Ethernetkarte entweder sofort an einen
anderen Zielrechner oder an den nächsten Router geschickt.
Ziel
Quelle
Type
Prüf-Summe
Ethernet-Frame 00 00 00 00 00 00 00 00 00 00 00 00 80 00
00 00 00 00
Quelle
IP
00 00 00 00
00 00 00 00
00 00 00 00
80 82 50 3D
Ziel
80 82 50 01
00 A1 0E 56 00 B1 60 A3
UDP
Quell- ZielPort Port
SNMP
30 2A
Version
Community
02 01 00 04 06 70 75 62 6C 69 63
A2 1D 02 01 29 02 01 00 02 01 00
PDU
SNMPDaten
30 11
Nummer
30 13
Fehler
06 08 2B 06 01 02 01 01 04 00 04 06 4B 6E 69 7A 61 6B
Abb. 12.3
hinausgehendes Ethernetpaket
69
Erstellung einer beispielhaften Anwendung
13. Erstellung einer beispielhaften Anwendung
Um das Gateway in Betrieb zu nehmen, muß die Datei feld.c mit den entsprechenden Daten über
die einzelnen Sensoren gefüllt werden. Dies sind im speziellen die PROFIBUS-Daten und die
verbalen Beschreibungen. In einer weiteren Ausbaustufe wird es sinnvoll sein, zur Konfiguration
eine normale Textdatei zu verwenden, die auch während des Betriebes geladen werden kann und
kein neues Compilieren mehr erfordert.
Die am ICT vorhandene PROFIBUS-Multivendoranlage wurde zum Testen verwendet.
Landis & Gyr
FMS
Allen Bradley
Endress + HauserHirschmann
Saia 2
Phoenix Contact
Hengstler
Bosch
Weidmüller
Klöckner Moeller
Siemens
Saia 4
DP
Gantner
Bosch
Abb. 13.1
Weidmüller
Festo
Siemens
Multivendoranlage am ICT
Der DP-Teil wurde absichtlich auch abgebildet, da die im Resümee angestellten Überlegungen
eine Erweiterung auf DP als sinnvoll erscheinen lassen. In der im Listing dargestellten Anwendung
ist als Tabelleneintrag 1 der Zählwert des Zählers der Firma Hengstler eingetragen, als zweites die
Entfernung des Ultraschallsensors der Firma Endress und Hauser und als letztes ein Slave der
Firma Weidmüller als fiktiver Temperatursensor.
Da die einzelnen Zeilen länger als der Bildschirm sind, wurde von der Regelung in C Gebrauch
gemacht, die erlaubt, als Abstand beliebig viele Leerzeichen zuzulassen. So wurde zum Eintrag in
diese Liste wenigstens etwas an Übersichtlichkeit gewonnen. Um einen weiteren Eintrag in diese
Tabelle einzufügen, kopiert man am besten einen schon bestehenden Eintrag und bessert die sich
ändernden Werte aus. Die als Kommentar über den Werten stehenden Bezeichnungen sind mit
70
Erstellung einer beispielhaften Anwendung
denen aus der MIB identisch. Die zusätzlichen sind in ihrer Bedeutung im Abschnitt „Der zweite
Teil der Struktur Feld_Knoten" genau beschrieben. Der letzte Eintrag, der Nulleintrag, muß
immer erhalten bleiben, um die Funktionsfähigkeit des Programms zu gewährleisten, da
Programmteile dies als Abbruchbedingung verwenden.
#include "feld.h"
struct tabellen_eintrag liste[] =
{
//
1.Zeile
//Index ,descr
,type
{1
,"hengstler"
,0
,i_value
,666
,s_value
,"0"
,time
,0
,
,
//o_type,i_value_o
0
,0
,s_value_o ,o_time
,"0"
,trap
,0
,value1 ,
,0
,0
//value2,status
0
,0
,kbl_nr
,1
,ov_nr
,41
, o_type
,4
,read_status
,0
//,a_trap
,0
,1,1},
,i_value
,23
,s_value
,"0"
,time
,0
,trap
,0
,value1 ,
,0
,0
,
, kind
//
2. Zeile
//Index ,descr
{2
,"endress+h"
,type
,0
//o_type,i_value_o
0
,0
,s_value_o ,o_time
,"0"
//value2,status
0
,0
,kbl_nr
,2
//,a_trap
,0
,1,2},
,ov_nr, o_type
,508
,15
,
,
,
,read_status
,0
, kind
//
letzte. Zeile
//Index ,descr
{-1
,"0"
,type
,0
,i_value,s_value
,0
,"0"
,trap
,time
,
,0
,
,value1 ,
,0
,0
,0
,
//o_type,i_value_o
0
,0
,s_value_o ,o_time
,"0"
//value2,status
,
0
,0
,kbl_nr
,ov_nr, o_type
,read_status
,a_trap
,0
,0
,0
,0
,0
//kind
0,0}};
Listing 13.1
feld.c
Nachdem das Programm mit der so geänderten Datei feld.c assembliert und gelinkt worden ist,
muß noch der Pakettreiber mit „3c509 0x61“ gestartet werden und dann das Programm mit „net“
in Betrieb genommen werden.
71
,
Erstellung einer beispielhaften Anwendung
Zur Überprüfung der Funktion des Gateways erwies es sich als sinnvoll, zuerst mit einem htmlProgramm mit dem Namen Mib-Master die System-MIB anzusehen (Abb. 13.2). Bei dieser
Konfiguration sollte das am Bildschirm sichtbare Bild so aussehen:
Abb. 13.2
MIB-Master betrachtet mit Netscape
Mit geeigneten Werkzeugen kann man eigene ASN.1 files in ein Format übersetzen lassen, das die
eigene MIB genauso übersichtlich anzeigt wie die System-MIB. Hiermit ist offensichtlich, daß
diese Art der Verbindung zwischen einem LAN und einem Feldbus vom Endanwender keine
Kenntnisse über den Feldbus verlangt. Einzig die Konfiguration muß von einem Fachmann
erledigt werden.
Hiermit ist die Funktion der SNMP-Verbindung nachgewiesen. Nun geht man daran, die FeldbusMIB zu erforschen.
Als einfaches Beispiel sollte man im Unterbau fBDescr beginnen:
hier findet man mit
GetRequest(1.3.6.1.4.1.1093.51.6.3.1.0)
die Anzahl der eingegangenen Anfragen.
Wesentlich interessanter gestaltet sich die Erforschung der Zweiges fBAccess. Mit
GetNextRequest(1.3.6.1.4.1.1093.51.6.3.1.0)
fordert man das erste Element der Tabelle an, und erhält in der Antwort auch gleich seine Adresse
mitgeliefert:
72
Erstellung einer beispielhaften Anwendung
Wert:
1
Adresse:
1.3.6.1.4.1.1093.51.6.2.1.1.1.1
Zur Illustration noch einige weitere Beispiele:
GetNextRequest(1.3.6.1.4.1.1093.51.6.2.1.1.2.2)
Wert:
hengstler
Adresse:
1.3.6.1.4.1.1093.51.6.2.1.1.3.1
GetNextRequest(1.3.6.1.4.1.1093.51.6.2.1.1.3.1)
Wert:
endress+h
Adresse:
1.3.6.1.4.1.1093.51.6.2.1.1.3.2
GetNextRequest(3.1.0)
Wert:
1.3.6.1.4.1.1093.51.6.1.1
Adresse:
1.3.6.1.4.1.1093.51.6.2.1.1.4.1
73
Resümee und Aussichten
14. Resümee und Aussichten
Die hier gewählte Methode der Kopplung erweist sich als einfach und billig. Ein PC, der unter
Umständen nur einen 80286 Prozessor besitzen muß, und eine PC Einsteckkarte sind die einzigen
Hardware-Voraussetzungen. Das System ist offen für weitere Entwicklungen wie etwa andere
Feldbussysteme. Die Schwachpunkte liegen in der Konfiguration. Diese ist noch zu umständlich.
Eine Voreinstellung in einer Textdatei, die angibt, nach welchen Geräten am Feldbus gesucht
werden soll, und die Ergebnisse selbsttätig in die Feld_bus-Tabelle einträgt, wäre ein bedeutender
Fortschritt. Zur Übertragung von kritischen Daten ist dieses System von vornherein nicht
geeignet, da das IP keine wie auch immer geartete Zustellungskontrolle bietet. Die Bedienung der
SNMP-Seite und somit auch des gesamten Feldbusses bietet - abgesehen von der Konfiguration auch ungeschultem Personal keine Schwierigkeiten. Dies ist ein bedeutender Vorteil, der auch
eingangs angestrebt wurde.
Das Feldbussystem PROFIBUS erlebte während dieser Arbeit eine nicht unerhebliche Änderung.
PROFIBUS DP bekam einige Erweiterungen. Jetzt ist nicht mehr nur zyklischer, sondern auch
azyklischer Verkehr zwischen Master und Slaves zugelassen. Ebenfalls ist der Datenverkehr
zwischen einem sogenannten „Master 2“ und Slavestationen mögich. Diese sollen eine Visualisierung oder dergleichen ermöglichen. Diese Änderuhngen machen nun auch PROFIBUS DP als
Feldbussystem der gegenständlichen Arbeit interessant. Eine Abänderung dieser Arbeit auf
PROFIBUS DP ist sehr leicht möglich. Statt des PROFIBUS-Tasks müßte ein Task geschrieben
werden, der laufend die Daten zwischen dem Speicher-Bereich, wo sie von PROFIBUS DP
hingeschrieben werden, in die Struktur Feld überträgt. Diese Überlegungen in die Realität
umzusetzen wäre sinnvoll, da PROFIBUS DP 80-90% der in Verwendung stehenden
PROFIBUS-Anlagen ausmacht.
74
Resümee und Aussichten
A Abkürzungen
ASN.1
Abstract Syntax Notation One; eine formale Sprache zur Beschreibung von
Spezifikationen
CMIP
Common Management Informatio Protokol
CMOT
CMIP over TCP
DP
Dezentrale Peripherie;
PROFIBUS
EGP
Externa Gateway Protokoll; eine von Sun Microsystems entwickelte transfer
Syntax
FAN
Field Area Network; ein für den Betrieb in der Feldebene ausgelegtes Netzwerk
FDDI
Fiber Distributed Data Interface
FDL
Fieldbus Data Link; Bezeichnung der Schicht 2 lt. OSI Modell bei P.
FMS
Fieldbus Message Spezifikation; Applikationsfunktionen der gleichnamigen P.
Variante
FTP
File Transfer Protokoll; Protokoll zum Übertragen von Files zwischen zwei
Computern, setzt auf TCP auf
ICMP
Internet Controll Message Protokoll; einfaches Protokoll zur Übermittlung von
Geräteinformationen
IP
Internet Protokoll; weit verbreitetes Schicht 3 Protokoll
ISO
Internationale Standartisierungs Organisation
KBL
KommunikationsBeziehungsListe
KISS
Keep It Simple, Stupid protokol
KR
Kommunikations Referenz
LAN
Lokal Area Network
MIB
Management Information Base
OID
Objekt IDentifier
OSI
Open Systems Interconection
OV
Objektverzeichnis
spezielle
75
Ausführungsform
des
Feldbussystems
Resümee und Aussichten
PA
Prozeß Automation; P. Variante für den eigensicheren Bereich
PDU
Protokol Data Unit
PNO
P. Nutzerorganisation
PROFIBUS
PROzeß FIeld BUS; Bussystem für den Feldbereich, genormt in EN50170
RFC
Request for Comments; eine Dokumentenserie, die die Internetprotokolle
beschreibt
SAP
Service Access Point; Dienstzugangspunkt
SNMP
Simple Network Management Protokoll
TCP
Transport Controll Protokoll
UDP
User Datagramm Protokoll
76
Resümee und Aussichten
A Literatur
[SIE95]
Siegl, M.; Schmalek, R., "FAN-LAN-Kopplung", Feldbustechnologie ‘95, ÖVESchriftenreihe Band 9, S. 431-438, Wien 1995.
[EN50170]
Europäische Norm 50170, Teil2, PROFIBUS, Dezember 1996.
[RFC791]
Request for Comments Dokument Nr. 791, Internet Protokoll.
[HUI96]
C. Huitema, Routing im Internet,Prentice-Hall, New Jersey, 1996.
[MAR94]
J. Martin, "TCP/IP networking. Architekture, administration, and programming",
Prentice-Hall, New Jersey, 1994.
[RFC793]
Request for Comments Dokument Nr. 793, Transmission Control Protokoll.
[RFC768]
Request for Comments Dokument Nr. 768, User Datagramm Protokoll.
[RFC1157]
Request for Comments Dokument Nr. 1157, Simple Network Management
Protokoll.
[RFC1156]
Request for Comments Dokument Nr. 1156, Management Information Base.
[RFC1213]
Request for Comments Dokument Nr. 1213, Management Information Base II.
[ROS91]
M. T. Rose, "The Simple Book, An Introduktion to Management of TCP/IP based
internets", Prentice-Hall, New Jersey, 1991.
[GOR92]
W. Gora, "ASN.1, Abstract Syntax Notation One", Datacom-Verlag, 1992.
77
Resümee und Aussichten
[BEN92]
K. Bender, "PROFIBUS Der Feldbus für die Automation", Carl Hanser Verlag
München Wien, 1992.
[POP97]
M. Popp, "The rapid way to PROFIBUS-DP", PROFIBUS Nutzerorganisation
Karlsruhe, 1997.
[COM94]
D. E. Comer und D. L. Stevens, "Internetworking with TCP/IP", Band3, ClientServer Programming And Applications,Prentice-Hall, New Jersey, 1994.
[KNI97]
Knizak M., Manninger M., Sauter Th., "Einbindung von Feldbussen in das Internet
via SNMP", e&i 5/97, S.258.
[WAD92]
I. Wade, "NOSintro, TCP/IP over Packet Radio", Dowermain, 1992.
78
Zugehörige Unterlagen
Herunterladen