DrvRsrce
Die Klasse DrvRsrce stellt das Interface zu den Ressourcen (der Konfigurationsdatei) dar. Sie ist ihrerseits von der Klasse Resources abgeleitet und implementiert treiberspezifische Funktionen - vor allem die treiberinternen Datenpunkte betreffend. Für den allgemeinen Treiber existieren 4 interne Datenpunkte, die je Treiber einmal aufgelegt werden können. In der Konfigurationsdatei wird ihre Zuordnung zu den entsprechenden Datenpunktnamen festgelegt (siehe Beispiel unten).
In der Konfigurationsdatei gibt es für jeden Treibermanager eine eigene Sektion, die mit einem treiberspezifischen Namen (zwischen [ und ]) beginnt. Zusätzlich kann auch jeder Treiber mehrmals im System laufen (für die Kommunikation mit verschiedenen Peripheriekomponenten, die über die gleichen Protokolle mit WinCC OA kommunizieren), wobei dann jeder mit einer eindeutigen Nummer, die mittels Kommandozeilenoption "-num x" angegeben wird, gestartet werden muss. Für jeden dieser Treiber kann man zusätzlich in der Konfigurationsdatei eine eigene Sektion angeben, wobei an den Sektionsnamen noch die Nummer angehängt werden muss. Im Beispiel unten behandelt die Sektion [myDrv] alle Treiber vom Typ myDrv und die Sektion [myDrv_2] nur den Treiber myDrv mit der Nummer 2.
Jeder Ressourceneintrag steht in einer eigenen Zeile, beginnend mit Ressourcenname und =, dahinter kommen die zugehörigen Parameter. Kommentarzeilen beginnen mit #.
Beispiel einer Konfigurationsdatei
# Sektion, die alle Treiber vom Typ myDrv betrifft
#(der Eintrag könnte auch WCCOAmyDrv sein)
[myDrv]
instantGA = "Yes"
# Sektion, die die Einstellung für den myDrv mit der
# Nummer 2 angibt
[myDrv_2]
drvGQ = "_Driver2.GQ:_original.._value"
drvSQ = "_Driver2.SQ:_original.._value"
drvSmoothMode = "_Driver2.SM:_original.._value"
drvErrorMode = "_Driver2.EM:_original.._value"
# Der Datenpunkt _Driver2 vom Typ CommonDriver muss angelegt werden
Zur Abarbeitung dieser Einträge muss im speziellen Treiber die Methode readSection(..) überschrieben werden:
mydrvRsrce::readSection()
{
static char line[200];
if (!isSection("mydrv")) return PVSS_FALSE;
getNextEntry();
while (cfgState != CFG_STATE_START && cfgState != CFG_EOF)
{
if (keyWord == "instantGA") cgfStream >> instantGA;
else if (!commonKeyWord())
//check, if the keyWord belongs to the Resources of ComDrv (drv..)
cerr << "unknown keyWord" << endl; // Fehlermeldung
cfgStream.get(line,200,´/n´);
getNextEntry();
}
return PVSS_TRUE;
}
Die Funktion getNextEntry() holt den jeweils nächsten Eintrag in der Konfigurationsdatei (die nächste Zeile), prüft die syntaktische Korrektheit und weist der Variable keyWord den Ressourcennamen zu.
Die Klasse DrvRsrce deklariert ein enum InternalDpIdType, welches vordefinierte enum´s für folgende internen Datenpunkte des allgemeinen Treibers zur Verfügung stellt. Diese Deklaration und eine Beschreibung der einzelnen Werte sind in der entsprechenden Headerdatei ComDrv/DrvRsrce.hxx ersichtlich.
Das Glättungsverhalten kann auf einen der folgenden Werte eingestellt werden:
Modus | Aufgabe | Durchführung |
---|---|---|
SMOOTH_MODE_ALWAYS | Die Glättung wird immer durchgeführt | setze internen Datenpunkt drvSmoothMode auf 0 |
SMOOTH_MODE_NOTGQ | Glättung nur bei spontanen Wertänderungen | setze internen Datenpunkt drvSmoothMode auf 1 |
SMOOTH_MODE_NEVER | Es wird keine Glättung durchgeführt | setze internen Datenpunkt drvSmoothMode auf 2 |
Grundsätzlich betreffen obige Werte nur die Datenpunkte, für die ein Glättungskonfig parametriert wurde.
Des Weiteren stellt die Klasse DrvRsrce ein Interface mittels virtueller Funktionen zur Einbindung der internen Datenpunkte zur Verfügung:
int getNumberOfDpNames()
- Diese Funktion sollte die Anzahl der internen Datenpunkt zurückliefern.CharString& getDpName4Query(int index)
- Diese Funktion sollte den Namen des indexten Datenpunktes liefern (Sie wird benötigt, um beim Data-Manager den zugehörigen DpIdentifier zu erfragen).
void setDpIdentifier(CharString& name, DpIdentifier& dpId)
- Diese Funktion wird aufgerufen, um für den Datenpunkt mit Namen name den DpIdentifier bekanntzugeben.
PVSSboolean allIdsGot()
- sollte PVSS_TRUE zurückliefern, wenn für alle internen Datenpunkte der DpIdentifier bekanntgegeben wurde.
int getNumberOfIds2Connect()
- Diese Funktion sollte die Anzahl der DpIdentifier zurückliefern, für die sich der Treiber beim Eventmanager anmelden soll.
DpIdentifier& getId2Connect(int index)
- Diese Funktion sollte den DpIdentifier des indexten Datenpunktes zurückliefern, für den sich der Treiber beim Event-Manager anmelden soll.
InternalDpIdType isInternalDpId(DpIdentifier& dpId)
- Mit dieser Funktion prüft der allgemeine Treiber, ob es sich bei einem DPID für den ein Hotlink gekommen ist, um einen internen Datenpunkt handelt. D.h. diese Funktion muss INTERNAL_DPID zurückgeben, wenn der dpId ein interner DP des speziellen Treibers ist. Ist dpId kein interner DP so muss die Funktion NOT_INTERNAL_DPID zurückgeben.
void answer4DpId( const DpIdentifier& dpId, Variable * varPtr)
- wird aufgerufen bei der unmittelbaren Antwort auf die Anmeldung (dpConnect) eines internen Datenpunktes beim Eventmanager. Der neue Wert wird in varPtr mitgeliefert. Die Funktion sollte diese Wertänderung verarbeiten.
Spontane Benachrichtigungen (Hotlinks) auf interne Datenpunkte werden im HWService Objekt empfangen.
Die unterschiedlichen Funktionen für Namen-DpIdentifier-Mapping und Anmeldung für Originalwerte wurden definiert, um dem Treiber die Möglichkeit zu geben, interne Datenpunkte zur Speicherung eigener Informationen (ohne Anmeldung beim Eventmanager) zu besitzen.
Die von DrvRsrce abgeleitete Klasse muss im main() des speziellen Treibers instanziert werden!