Die Überlegungen des vorigen Abschnitts legen es nahe, das Treiberkonzept gemäß allen Anforderungen völlig neu zu implementieren. Dies war Aufgabe der vorliegenden Arbeit.
Der logische Aufbau der einzelnen Services läßt sich mit einem
objektorientierten Modell beschreiben [Boo91]. In solch einem
Modell bilden Objekte den Ausgangspunkt. Alle physikalisch
vorhandenen Gegenstände, aber auch abstrakte Dinge, können als
Objekt betrachtet werden. Alle gleichartigen Objekte gehören zur
selben Klasse. Ein konkretes Exemplar einer Klasse nennt man
eine Instanz dieser Klasse. Der Zustand einer Instanz wird
durch die Werte seiner Instanzvariablen beschrieben. Methoden dienen dazu, diese Werte wiederzugeben oder zu
manipulieren. Die Parallelen zum Gerätetreiberkonzept zeigen sich in
der Entsprechung von Servicetyp und Klasse, Service und Instanz, Feld
und Instanzvariable sowie von Aktion und Methode (siehe
Tabelle ).
Als Programmiersprache wurde C++ verwandt, die als objektorientiere Erweiterung der Sprache C für diese Anwendung gut geeignet ist. C ist eine im Institut und auch allgemein weit verbreitete Sprache. Die gesamte Steuerungs- und Datenerfassungssoftware ist z.B. in C geschrieben [Kun93a][Kry93][Kra93]. Auch C++ wurde schon in einigen Arbeiten eingesetzt [Ste93][Sch93][Kra93]. Der Programmierer muß sich also lediglich mit einigen objektorientierten Erweiterungen vertraut machen. Vorteilhaft ist, daß C++ selbständig mehrere Instanzen einer Klasse verwalten kann. Dadurch können in einem Programm einmal implementierte Objekte mehrfach benutzt werden. Für neue Klassen, die ähnliche Eigenschaften wie bereits existierende haben, müssen nur die Unterschiede implementiert werden, da durch die sog. Vererbung Eigenschaften übernommen werden können. All dies ist in C nicht möglich [Lip91].
Mit dem objektorientierten Programmiermodell kann die in
Abschnitt beschriebene Gerätestruktur direkt im
Programmcode abgebildet werden. Mit Hilfe dieser Sprache wurde der in
diesem Abschnitt beschriebene Satz von Klassen aufgebaut.
Ein Gerätetreiber implementiert eine oder mehrere verschiedene Serviceklassen und unterstützt damit einen oder mehrere Gerätetypen. Jedem dieser Gerätetypen wird ein eindeutiger Typname zugeordnet, über den die Namen der Services mit den Servicetypen verbunden werden. Die Klassen definieren Datenstrukturen, die die Einstell- oder Meßwerte enthalten, und Objekte, die die Aktionen zur Verfügung stellen, die auf die Werte angewendet werden können.
Wird ein Gerätetreiber für einen speziellen Service gestartet, erfragt er als erstes den Typ des Services und überprüft, ob er für diesen Typ eine Serviceklasse zur Verfügung stellt oder nicht. Wenn dies der Fall ist, wird eine Instanz dieser Klasse erzeugt, die dann für die Bedienung des speziellen Gerätes zur Verfügung steht.
Eine Nachricht an einen Gerätetreiber, die einen Aktionsauftrag enthält, gibt zusätzlich zum Messagesystemnamen, der dem Servicenamen entspricht, das Feld und die Aktion an und beinhaltet auch die Daten, die für die Aktion bestimmt sind. Der Gerätetreiber sucht anhand dieser Informationen die richtige Aktion, ruft deren Funktion auf, die die Aktion ausführt, und übergibt ihr die Daten.
In Anhang wird ein einfaches Beispiel für einen
Gerätetreiber beschrieben.