FB_FileWrite Writeerror

COOLT

Level-1
Beiträge
98
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey leute ich hab mal wieder Probleme
Bei dem Baustein FB_FileWrite gibt es ein cbWriteLen um die Länge anzuzeigen. gibt es da iwie ein maximum? weil bei mir steht da 6500924 bytes und gleizeitig dazu zeigt er mir an bFileWriteerror=TRUE. Ergo is da iwo nen fehler. kann es daran liegen, das ich ein Array mit Struktur da reinschreiben will?

Code:
Var
    FB_FileWrite        :    FB_FileWrite;    (*    FileWrite um die veränderten Parameter in die geöffnete TxT Datei reinzuschreiben    *)
    bFileWrite        :    BOOL;
    bFileWriteBusy    :    BOOL;
    bFileWriteError    :    BOOL;
    nFileWriteErrorId    :    UDINT;
    nFileWriteCount    :    UDINT;
    arrFILEDATA         :    ARRAY[0..50] OF st_FileData;        (*    Für weitere veränderbare Parameter bitte Programm umschreiben.    *)
END_VAR
CODE:
    fb_FileWrite(
        hfile:=hfile,
        pWritebuff:=ADR(arrFILEDATA),
        cbWriteLen:=SIZEOF(arrFILEDATA),
        bExecute:=P_Main.Einlesen.O_bAbmeldung,
        tTimeout:=t#2s,
        bBusy=>bFilewriteBusy,
        bError=>bFileWriteError,
        nErrID=>nFileWriteErrorid,
        cbWrite=>nFileWriteCount);
das hfile bekommt es vom FB Open der auch noch da is.
 
Es gibt dich zu jedem Fehler auch eine FehlerId. Schau doch erstmal nach was die FehlerId bedeutet.

Edit: Es liegt nicht daran das du ein Array schreiben willst.
 
Also 1795 = 703hex = invalid index offset

Versuch mal die Hilfe zu benutzen!

Edit: In der Hilfe steht auch der Fehler:
0x703 Invalid or unknown file handle.
 
Zuletzt bearbeitet:
Oh man ich peil nich was falsch daran sein soll.
Code:
VAR
    FB_FileOpen        :    FB_FileOpen;    (*    Fileopen und schreiben    *)
    bFileOpen        :    BOOL;
    bFileOpenBusy    :    BOOL;
    bFileOpenError    :    BOOL;
    nFileOpenErrId    :    UDINT;
    hFile            :    UINT;

    FB_FileWrite        :    FB_FileWrite;    (*    FileWrite um die veränderten Parameter in die geöffnete TxT Datei reinzuschreiben    *)
    bFileWrite        :    BOOL;
    bFileWriteBusy    :    BOOL;
    bFileWriteError    :    BOOL;
    nFileWriteErrorId    :    UDINT;
    nFileWriteCount    :    UDINT;
    arrFILEDATA         :    ARRAY[0..50] OF st_FileData;        (*    Für weitere veränderbare Parameter bitte Programm umschreiben.    *)

    nFiledataCounter    :    INT;                                (*    *)
    nFiledatareset    :    INT;                                (*    *)

    FB_FileClose        :    FB_FileClose;                    (*    FileClose für Dateischließung nach Abmeldung    *)
    bFileClose        :    BOOL;
    bFileCloseBusy    :    BOOL;
    bFileCloseError    :    BOOL;
    nFileCloseErrorId    :    UDINT;

(*Datum*)
    fbGetSystemTime     :    GETSYSTEMTIME;
    fileTime             :    T_FILETIME;


(***********************************************************)
    fbNextstep            :    FB_Next;                    (*    Funktion zur Schrittweiterschaltung    *)
    nStep                :    INT := 0;
    nNextStep            :    INT;
    bCondition            :    BOOL;
    nLastStep            :    INT;
END_VAR

CODE:

