Twincat FB_FileWrite: sporadische Fehler

twyn

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe seit geraumer Zeit ein Problem mit dem FileIO unter Twincat 2. Ich komme trotz intensiver Suche nicht weiter und brauche dringend eure Hilfe.

Ich möchte unter Twincat2 Strings in eine Datei schreiben. Das sollte ja eigentlich kein Problem darstellen: ich verwende FileOpen, FileWrite und FileClose.
Nun zeigen sich aber zwei Fehler:

Fehler 1: Es ist- wieso auch immer- nur jedes zweite Schreiben erfolgreich, die anderen Schreibzugriffe laufen ins Leere. Das kann ich zwar umgehen indem ich jedes zweite mal einen Dummystring in die Datei schreibe, der dort nicht ankommt, schön ist jedoch was anderes.
Was mir aber wirklich Kummer bereitet ist der zweite Fehler:

Fehler 2:
Nach einiger Zeit funktioniert die FileWrite-Funktion nicht mehr, dh. die Funktion wird mit einem Fehler beendet. Der Errorcode ist 0x703 (invalid index offset). Das Problem hierbei ist, dass mein Funktionsblock etwa 700 mal ohne Probleme ausgeführt ist, und dann ohne sichtbaren Grund einfach nicht mehr funktioniert. Auch wenn ich die PLC resette und neu starte funktioniert das Schreiben einer Datei nicht, erst wenn ich den SystemManager neu starte funktioniert der Funktionsblock wieder- aber wieder eben nur ein paar taused mal.

Ich bin mit meinem Latein am Ende. Habt ihr irgendwelche Ideen? Ich würde auch alternative FileIO-Funktionen benutzen, oder das ganze FileHandling auslagern, hauptsache ich bekomme diesen Fehler los -.-

Im Folgenden mein Funktionsblock:

Code:
CASE nState OF

    0: (* idle & init *)
        IF(bExecute = TRUE) THEN
            bExecute := FALSE;
            bBusy := TRUE;
            bError := FALSE;
            nErrId := 0;
            nErrState := 0;
            hFile := 0;
            bAgain := TRUE;

             (* create and open output file *)
            fbFileOpen(    sNetId := sNetId,
                            sPathName := sPathName,
                            nMode := FOPEN_MODEAPPEND OR FOPEN_MODETEXT,
                            bExecute := TRUE );

            bBusy := TRUE;
            nState := nState + 1;
            
        END_IF


    1: (* create and open output file *)
        fbFileOpen( bExecute := FALSE );
        IF NOT fbFileOpen.bBusy THEN
            IF fbFileOpen.bError THEN
                nErrId := fbFileOpen.nErrId;
                bError := TRUE;
                nState := 100;
            ELSE
                hFile := fbFileOpen.hFile;

                aBuffer := MAXSTRING_TO_BYTEARR(sInputString);

                (* write to file *)
                fbFileWrite(sNetId := sNetId,
                            hFile := hFile,
                            pWriteBuff := ADR(aBuffer),
                            cbWriteLen := LEN(sInputString),
                            bExecute := TRUE);

                nState := nState + 1;

            END_IF
        END_IF


    2:    (* write to file *)
        fbFileWrite( bExecute := FALSE);
        IF ( NOT fbFileWrite.bBusy ) THEN
            IF ( fbFileWrite.bError ) THEN
                nErrId := fbFileWrite.nErrId;
                bError := TRUE;
                nState := 100;
            ELSE
                fbFileClose(     sNetId:=sNetId,
                                hFile:=hFile,
                                bExecute:=TRUE);

            nState := nState + 1;
            END_IF
        END_IF


    3:(* close output file *)
        fbFileClose( bExecute := FALSE );
        IF ( NOT fbFileClose.bBusy ) THEN
            IF ( fbFileClose.bError ) THEN
                nErrId := fbFileClose.nErrId;
                bError := TRUE;
                nState := 0;
                bBusy := FALSE;
            ELSIF(bAgain)THEN
                hFile := 0;
                bAgain := FALSE;
                sInputString := '___';

                 (* create and open output file *)
                fbFileOpen(    sNetId := sNetId,
                            sPathName := sPathName,
                            nMode := FOPEN_MODEAPPEND OR FOPEN_MODETEXT,
                            bExecute := TRUE );

                nState := 1;
            ELSE
                hFile := 0;
                nState := 0;
                bBusy := FALSE;
            END_IF
        END_IF

    100: (* error *)
        IF(hFile <> 0)THEN
            fbFileClose(     sNetId:=sNetId,
                            hFile:=hFile,
                            bExecute:=TRUE);
            nState := 3;
            bAgain := FALSE;
        ELSE
            nState := 0;
            bBusy := FALSE;
        END_IF

END_CASE

[TABLE="width: 90%"]
[TR]
[TD]Bei Step 2 tritt der Fehler auf.

Ich wäre für jede Hilfe sehr dankbar,

Grüße, Tobias
[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]
 
Zuletzt bearbeitet:
Du öffnest die Datei im Textmodus, verwendest dann aber den FB zum Schreiben im Binärmodus. Das ist möglicherweise der Knackpunkt. Ich würde auf die Stringkonvertierung in den aBuffer verzichten und statt dem FB_FileWrite den FB_FilePuts verwenden.
Code:
VAR
   fbFileWrite:FB_FilePuts;
END_VAR

(* und der Aufruf *)
fbFileWrite(
   sNetId := sNetId, 
   hFile := hFile,                             
   sLine:=sInputString,
   bExecute := TRUE);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

FilePuts habe ich in einem früherem Stadium des Projektes benutzt, da ich aber oft Strings verwende die länger als 255 Zeichen sind, und ich mit diesen Strings Funktionen wie CONCAT() nicht mehr verwenden kann, habe ich mich für eine Verwendung FB_FileWrite entschieden. Außerdem hatte ich das gleiche Problem mit FilePuts.
 
Code:
pWriteBuff := ADR(aBuffer),
cbWriteLen := LEN(sInputString)

Das hier beim schreiben könnte auch Probleme bereiten, Du Zeigst auf aBuffer gibst aber die länge von sInputString an, kann sein das dadurch beim speichern das Ende des Strings nicht erkannt wird.
Meiner Auffassung nach müsste es:

Code:
pWriteBuff := ADR(sInputString),
cbWriteLen := SIZEOF(sInputString)

heissen, das konvertieren in ein Bytearray solltest Du nicht brauchen da der FB ja sowieso auf den Speicher schaut.

Gruß Tygan

edit:
Hatte die Variablen Vertausch ;)
 
Zuletzt bearbeitet:
Zurück
Oben