File Access

Diese Gruppe enthält Funktionsblöcke zum Lesen und Schreiben von Daten auf dem Dateisystem.

Allgemeines

Diese Funktionsblöcke arbeiten asynchron; die Zeit von der ersten Ausführung bis zum gewünschten Ergebnis erstreckt sich über mehrere Zyklen. Die tatsächliche Dauer jedes Lese-/Schreibvorgangs hängt von verschiedenen Faktoren ab, z.B. von der Größe des Bildes und dem Verhalten des Betriebssystems. Die folgenden Parameter sind bei allen Funktionsblöcken gleich und sind daher einmal hier zentral beschrieben.

Parameter

Dateipfad

Der Dateipfad sFilePath legt fest, wo eine Datei gespeichert werden soll bzw. welche Datei geladen werden soll. Es können absolute und relative Pfade verwendet werden. Bei relativen Pfaden werden die Standardpfade, die in der Service Configuration festgelegt sind, als Basis verwendet.

File Access 1:

Pfadlänge

Der Typ des sFilePath ist als STRING angegeben, es können aber Pfade mit einer Länge bis zu 255 Zeichen übergeben werden.

Der Dateipfad wird bei einer steigenden Flanke des Schreib-Befehls bWrite intern gespeichert, sodass Änderungen des Pfads in späteren Zyklen keine Auswirkung haben.

Funktion ausführen

Die Trigger für Schreib- und Lese-Befehle sind bWrite und bRead. Sie werden durch eine steigende Flanke (Wechsel von FALSE nach TRUE) ausgelöst. Dabei werden die relevanten Eingangsparameter intern gespeichert, sodass eine Änderung der Parameter während der Ausführung keinen Einfluss hat. Ebenso hat eine fallende Flanke der Trigger keine Auswirkung.

File Access 2:

Funktionsblöcke aufrufen

Beachten Sie, dass das Beschreiben von Parametern bei Funktionsblöcken nur eine Auswirkung hat, wenn dieser auch aufgerufen wird.

Timeout

Um in unbekannten Fehlerfällen nicht ewig auf die Ausführung des Funktionsblocks zu warten, kann mit nTimeout die maximal erlaubte Ausführungszeit festgelegt werden. Wenn diese Zeit ohne erfolgreiches Ergebnis nach Auslösen des Befehlstriggers überschritten wird, wird die Ausführung abgebrochen. Der Timeout-Fehler ist dann über die beiden Ausgänge bError und nErrorId zu erkennen.

Arbeitsstatus

Der Ausgang bBusy gibt an, ob der Funktionsblock beschäftigt ist. Wenn bBusy = TRUE kann kein neuer Befehl ausgelöst werden.

Mittels einer geeigneten IF-Abfrage kann festgestellt werden, ob die Ausführung des Funktionsblocks abgeschlossen ist:

IF NOT fbReadOrWrite.bBusy THEN
    // Function block execution is complete or error occurred.
    // Next write-command can be issued.
END_IF

Fehlerstatus

Der Fehlerstatus wird angegeben, indem bError binär auf einen Fehler hinweist und nErrorId ggfs. den Fehlercode (ADS Return Code) ausgibt. Der Fehlerstatus wird zurückgesetzt, sobald ein neuer Befehl ausgelöst wird. Der Fehlercode ist PENDING (16#71E), wenn der Funktionsblock beschäftigt ist (bBusy = TRUE).

Der Hexadezimalwert des Fehlercodes kann wie folgt extrahiert werden:

IF fbReadOrWrite.bError THEN
    // Show relevant error code for debugging purposes:
    nErrorCode := fbReadOrWrite.nErrorId AND 16#FFF;
END_IF

Die häufigsten Fehlercodes sind:

Hex

Dec

Name

Bedeutung

16#006

6

TARGETPORTNOTFOUND

ADS-Server nicht erreichbar. Tritt im Wesentlichen auf, wenn der TwinCAT Vision Service nicht gestartet ist. Siehe Vision Service startet nicht.

16#700

1792

ERROR

Allgemeiner Fehler, wenn das Speichern oder Laden fehlschlägt. Dieser weist meistens darauf hin, dass das angegebene Dateiformat nicht unterstützt wird oder, dass der Dateipfad nicht erreichbar ist.

Dieser Fehler tritt im Regelfall im TwinCAT Vision Service auf.

16#70B

1803

INVALIDPARM

Invalider Parameter. Dies weist meistens darauf hin, dass der Interface Pointer nicht valide ist.

16#719

1817

TIMEOUT

Timeout. Das Laden oder Speichern hat die maximale Ausführungszeit nTimeout überschritten. Generell tritt dies hauptsächlich bei starker Auslastung von ADS auf.

16#71E

1822

PENDING

Kein wirklicher Fehler, daher ist hierbei auch der Ausgang bError nicht gesetzt. Dieser Code signalisiert, dass der Funktionsblock beschäftigt ist. Er tritt parallel zum Ausgang bBusy auf, falls während Beschäftigtseins des Funktionsblocks eine neue steigende Flanke registriert wird.

Beispiele