Array in csv-Datei schreiben

2007-04-18
2007-04-25
  • MatthiasMiko - 2007-04-18

    Hallo,

    folgendes Problem:

    Ich habe einen Array, der mit Messwerten gefüllt ist und den ich gern in eine csv-Datei zwecks Auswertung schreiben möchte.

    Ich habe mir mit diversen Hilfen und viel rumprobieren versucht ein Programm zu schreiben was dies leisten kann, komme jedoch nicht vorwärts.

    Das Programm sieht folgendermaßen aus:

    FUNCTION_BLOCK Datenschreiber

    VAR_INPUT

    count:INT;                                      (*kommt aus einem anderen FB, in dem die Daten gesammelt werden*)
    
    Daten: ARRAY[1..2,1..10] OF REAL;           (*besagter Array, in dem die Messwerte gesammelt werden*)
    

    END_VAR

    VAR_OUTPUT

    END_VAR

    VAR

    hfile: DWORD;
    
    zugriff: STRING := 'w';
    
    szcurrent: STRING(4);
    
    szseparator: STRING(1):=',';
    
    wNewLine: WORD:=2573;
    
    i: INT;
    
    aktuellerWert: REAL;
    

    END_VAR


    IF count=11 THEN (wird 11 wenn array voll)

    hfile:= SysFileOpen('Daten18.csv', zugriff); (Datei soll angelegt werden)

    FOR i:=1 TO 10 DO (Array hat z.B. 10 Werte in Spalte 1)

    aktuellerWert:=Daten[1,i]; (sucht den zu schreibenden Wert raus)

    szcurrent:=REAL_TO_STRING(aktuellerWert); (umwandeln des Wertes in String)

    SysFileWrite(hfile, ADR(szcurrent),SIZEOF(szcurrent)); (soll den Wert nun in die geöffnete Datei schreiben)

    SysFileWrite(hfile, ADR(szseparator),SIZEOF(szseparator)); (soll ein Trennzeichen setzen)

    SysFileWrite(hfile, ADR(wNewLine), SIZEOF(wNewLine)); (neue Zeile)

    END_FOR

    SysFileClose(hfile); (Datei schliessen)

    END_IF

    Das Problem besteht darin, dass hfile stets 0 bleibt, also scheinbar nichts geöffnet noch beschrieben wird.

    Meine Programmierkenntnisse sind eher bescheiden, also seht es mir bitte nach, falls hier gröbste Fehler drin sein sollten^^.

     
  • gravieren - 2007-04-18

    Hi

    Natürlich MUSS ich meine Homepage empfehlen

    Lade dir da doch mal die Examples für das Datei-Handling herunter.

    Ebenso sind nützliche Informationen zu finden.

     
  • gravieren - 2007-04-18

    Hi Nochmals

    Zitat:
    IF count=11 THEN (wird 11 wenn array voll)
    hfile:= SysFileOpen('Daten18.csv', zugriff); (Datei soll angelegt werden)

    Nachwievor der selbige Handlingsfehler:

    SysFileOpen wird bei JEDEM Zyklus geöffnet.

    Nach etwa 8 Zyklen, hasst du KEINE Dateihandles mehr.

     
  • MatthiasMiko - 2007-04-20

    Danke erstmal für die schnelle Antwort.

    Wie kann ich denn verhindern, dass SysFileOpen zyklisch aufgerufen wird?

    ich hab z.B. sowas probiert:

    bedingung:bool, wird irgendwann true


    IF bedingung THEN

    handle:=SysFileOpen('Daten.csv','w');

    SysFileWrite(handle,ADR(ArraymitDatendrin),SIZEOF(ArraymitDatendrin));

    SysFileClose(handle);

    bedingung:=FALSE;

    END_IF

    so müsste die if-schleife nur genau 1 mal durchlaufen werden, also auch nur ein handle erzeugt werden. oder sehe ich das falsch? ich bekomm immer für handle eine null.

    die bibliothek auf deiner seite hab ich mir mal angesehen, bin noch dabei mir damit was zu basteln, mal sehen obs klappt.

     
  • MatthiasMiko - 2007-04-20

    Ich hab das Problem gefunden, es war eigentlich ganz banal:

    beim rumprobieren hab ich für jeden neuen "Versuch" die Dateien fortlaufend nummeriert und so immer mehr Dateien erzeugt, die nach und nach den Speicher im Koppler vollgemüllt haben..... hab dann in einem anderen Beitrag hier die PLC_Browser-Funktionen fds, format und extract gefunden, und siehe da: es geht ohne Probleme!

    Vielen Dank an gravieren

     
  • mwatermann - 2007-04-24

    anmerkung:

    jeden zugriff den du in einem zyklus mit open startest, solltest/musst du auch wieder mit close schliessen.

     
  • debug - 2007-04-24

    Hallo MatthiasMiko,

    wo setzt Du die Variable Count wieder auf Null zurück?

    Dein Programm läuft doch nur dann durch wenn Count=11. Nur dann wird eine Datei geöffnet, Werte geschrieben und Datei geschlossen.

     
  • MatthiasMiko - 2007-04-25

    Ich habs mir so gedacht, dass count z.B. 11 wird wenn ich meine gewünschte Anzahl Messpunkte zusammen hab (z.B. dauert mein zu messender Versuch 5h, dann kann ich mir mit meinem gewünschten Messintervall ganz leicht ausrechnen wieviele Punkte ich zusammenkriege). count bleibt dann 11, und es soll jetzt nur noch der array ausgelesen, in string verwandelt und in eine datei geschrieben werden.

    das ganze kann man sich dann mit zeitstempel und kopfzeile etc. in excel ausgeben lassen.

    Also lasse ich kurz gesagt count auf 11, setze es nicht zurück, weil die bedingung count=11 im grunde nur noch das dateischreiben auslöst, was meine "letzte Aktion" ist, wonach ich meine messdatei in excel hab und fertig bin.

     

Log in to post a comment.