CASE nStep OF
    0:    nNextStep:=1;
        fb_FileOpen(
            sPathname:='\Hard Disk\Protkoll_fuer_Parameteränderungen.txt',
            nMode:=FOPEN_MODEAPPEND OR  FOPEN_MODEPLUS,
            bExecute:=P_Main.User.O_bFileOpen,
            tTimeout:=t#3s,
            bBusy=>bFileOpenBusy,
            bError=>bFileOpenError,
            nErrID=>nFileOPenErrID,
            hfile=>hfile);

        bCondition:=P_Main.User.O_bFileOpen;

        fbNextstep (I_bEnable:=bCondition, I_bSeqMode:= TRUE , I_tTimeValue:= t#0s);
            IF fbNextstep.O_bStart THEN
                nLastStep:=nStep;
                nStep:=nNextStep;
            END_IF
    (***************************************************************************************)
    1:    nNextStep:=2;
        fb_FileWrite(
            hfile:=hfile,
            pWritebuff:=ADR(arrFILEDATA),
            cbWriteLen:=SIZEOF(arrFILEDATA),
                bExecute:=P_Main.Einlesen.O_bAbmeldung,
            tTimeout:=t#2s,
            bBusy=>bFilewriteBusy,
            bError=>bFileWriteError,
            nErrID=>nFileWriteErrorid,
            cbWrite=>nFileWriteCount);

        bCondition:=    P_Main.Einlesen.O_bAbmeldung;

        fbNextstep (I_bEnable:= bCondition, I_bSeqMode:= TRUE , I_tTimeValue:= t#0s);
            IF fbNextstep.O_bStart THEN
                nLastStep:=nStep;
                nStep:=nNextStep;
            END_IF
    (********************************************************************************************)
    2:    nNextStep:=0;
        fb_FileClose(
            hfile:=hfile,
            bExecute:=P_Main.Einlesen.O_bAbmeldung,
                tTimeout:=t#3s);

        fbNextstep (I_bEnable:= TRUE, I_bSeqMode:= TRUE , I_tTimeValue:= t#0s);
            IF fbNextstep.O_bStart THEN
                nLastStep:=nStep;
                nStep:=nNextStep;
            END_IF
END_CASE

IF P_Main.Zuweisung.arrLastUserlist[P_Main.Zuweisung.nLastUserlistCounter].ID<>P_Main.Zuweisung.sLastID THEN
    nFiledataCounter:=nFiledataCounter+1;
END_IF

IF nFiledataCounter=25 AND arrFILEDATA[50].dDate<>'' THEN
    nFiledatareset:=26;
    FOR nFiledatareset:=26 TO 50 DO
        arrFILEDATA[nFiledatareset].dDate:='';
        arrFILEDATA[nFiledatareset].nPressure:=0;
    END_FOR
END_IF

IF nFiledataCounter=51 THEN
    nFiledatareset:=0;
    FOR nFiledatareset:=0 TO 25 DO
        arrFILEDATA[nFiledatareset].dDate:='';
        arrFILEDATA[nFiledatareset].nPressure:=0;
    END_FOR
END_IF


(**********************************************)
(*    DATUM    *)
    fbGetSystemTime(timeLoDW=>fileTime.dwLowDateTime, timeHiDW=>fileTime.dwHighDateTime );
    g_Date :=SYSTEMTIME_TO_STRING( FILETIME_TO_SYSTEMTIME( fileTime ) );

Kann mir iwer sagen wo da ein fehler sein soll?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bist du dir sicher, dass das Öffnen der Datei funktioniert?? Mir fällt nämlich gerade auf, dass du weder beim Öffnen noch beim Schreiben noch beim Schließen der Datei eine AmsNetId zugewiesen hast.
 
Ich hab die deklarationen und beschriftungen aus dem Beispiel von Beckhoff, dort haben die auch keine AmsNetId zugewiesen sondern das feld einfach offen gelassen.
 
Also im Info-System von Beckhoff wird dem Eingabe-Parameter "sNetId" ein leerer String übergeben. Könntest auch mal versuchen.
 
Und du bist dir sicher, dass das Öffnen der Datei funzt? Denn die Fehler-Beschreibung "invalid file handle" legt nahe, dass dabei irgendwas schief läuft.
 
hm 1. denk ich ma schon 2. wie kann ich des überprüfen? und 3. tritt da kein fehler auf, von daher denk ich mal es funzt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wenn deine Variable "bFileOpenError" keinen Fehler anzeigt, dann hat das Öffnen funktioniert. In dem Fall bin ich auch ratlos wieso das Schreiben nicht funktionieren soll.

Mal noch was anderes:
Prüfst du in deinem fbNeytStep ab, ob beim Öffnen, Schreiben, Schließen der Datei ein Fehler aufgetreten ist? Würde das auf jeden Fall auch als Bedingung dafür benutzen, ob in den nächsten Step gesprungen wird oder nicht.
 
Ne bisher isses nich drin aber bau ich vielleicht noch rein. Dann muss ich auch noch ne Fehlerübertragung wieder einbauen uiui das wird ja doch schwieriger als erwartet dabei hab ich nur noch bis Freitag zeit. Naja dann stell ich das mal hinten an und guck erstmal nach meiner Dokumentation vielen dank für die Hilfe
Mfg
COOLT
 
Ich habe jetzt mal dein Programm bei mir auf dem PC nachvollzogen. Und es kam der gleiche Fehler.

Bei mir war es nun so, dass die Zuweisung
Code:
hfile=> hfile
im Baustein fb_FileOpen unverständlicherweise nicht funktioniert hat.

Hab dir hier nun ein Beispiel zum Erzeugen einer Datei, das bei mir funzt:
Code:
VAR
 fbOpen: FB_FileOpen;
 fbWrite: FB_FileWrite;
 fbClose: FB_FileClose;
 nStep: INT := 0;
 hFile: UINT;
 Timer1: TON;
 sLogDaten: STRING := '';
END_VAR
(**************************************)
CASE nStep OF
 0:
    fbOpen( sNetId:= '',
       sPathName:= 'C:\Test\Test1.txt',
       nMode:= FOPEN_MODEAPPEND OR  FOPEN_MODEPLUS,
       ePath:= PATH_GENERIC,
       bExecute:= TRUE,
       tTimeout:= t#3s,
       bBusy=> ,
       bError=> ,
       nErrId=> ,
       hFile=> hFile);
    Timer1(IN:= TRUE, PT:= t#4s);
    nStep := 1;
 1:
    Timer1();
    IF Timer1.Q THEN
       Timer1(IN:= FALSE);
       fbOpen();
       IF NOT fbOpen.bBusy THEN
          hFile := fbOpen.hFile;
          IF NOT fbOpen.bError THEN
             (* Kein Fehler beim Oeffnen *)
             sLogDaten := 'Teststring1';
             fbWrite( sNetId:= '',
                hFile:= hFile,
                pWriteBuff:= ADR(sLogDaten),
                cbWriteLen:= SIZEOF(sLogDaten),
                bExecute:= TRUE,
                tTimeout:= t#3s,
                bBusy=> ,
                bError=> ,
                nErrId=> ,
                cbWrite=> );
             Timer1(IN:= TRUE, PT:= t#4s);
             nStep := 2;
          ELSE
             ; (* Fehlerbehandlung *)
          END_IF
          fbOpen(bExecute:= FALSE);
       END_IF
    END_IF
 2:
    Timer1();
    IF Timer1.Q THEN
       Timer1(IN:= FALSE);
       fbWrite();
       IF NOT fbWrite.bBusy THEN
          IF NOT fbWrite.bError THEN
             (* Kein Fehler beim Schreiben *)
             fbClose( sNetId:= '',
                hFile:= hFile,
                bExecute:= TRUE,
                tTimeout:= t#3s,
                bBusy=> ,
                bError=> ,
                nErrId=> );
             Timer1(IN:= TRUE, PT:= t#4s);
             nStep := 3;
          ELSE
             ; (* Fehlerbehandlung *)
          END_IF
          fbWrite(bExecute:= FALSE);
       END_IF
    END_IF
 3:
    Timer1();
    IF Timer1.Q THEN
       Timer1(IN:= FALSE);
       fbClose();
       IF NOT fbClose.bBusy THEN
          IF NOT fbClose.bError THEN
             (* Kein Fehler beim Schliessen *)
             nStep := 0;
          ELSE
             ; (* Fehlerbehandlung *)
          END_IF
       fbClose(bExecute:= FALSE);
       END_IF
    END_IF
END_CASE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann mir iwer sagen wo da ein fehler sein soll?

Kann es sein, dass Du die Datei bereits schließt, obwohl der Schreibvorgang noch nicht beendet ist?

Für einen zuverlässigen Ablauf ist es m.E. mindestens folgendes erforderlich
1. BusyFlags der FBs auszuwerten
2. Errorflags auszuwerten und entsprechend reagieren.
3. Soll - Ist Vergleich Anzahl der geschriebenen Daten.

Natürlich kann es auch ohne funktionieren, muss aber nicht. ;)


Bei dem Baustein FB_FileWrite gibt es ein cbWriteLen um die Länge anzuzeigen. gibt es da iwie ein maximum? weil bei mir steht da 6500924 bytes

6,5 MB ist schon ne ganze Menge für eine Benutzerverwaltung mit max. 51 Einträgen. Erscheint mir etwas sehr viel, wie sieht denn die Struktur aus?
 
k habs jetz glaub ich fertig zumindest tritt kein Fehler mehr auf. Wie guck ich denn nach was der jetz da reingeschrieben hat? Also wie kann ich die Datei auslesen?
 
Wo wird die Datei denn abgespeichert? Auf die Flash-Karte? Würde dann diese einfach mal mit nem Kartenleser an den PC anschließen und schauen was drauf ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Thema ist zwar schon etwas älter aber ich hoffe trotzdem noch eine Antwort zu bekommen :) da dies mein erster Beitrag in diesem Forum ist und ich das erste mal mit twincat arbeite bzw in berührung komme (sogar das erste mal mit dem Theme SPS in berührung komme) hoffe ich auf freundliche und geduldige Menschen :)

Wie schon angedeutet, will ich ebenfalls eine Datei öffnen und diese beschreiben (in ST). Mir ist auch klar, dass ich die Bausteine Fileopen, filewrite und Fileclose brauche. Jedoch verstehe ich das Besipielprogramm von 'Ceberus' nicht wirklich.
Wird im ersten step(step=0) der Baustein und der Timer nur mit seinen startwerten initialisiert oder werden da beide schonmal aufgerufen und abgearbeitet?
Falls sie nur initialisiert werden, ist es so, dass das die Bausteine erst im zweiten step(step=1) aufgerufen werden durch Timer() und fbopen()?

Und wozu braucht es eigentlich den Timer?
Und zu guter letzt, was wird denn in der Zeile
zugewiesen?
Könnte ich auch einfach die nötigen sachen aus der twincat-info aus dem baustein "fb_filecopy" herausnehmen? Bzw wie müsste ich diese dann ändern?
Ich hoffe ihr könnt mir meine, für euch, sehr sehr seltsamen und einfachen Fragen beantworten :) da ich die nächsten Monate noch ein wenig mit twincat beschäftigt sein werde, werde ich euch, falls ich das darf, noch öfters belästigen ;)
Vielen Dank schonmal im voraus =)
 
Hi sps-neuling,

Wird im ersten step(step=0) der Baustein und der Timer nur mit seinen startwerten initialisiert oder werden da beide schonmal aufgerufen und abgearbeitet?

Ja, beide Bausteine werden aufgerufen und abgearbeitet.

Und wozu braucht es eigentlich den Timer?

Den Timer brauchst du nicht wirklich, den kannst du auch weglassen!

Und zu guter letzt, was wird denn in der Zeile zugewiesen?

Nichts, die Zeilen ohne etwas nach dem "=>" kannst du auch rausnehmen. Ich hab sie nur drin gelassen, damit ich immer alle Ein-/Ausgänge der FBs sehe.

Hoffe dir geholfen zu haben und wünsch dir noch viel Spaß und Erfolg mit TwinCAT!

Gruß Cerberus
 
Danke für die schnelle Antwort, ich hab es nun einfach mal versucht zu programmieren :) wie kann ich denn nun testen ob das funktioniert? Bzw. wie bringe ich das programm denn nun zum laufen?
Ich hänge es nun einfach mal noch mit an.
Code:
VAR
fbFileOpen    :FB_FileOpen;
fbFileClose    :FB_FileClose;
fbFileWrite    :FB_FileWrite;

