Zugriff auf die Prozessdaten des Feldbusses

Der konsistente Zugriff über die IO-Task funktioniert nur für die Variablen des Feldbusses, die mit der IO-Task verknüpft sind. Wie weiter oben bei der Konfiguration für eine Eingangs-Variable gezeigt, müssen für alle Feldbus-Variablen, auf die konsistent zugegriffen werden soll, entsprechende Variablen der IO-Task angelegt und mit diesen verknüpft werden. Die Offsets der Zugriffsfunktionen beziehen sich auf die Adressen der Variablen der IO-Task (die Variable BoxErrorCounter befindet sich auf Adresse 0 des Eingangsprozessabbildes der IO-Task):

Zugriff auf die Prozessdaten des Feldbusses 1:

Das Prozessabbild der IO-Task kann in Form einer H-Datei exportiert werden, wenn man mit der rechten Maustaste auf die IO-Task im Baum klickt:

Zugriff auf die Prozessdaten des Feldbusses 2:

StartImageUpdate

long StartImageUpdate(int portNo, int time, int outpLength, int inpLength);

Die Funktion StartImageUpdate muss beim Hochlauf der Anwendung einmal aufgerufen werden, um den Timer zu starten, der den konsistenten Zugriff auf die Prozessdaten durchführt. Dabei sind der Port portNo der IO-Task, die Zykluszeit time des Timers in ms sowie die Länge des Eingangs- bzw. Ausgangs-Prozessabbildes inpLength bzw. outpLength der IO-Task (entsprechend der bei der Definition der Variablen erzeugten Adressen) anzugeben. Innerhalb der Timer-Routine wird das Eingangs-Prozessabbild der IO-Task konsistent gelesen und lokal zwischengespeichert, so dass der Zugriff auf die Eingangs-Prozessdaten mit der Funktion ReadInputs sehr schnell geht. Das Ausgangs-Prozessabbild der IO-Task wird nur mit dem lokalen Prozessabbild konsistent aktualisiert, wenn durch einen Aufruf von WriteOutputs auf das lokale Prozessabbild zugegriffen wurde. Auch der Aufruf von WriteOutputs geht daher sehr schnell.

Rückgabewerte:

0:   kein Fehler

-1: Timer konnte nicht gestartet werden

-2: AMS-Adresse konnte nicht gelesen werden

-3: nicht genügend Speicher für lokales Prozessabbild

-4: Timer läuft bereits

StartImageUpdateWithWd

long StartImageUpdateWithWd(int portNo, int time, int outpLength, int inpLength, int wdTime);

Die Funktion StartImageUpdateWithWd beinhaltet die gleiche Funktionalität wie StartImageUpdate und startet zusätzlich noch einen Watchdog. Der Watchdog wird nachgetriggert, wenn die Funktionen ReadInputs oder WriteOutputs aufgerufen werden. Ist das innerhalb der Watchdog-Time nicht der Fall, wird ein IO-Reset auf allen Devices durchgeführt (das führt zum Abschalten der Ausgänge) und die Outputs im Prozessabbild werden auf 0 gesetzt. 

StopImageUpdate

long StopImageUpdate(void);

Die Funktion StopImageUpdate muss nur aufgerufen werden, wenn beim Beenden der Anwendung die DLL nicht automatisch entladen wird (ist bei z.B. bei Anwendung auf LabView-CVI-Basis der Fall).

Rückgabewerte:

0:   kein Fehler

-5: DLL nicht mehr aktiv

ReadInputs

long ReadInputs(int offset, int length, unsigned char * pData);

Mit der Funktion ReadInputs wird das lokale Eingangs-Prozessabbild bzw. Teile davon gelesen. Dabei sind der offset innerhalb des Eingangs-Prozessabbildes der IO-Task, die Länge length der zu lesenden Daten und ein Pointer pData auf einen Speicherbereich, in den die Eingangsdaten kopiert werden können, übergeben werden.

Rückgabewerte:

0:   kein Fehler

-1: Timer läuft nicht

-2: Offset ist zu groß

-5: DLL nicht mehr aktiv

WriteOutputs

long WriteOutputs(int offset, int length, unsigned char * pData);

Mit der Funktion WriteInputs wird das lokale Ausgangs-Prozessabbild bzw. Teile davon beschrieben. Dabei sind der offset innerhalb des Ausgangs-Prozessabbildes der IO-Task, die Länge length der zu lesenden Daten und ein Pointer pData auf einen Speicherbereich auf die Ausgangsdaten, übergeben werden.

Rückgabewerte:

0:   kein Fehler

-1: Timer läuft nicht

-2: Offset ist zu groß

-5: DLL nicht mehr aktiv