FB_FileWrite Probleme mit Array schreiben

FredlFesl

Level-2
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute!

Will über den FB_FileWrite ein Array in eine csv-Datei schreiben. Es funktioniert zwar, aber es wird immer nur das erste Element des Arrays richtig geschrieben. Der String im zweiten Element stimmt schon nicht mehr. Ich weiß echt nicht was ich noch falsch mache. In der Hilfe steht ja sogar:
pWriteBuff : Enthält die Adresse des Puffers, der die zu schreibenden Daten enthält. Der Puffer kann eine Einzelvariable, ein Array oder eine Struktur sein, dessen Adresse man mit dem ADR - Operator ermitteln kann.



Ich hoffe ihr könnt mir weiterhelfen!


Vielen Dank!


Code:
PROGRAM TextFile3
VAR
    GetTime : NT_GetTime;
    tTime : TIMESTRUCT;

    DestNetId        : T_AmsNetId := '';
    DestFileName    : T_MaxString;
    bExecute        : BOOL;
    tAdsTimeOut    : TIME := t#20s;
    bBusy        :BOOL;
    bError        :BOOL;
    nErrId        :UDINT;
    hDestFile        :UINT;

    fbFileOpen    :FB_FileOpen;
    fbFileClose    :FB_FileClose;
    fbFilePuts    :FB_FilePuts;
    fbFileRead    :FB_FileRead;
    fbFileWrite    :FB_FileWrite;


    Step : INT;
    StrokeIdx : INT;
    UbatIdx : INT;
    ValveNumber : DINT;
    StepMain: INT;
    ActData : ARRAY [1..10] OF STRING(255);
    RetVal : DINT;
    Start : BOOL := TRUE ;
    Finished : BOOL;
    ArrayIdx1: INT;
    ArrayIdx2: INT;
    ActDataIdx : INT;
    FileNameValve : ARRAY [1..MAX_TIEPOINT] OF STRING;
END_VAR




CASE StepMain OF


0:
    RetVal := RUNNING;
    fbFileOpen(  bExecute := FALSE  );
    fbFileOpen(    sNetId := DestNetId,
                sPathName := DestFileName,
                nMode := FOPEN_MODEAPPEND OR FOPEN_MODETEXT,
                ePath := PATH_GENERIC,
                tTimeout := tAdsTimeout,
                bExecute := TRUE );
    StepMain := StepMain + 1;

1:
    fbFileOpen( bExecute := FALSE );
    IF ( NOT fbFileOpen.bBusy ) THEN
        IF ( fbFileOpen.bError ) THEN
            nErrId := fbFileOpen.nErrId;
            bError := TRUE;
            StepMain := 30;
        ELSE
            hDestFile := fbFileOpen.hFile;
            StepMain := StepMain + 1;
        END_IF
    END_IF

2:
    MEMSET (ADR(ActData), 16#0, SIZEOF(ActData));
    ActData[ActDataIdx] := 'Header1';
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'$N');
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],WORD_TO_STRING(tTime.wDay));
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'.');
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],WORD_TO_STRING(tTime.wMonth));
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'.');
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],WORD_TO_STRING(tTime.wYear));
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'$N');
    ActDataIdx := 2;
    ActData[ActDataIdx] := 'Header2';
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'$N');
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],WORD_TO_STRING(tTime.wDay));
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'.');
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],WORD_TO_STRING(tTime.wMonth));
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'.');
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],WORD_TO_STRING(tTime.wYear));
    ActData[ActDataIdx] := CONCAT(ActData[ActDataIdx],'$N');
    StepMain := StepMain + 1;

3:
            fbFileWrite( bExecute := FALSE );
            fbFileWrite(    sNetId:=DestNetId,
                    hFile:=hDestFile,
                    pWriteBuff:= ADR(ActData),
                    cbWriteLen:= SIZEOF(ActData),
                    bExecute:=TRUE,
                    tTimeout:=tAdsTimeOut );
            StepMain := StepMain + 1;