bBusy        :BOOL;
bError1        :BOOL:=FALSE;
bError2        :BOOL:=FALSE;
bError3        :BOOL:=FALSE;

nErrId        :UDINT;


Step        :DWORD:=0;
BuffRead    :ARRAY[1..6] OF DINT;
hFileDatei    :UINT    := 0;(* file handle*)
A1:         DINT:=1;
A2:         DINT:=2;
A3:         DINT:=3;

END_VAR



CASE Step OF

    0: (*write data into array*)
    Buffread[1]:=A1;
    Buffread[2]:=A2;
    Buffread[3]:=A3;
    ;

    1:(* open file *)
    fbFileOpen(  bExecute := FALSE  );
    fbFileOpen(    sNetId := ‘‘,    (*eventuell noch ersetzen*)
        sPathName := ‘‘,     (*eventuell noch ersetzen*)
        nMode := FOPEN_MODEWRITE OR FOPEN_MODEBINARY
        ePath := PATH_GENERIC,
        tTimeout :=t#3s,
        bExecute := TRUE );
    Step := Step + 1;

    2:
    fbFileOpen( bExecute := FALSE );
    IF ( NOT fbFileOpen.bBusy ) THEN
        IF ( fbFileOpen.bError ) THEN
            nErrId := fbFileOpen.nErrId;
            bError1 := TRUE;
            Step := 50;
        ELSE
            hFileDatei := fbFileOpen.hFile;
            Step := Step + 1;
        END_IF
    END_IF

    3:(*write data to file*)
    fbFileWrite( bExecute := FALSE );
    fbFileWrite(    sNetId:=‘‘,     (*eventuell noch ersetzen*)
            hFile:=hFileDatei,
            pWriteBuff:= ADR(BuffRead),
            cbWriteLen:= 12,(*kann man hier irgendeine größe einsetzen? 12Byte, weil 3 Werte mit je 32Bit||SIZEOF(Buffread)*)
            bExecute:=TRUE,
            tTimeout:=t#3s );
    Step := Step + 1;

    4:
    fbFileWrite( bExecute := FALSE );
    IF ( NOT fbFileWrite.bBusy ) THEN
        IF ( fbFileWrite.bError ) THEN
            nErrId := fbFileWrite.nErrId;
            bError2 := TRUE;
            Step := 50;    
        END_IF
        Step:=50;
    END_IF

    30:
    (* close the file *)
    fbFileClose( bExecute := FALSE );
    fbFileClose(     sNetId:= ‘‘,     (*eventuell noch ersetzen*)
            hFile:=hFileDatei,
            bExecute:=TRUE,
            tTimeout:=t#3s );
    Step := Step + 1;

    31:
    fbFileClose( bExecute := FALSE );
    IF ( NOT fbFileClose.bBusy ) THEN
        IF ( fbFileClose.bError ) THEN
            nErrId := fbFileClose.nErrId;
            bError3 := TRUE;
        END_IF
        Step := 50;
    END_IF

    50: 
(*Fehler beim öffnen oder schreiben aufgetreten, von vorne anfangen*)
    IF (bError1=true || bError2=true) THEN
        bError1:=false;
        bError2:=false;
        Step := 0; 
    
(*kein fehler beim öffnen oder schreiben aufgetreten, Datei schließen*)
    ELSIF (bError1=false & bError2=false) THEN
        Step := 30;
        (*bBusy := FALSE; (*???*)*)
(*Fehler beim schließen der Datei aufgetreten, von vorne anfangen*)
    ELSIF (bError3=true) THEN
        bError3:=false;
        Step:=0;
    END_IF

END_CASE
 
Zurück
Oben