Direkter Zugriff auf DP-RAM
Alternativ zum konsistenten Zugriff über die IO-Task kann direkt auf das DP-RAM zugegriffen werden. Dabei ist nur WORD-Konsistenz möglich, dafür ist er maximal schnell, die Totzeit (Alter einer gelesenen Variable bzw. Verzögerungszeit bis eine geschriebene Variable auf dem Feldbus gesendet wird) ist maximal so groß wie die Zykluszeit der IO-Task. Es ist zu beachten, dass die Ausgangsvariablen des Feldbusses, die über direkten Zugriff beschrieben werden, nicht mit Variablen der IO- Task verknüpft sein dürfen, da diese sonst durch die IO-Task wieder überschrieben werden. Die Offsets der Zugriffsfunktionen beziehen sich auf die Variablenadressen des Feldbus Devices, d. h. die Adresse ist auf dem Karteireiter "Variable" bei der entsprechenden Variablen unter dem Feldbus Devices nachzuschauen (in dem abgebildeten Beispiel handelt es sich um die Adresse 4.1):
Bei den PROFIBUS-PC-Karten FC310x ist zu beachten, dass die 4 Bytes vor jeder ersten Eingangs- und Ausgangsvariable eines PROFIBUS-Slaves für den PROFIBUS-Protokollheader verwendet werden (daher ist der kleinste Offset einer Variablen an der FC310x auch 4), ein Beschreiben dieser jeweiligen 4 Bytes führt zu Störungen auf dem PROFIBUS. Daher sollte darauf geachtet werden, dass beim direkten Zugriff nur auf die Bereiche zugegriffen wird, in denen sich tatsächlich Variablen befinden, eine Übersicht kann man sich im rechten Fenster unten anzeigen lassen, wenn man im Baum das Prozessabbild des Devices anklickt:
Wenn man mit der rechten Maustaste auf die Liste klickt, kann diese auch gedruckt oder z.B. nach Excel kopiert werden.
Bei den Zugriffsfunktionen muss die DP-RAM-Adresse übergeben werden, die unter PCI Bus/Slot auf dem Karteireiter "FC310x", "FC510x" bzw. "FC520x" gelesen werden kann, wenn man im Baum auf das Feldbus Device klickt:
ReadInputsDirect
long _stdcall ReadInputsDirect(unsigned long dpRamAddress, int offset, int length, unsigned char * pData);
Mit der Funktion ReadInputsDirect werden Eingangsvariablen des Feldbus-Devices direkt aus dem DP-RAM gelesen, der Aufruf der Funktion geht sehr schnell (ca. je Wort ca. 1,5 µs). Dabei sind die DP-RAM-Adresse dpRamAddress des Feldbus-Devices, der offset und die Länge length der Eingangsvariablen im DP-RAM und ein Pointer pData auf einen Speicherbereich, in den die Eingangsdaten kopiert werden können, übergeben werden.
Rückgabewerte:
0: kein Fehler
-1: DP-RAM-Pointer konnte nicht alloziert werden
-2: Offset ist zu groß
-3: DP-RAM-Adresse anders als bei den vorherigen Aufrufen von ReadInputsDirect oder WriteOutputsDirect
-5: DLL nicht mehr aktiv
WriteOutputsDirect
long _stdcall WriteOutputsDirect(unsigned long dpRamAddress, int offset, int length, unsigned char * pData);
Mit der Funktion WriteOutputsDirect werden Ausgangsvariablen des Feldbus-Devices direkt in das DP-RAM geschrieben, der Aufruf der Funktion geht sehr schnell (ca. 1,5 µs je Bereich). Dabei sind die DP-RAM-Adresse dpRamAddress des Feldbus-Devices, der offset und die Länge length der Ausgangsvariablen im DP-RAM und ein Pointer pData auf die Ausgangsdaten, übergeben werden.
Rückgabewerte:
0: kein Fehler
-1: DP-RAM-Pointer konnte nicht alloziert werden
-2: Offset ist zu groß
-3: DP-RAM-Adresse anders als bei den vorherigen Aufrufen von ReadInputsDirect oder WriteOutputsDirect
-5: DLL nicht mehr aktiv
GetDirectInputPointer
void * GetDirectInputPointer(unsigned long dpRamAddress);
Mit der Funktion GetDirectInputPointer kann ein Pointer auf das Eingangsprozessabbild im DP-RAM geholt werden. Die Adressen der Eingangsvariablen müssen, wie oben beschrieben, aus dem System Manager entnommen werden. Dabei ist die DP-RAM-Adresse dpRamAddress des Feldbus Devices zu übergeben.
Rückgabewerte:
0: Fehler
!= 0: Pointer auf Eingangsvariablen im DP-RAM
GetDirectOutputPointer
void * GetDirectOutputPointer(unsigned long dpRamAddress);
Mit der Funktion GetDirectOutputPointer kann ein Pointer auf das Ausgangsprozessabbild im DP-RAM geholt werden. Die Adressen der Ausgangsvariablen müssen, wie oben beschrieben, aus dem System Manager entnommen werden. Dabei ist die DP-RAM-Adresse dpRamAddress des Feldbus Devices zu übergeben.
Rückgabewerte:
0: Fehler
!= 0: Pointer auf Eingangsvariablen im DP-RAM