4:
            fbFileWrite( bExecute := FALSE );
            IF ( NOT fbFileWrite.bBusy ) THEN
                IF ( fbFileWrite.bError ) THEN
                    nErrId := fbFileWrite.nErrId;
                    bError := TRUE;
                    StepMain := 20;
                ELSE
                    StepMain := 20;
                    MEMSET (ADR(ActData), 16#0, SIZEOF(ActData));
                END_IF
            END_IF

20:

    fbFileClose( bExecute := FALSE );
    fbFileClose(     sNetId:=DestNetId,
            hFile:=hDestFile,
            bExecute:=TRUE,
            tTimeout:=tAdsTimeOut );
    StepMain := StepMain + 1;

21:
    
    fbFileClose( bExecute := FALSE );
    IF ( NOT fbFileClose.bBusy ) THEN
        IF ( fbFileClose.bError ) THEN
            nErrId := fbFileClose.nErrId;
            bError := TRUE;
        END_IF
        StepMain := 30;
        hDestFile := 0;
    END_IF

30:
    
    IF (hDestFile <> 0 ) THEN
        StepMain := 20;
    ELSE
        StepMain := 0;
        RetVal := OK;
        Step := 0;
    END_IF
END_CASE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also hab die Datei angehängt.
Ich habe davor mit dem Baustein FB_FilePut gemacht. Da das File sehr groß ist etwa 150000 Zeilen und ich 16 solcher Files schreiben muss dauert das mit diesem Baustein ziemlich lange, da ich bei einer Zykluszeit von 1ms nur 255 Zeichen alle 2ms schreiben kann. 1 Zyklus zum Schreiben und 1 Zyklus umzuschauen ob das Schreiben erfolgreich war.
So benötige ich für ein File um die Drei Minuten. Viel zu lang.
Nun hab ich mir gedacht, dass ich mit dem Baustein FB_FileWrite ja ein ganzes Array von Strings auf einmal schreiben kann um die Zeit zu verkürzen.
Aber wie gesagt hier ist mein Problem:
Das erste Element des Arrays wird noch richtig geschrieben, Aber das zweite nicht mehr, da steht nur noch Blödsinn.
Das mit dem Header und Datum ist ja nur ein kleines Beispiel.

Hoffe dass hilft euch nun weiter.
 

Anhänge

  • Kopie von 001NGI_2011_06_10__08_28_39.txt
    468 KB · Aufrufe: 67
Also in der textdatei steht was geschrieben wird und was dort stehen sollte.

Sonst weiss ich jetzt auch nicht wie ich es noch beschreiben soll.

Vielen Dank!
 

Anhänge

  • 001NGI_2011_06_14__16_13_52.txt
    2,7 KB · Aufrufe: 58
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wird wohl nicht gehen. Wenn Du mit FB_FileWrite schreiben willst, musst Du die Datei doch mit FOPEN_MODEBINARY öffnen. Dann werden aber die nicht verwendeten Zeichen jedes Strings mitgeschrieben, falls die nicht alle 255 Zeichen lang sind. Du könntest höchstens ein Array of Byte anlegen und die Strings per MEMCPY dicht an dicht dort reinpacken. Dann kannst Du den tatsächlich von den Strings belegten Teil des Arrays an einem Stück schreiben.
 
Ok. das werde ich mal testen. Melde mich dann ob es funktioniert hat. Bin erst nächste Woche wieder auf Arbeit.
 
Also hab hier ne Lösung von StructuredTrash! Die hat funktioniert.

Vielen Dank!

Code:
VAR    Data:Array[0..65535] of Byte; (* Datenblock, der in einem Stück in eine Datei geschrieben werden soll *)    
Fill:UINT; (* Position des ersten freien Bytes in Data, gleichzeitig auch Grösse des zu schreibenden Blocks *)    
Line:STRING; 
END_VAR  (* Das Folgende am besten in einen FB packen und ihm Data, Fill und Line als VAR_IN_OUT übergeben *)  

MEMCPY(destAddr:=Adr(Data[Fill]),               
srcAddr:=Adr(Line),             
n:=LEN(Line)); 
Fill:=Fill+LEN(Line);
 
Zurück
Oben