Allgemeiner Treiber
Der Allgemeine Treiber ist eine Sammlung von Klassen, welche die Funktionalität abdeckt, die jeder Treiber in WinCC OA enthalten sollte. Außerdem definiert er eine Schnittstelle zum hardwarespezifischen Teil. Der Allgemeine Treiber enthält folgende Funktionalität:
Initialisierung des Datenpunkttyp- und Datenpunktcontainers
Umwandlung von internen Datenpunktnamen auf DpIdentifier (über Data-Manager)
Hinweis
Die Umwandlung eines DpIdentifiers in einen String bei unbekanntem DP liefert die Nummer des DpIdentfiers.
Anmeldung beim Event-Manager für die Datenpunkte (bzw. Peripherieadressen), die auf Ausgang parametriert sind
Anmeldung bei Event-Manager für treiberinterne Datenpunkte
Zuordnung von Peripherieadressen auf Hardwareadressen und umgekehrt
Connect-Mechanismus (Event-Manager meldet sich für Attribute beim Treiber an)
Request-Behandlung (Behandlung von Abfragen der Attribute jener Configs, die vom Treiber verwaltet werden.)
Polling (Zyklische Abfragen von Eingangswerten.)
Transformation (HW-Datenformate auf WinCC OA Datenformate und umgekehrt)
Befehls-, Meldeumrechnung und Glättung
Reconnect bei Ausfall des Event-Manager
Überwachung der Verbindung(en) zu Hardwarekomponenten (Alive-Mechanismus)
Diese Funktionalität wird soweit als möglich über virtuelle Funktionen so implementiert, dass durch Ableiten einer eigenen Klasse und Definition eigener Funktionen die Bearbeitung modifiziert werden kann. Dabei sollten natürlich nur die Sonderfälle behandelt werden und im Normalfall die Methoden der Basisklasse zur Bearbeitung aufgerufen werden.
Das (Software-)Interface zur Hardware wurde als leere Klasse implementiert, die naturgemäß für jeden realen Treiber abgeleitet und implementiert werden muss (HWService!).
Hinweis
Werden mehr als drei Treiber verwendet und somit neue Datenpunkte vom Typ _DriverCommon angelegt, so müssen diese auch in der Config-Datei config.redu berücksichtigt werden!
Ablauf
Der allgemeine Treiber durchläuft folgende Phasen (diese entsprechen den verwendeten Routinen):
init()
connectToData()
HWService.initialize()
connectToEvent()
HWService.start()
mainLoop()
HWService.stop()
Nach dem Start werden die verschiedenen Treibermodule initialisiert (mittels init()). Die dafür vorhandenen Methoden sind:
install_DpContainer()
: Initialisierung und Einbindung des Datenpunktcontainers
install_DpConfigManager()
: Initialisierung des treiberinternen Konfig-Manager
install_HWMapper()
: Installiert die Zuordnungstabelle zwischen Hardwareobjekten und Datenpunkten
install_HWService()
: Der HWServicehandler ist die Schnittstelle zur Hardware und enthält alle Methoden zur Kommunikation mit der Hardware. Dieser Teil wird immer abgeleitet.
install_PollGroupList()
: Verwaltung der zyklisch abzufragenden Datenpunkte mittels Pollgruppen.
install_PollList()
: Verwaltung der zyklisch abzufragenden Datenpunkte mit Poll-Liste. Seit 3.0 nur mehr zwecks Kompatibilität mit dem alten Pollmodus nötig.
install_IOTransCont()
: Verwaltung der Transaktionen von I/O Adressen.
set_DpConfigInitList()
: setzt Zeiger auf Liste der Konfigtypen, die der Datenmanager nach dem Verbindungsaufbau schicken soll.
Nach dieser Initialisierung wird die Verbindung mit dem Data-Manager aufgebaut
(connectToData()
) und die Konfigs des Treibers vom Data-Manager geschickt. Dann wird das
HWService-Objekt initialisiert (HWService.initialize()
).Die Verbindung mit dem
Event-Manager wird aufgenommen (connectToEvent()
). Die Kommunikation des hardwarespezifischen
Treiberteils wird gestartet (HWService.start()
). Meist wird dabei auch bereits die Kommunikation
mit der Peripherie aufgenommen. Dann läuft der Treiber in einer Schleife, in der er auf Messages
wartet und prüft, ob Datenpunkte der Peripherie zu pollen sind und ruft zyklisch eine
Arbeitsprozedur (workProc()
) des HWService-Objektes auf, die von der Peripherie ankommende Daten
behandelt und verarbeitet, sowie eventuell benötigte Antworten schickt. Messages, die interne
Datenpunkte des Treibers betreffen, werden hierbei an das HWService-Objekt
weitergereicht.
Ist irgendeine Peripherie-Adresse auf Polling eingestellt, wird zu den
parametrierten Zeitpunkten HWService::singleQuery()
aufgerufen, um den Wert abzufragen.
Darüber hinaus werden in der HWService::workProc()
die spontanen Benachrichtigungen
verarbeitet. Die Verarbeitung von Wertemeldungen im HWService-Objekt erfolgt durch Aufruf der
Funktion toDp()
des DrvManagers. Diese nimmt ein HardwareObjekt entgegen, führt gegebenenfalls
einen low-level-alt-neu-Vergleich durch (parametrierbar, basiert auf einem byteweisen Vergleich
der Datenpuffer des HardwareObjekts), wandelt es in ein WinCC OA internes Datenformat um
(mittels geeigneter datenformatabhängiger Transformation), führt gegebenenfalls Umrechnung und
Glättung durch und sendet es (falls es nicht in den vorigen Schritten weggeglättet wurde) an den
Event-Manager.
In Befehlsrichtung sorgt die Funktion toHW()
für die Umformung von WinCC OA
Datenpunkten in Hardwareobjekte, die dann von der Methode HWService::writeDate()
des
HWServicehandlers an die Peripherie verschickt werden. Daten, die vom Kommunikationsprotokoll
als Einheit behandelt werden (diese gehören meist auch logisch zusammen), müssen auch als Gruppe
parametriert werden (im Konfig _address). Diese werden dann vom allgemeinen Treiber auch
automatisch als Gruppe angemeldet, wodurch bei jeder Datenänderung durch einen Benutzer der
Eventmanager die ganze Gruppe gemeinsam an den Treiber schickt. Dieser stellt die Daten bereits
in der Routine toHW()
zu einem Paket zusammen und sie werden als einzelnes Hardwareobjekt an
writeData()
übergeben.
Vor Beenden des Treibers wird noch die Funktion HWService.stop()
ausgeführt, die für einen geregelten Verbindungsabbau zur Peripherie sorgt.
Kapitel | Beschreibung |
---|---|
Allgemeiner Treiber | Allgemeines und Links zu den Kapiteln. |
Klassen | Einleitung zu den Klassen. |
DrvManager | Der DrvManager ist die Manager-Klasse des Treibers. Sie ist ihrerseits von der Basis-Klasse Manager abgeleitet. |
DrvRsce | Die Klasse DrvRsrce stellt das Interface zu den Ressourcen (der Konfigurationsdatei) dar. |
DrvDpCont | Diese Klasse - vom DpContainer abgeleitet - implementiert die Besonderheiten des Treiber-Datenpunktcontainers wie z.B. Umrechnungs- oder Glättungskonfigs, die auch an Knoten im Datenpunkt definiert werden können und für darunterliegende Elemente gelten. |
DrvDpConfMan | DrvDpConfMan ist ein Manager für die Configs des Treibers. |
HWMapper | Diese Klasse dient der Abbildung von Peripherie auf Hardware-Adressen und umgekehrt. |
Transformation | Transformationen beschreiben den Zusammenhang zwischen Hardwareobjekt und der Darstellung in WinCC OA . |
HWMapDpPa | Diese Klasse stellt die Verbindung zwischen Peripherie-Adressen-Config und DpIdentifier her. |
HWObject | HWObject ist die Basisklasse für ein Hardware-Objekt. |
HWService | Diese Klasse beinhaltet das Interface zwischen Allgemeinem Treiber und Hardware-spezifischem Teil. |
DrvAlive | Bildet die Basisklasse für die Implementierung eines Alive-Mechanismus für eine physikalische Verbindung. |
PollGroupList | Ist eine dynamische Liste von Pollgruppen, die die zu pollenden Adressen enthalten. Die Pollgruppenliste ist nach dem Pollzeitpunkt sortiert. |
PollGroup | Sind die einzelnen Einträge der PollGroupList. |
Implementation | Bei der Implementierung eines eigenen Treibers müssen neue Klassen, von den im allgemeinen Treiber definierten Klassen, abgeleitet werden. |