Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: FB_FileWrite Probleme mit Array schreiben

  1. #1
    Registriert seit
    30.09.2010
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren FB_FileWrite Probleme mit Array schreiben  

  2. #2
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Zitat Zitat von FredlFesl Beitrag anzeigen
    Es funktioniert zwar, aber es wird immer nur das erste Element des Arrays richtig geschrieben. Der String im zweiten Element stimmt schon nicht mehr.
    Werd' doch mal konkret. Was kommt als Eingabe und wie sieht die CSV aus?

  3. #3
    FredlFesl ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.09.2010
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.
    Angehängte Dateien Angehängte Dateien

  4. #4
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Zitat Zitat von FredlFesl Beitrag anzeigen
    Das erste Element des Arrays wird noch richtig geschrieben, Aber das zweite nicht mehr, da steht nur noch Blödsinn.
    Ich kann leider keine Gedanken lesen. Keine Ahnung was für dich Blödsinn ist und was nicht.
    Nochmal: Was SOLL dort stehen?

  5. #5
    FredlFesl ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.09.2010
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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!
    Angehängte Dateien Angehängte Dateien

  6. #6
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    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.

  7. #7
    FredlFesl ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.09.2010
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ok. das werde ich mal testen. Melde mich dann ob es funktioniert hat. Bin erst nächste Woche wieder auf Arbeit.

  8. #8
    FredlFesl ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.09.2010
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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);

Ähnliche Themen

  1. Wago 750 Messwerte in Array schreiben
    Von emsbootsmann im Forum Sonstige Steuerungen
    Antworten: 14
    Letzter Beitrag: 21.10.2012, 16:30
  2. Array in DB schreiben(any-pointer)
    Von Limette im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 28.10.2011, 22:17
  3. Array von Integerwerten mit LibNoDave schreiben
    Von Earny im Forum Hochsprachen - OPC
    Antworten: 3
    Letzter Beitrag: 26.12.2008, 09:33
  4. Daten In Array schreiben
    Von MatthiasH24 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.09.2008, 11:08
  5. Array von Bytes per OPC in SPS schreiben
    Von ingmar im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 02.11.2006, 08:51

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •