Variablen in einer CSV Datei schreiben

Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
Auf die falsche SchrittNr 30 an der oben gezeigten Stelle aus Beitrag #1 hatte ich schon in Beitrag #2 hingewiesen.
In Beitrag #11: unverändert.
In Beitrag #13: unverändert.
Habe dies so gedeutet, dass der Schritt 20 absichtlich totgelegt ist.
in #15 war das dann auf Schritt 20 geändert, aber jetzt außerhalb der IF Abfrage, so daß falls die OPEN Funktion mehr als den einen Zyklus benötigt ein ungültiges FileHandle an die WRITE Funktion übergeben wird. ;)

Gruß
 
in #15 war das dann auf Schritt 20 geändert, aber jetzt außerhalb der IF Abfrage, so daß falls die OPEN Funktion mehr als den einen Zyklus benötigt ein ungültiges FileHandle an die WRITE Funktion übergeben wird. ;)
Schritt 10 wird regelmässig nur einmal durchlaufen, so dass vermutlich nie ein FileHandle übergeben wird, weder ein gültiges, noch ein ungültiges.
Mag sein, dass Done bereits direkt nach dem Execute := True gemeldet wird - halte ich aber für höchst unwahrscheinlich.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nochmal vielen Dank an Alle für die Unterstützung. Heinileini der Code war sehr hilfreich . Ich musste nur anpassen.
Das Programm funktionniert soweit gut. Aber ich habe eine Frage und zwar:
ich erstelle eine LogDatei in einer csv datei und schreibe die daten drin. dafür habe ich ein Header (überschift der daten, spricht 'Datum und Uhrzeit', 'Wert_bei_Fuellstand_Start' und 'wert_bei Fuellstand_Stopp'
Ich möchte den Überschrift nur einmal. Deswegen habe ich mir eine Globalevariable (Headervorhanden )deklariert (siehe Code), die nach dem Schreiben der Überschrift "TRUE" wird und es wird beim nächsten Mal geprüft , ob diese Variable 'TRUE' ist und wenn ja, wird der CASE der Header übersprungen.
Es funktioniert aber nicht wirklich. Es wird jedes mal der Überschrift (Header) geschrieben. Hier der Code:
Code:
CASE uiSchritte OF
0:  // Wait For Start
    IF Logdatei_Blinkbaustein_Flanke.Q THEN // 
        uiSchritte := 10 ;
    END_IF ;     
10: // OPEN-Start
    fopen.sFileName := sFileName ;
    fopen.eFileMode := File.MODE.MAPPD ; // ! 
    fopen.xExclusive := TRUE ; // ?
    Exec_open := TRUE ;
    uiSchritte := 15 ;
15: // Wait For OPEN-Done
    IF fopen.xDone THEN // oder wenn Open mit Error beendet!
        hFile := fopen.hFile ;
        Exec_open := FALSE ;
        IF Headervorhanden THEN
        uiSchritte := 30 ;    
        ELSE
        uiSchritte := 20 ;
        END_IF
    END_IF ;
20: // Header-Start
    Headervorhanden:=TRUE;
    Header:=CONCAT('Datum_Und_Uhrzeit',';');
    Header:=CONCAT(Header,'Fullstand_Start');
    Header:=CONCAT(Header,';');
    Header:=CONCAT(Header,'Fullstand_Stop');
    Header:=CONCAT(Header,';');
    Header:=CONCAT(Header,CRLF);
    fwrite.pBuffer := ADR(Header) ;
    fwrite.szSize  := LEN(Header) ;
    fwrite.hFile := hFile ;
    Exec_write := TRUE ;
    uiSchritte := 25 ;
25: // Wait For Header-Done
    IF fwrite.xDone THEN // oder wenn Write mit Error beendet!
        Exec_write := FALSE ;
        uiSchritte := 30 ;
    END_IF ;
30: // Level-Start
    Echtzeit:=SysRtcGetTime (Echtzeit_Start);
    SpeicherText:=DT_TO_STRING(Echtzeit);
        Fullstand__Start_Text :=DINT_TO_STRING(Fuellstand_Start_analog) ;
    Fullstand_Stop_Text :=DINT_TO_STRING(Fuellstand_Stopp_analog) ;
    Daten_Text:=CONCAT(SpeicherText,';');
    Daten_Text:=CONCAT(Daten_Text,Fullstand_Start_Text);
    Daten_Text:=CONCAT(Daten_Text,';');
    Daten_Text:=CONCAT(Daten_Text,Fullstand_Stop_Text);
    Daten_Text:=CONCAT(Daten_Text,';');
    
    fwrite.pBuffer := ADR(Daten_Text) ;
    fwrite.szSize  := LEN(Daten_Text) ;
    fwrite.hFile := hFile ;
    Exec_write := TRUE ;
    uiSchritte := 35 ;
35: // Wait For Level-Done resp. Wait For STOP
    IF fwrite.xDone THEN // oder wenn Write mit Error beendet!
       IF Logdatei_Blinkbaustein_Flanke.Q THEN
            uiSchritte := 30 ;
         ELSE  
       Exec_write := FALSE ;   
            uiSchritte := 40 ;
        END_IF ;     
        
    END_IF ;
40: // Footer-Start
   
    fwrite.pBuffer := ADR(CRLF) ;
    fwrite.szSize  := LEN(CRLF) ;
    fwrite.hFile := hFile ;
    Exec_write := TRUE ;
    uiSchritte := 45 ;
45: // Footer-Done
    IF fwrite.xDone THEN // oder wenn Write mit Error beendet!
        Exec_write := FALSE ;
        uiSchritte := 50 ;
    END_IF ;
50: // CLOSE-Start
    fclose.hFile := hFile ;
    Exec_close := TRUE ;
    uiSchritte := 55 ;
55: // CLOSE-Done
    IF fclose.xDone THEN // oder wenn Close mit Error beendet!
        Exec_close := FALSE ;
        uiSchritte := 0 ;
    END_IF ;
END_CASE ;
fopen( xExecute := Exec_open ) ;
fwrite( xExecute := Exec_write ) ;
fclose( xExecute := Exec_close ) ;
 
Eigentlich brauchst Du Dir gar nicht extra merken, ob der Header schon in die csv-Datei geschrieben wurde. Du brauchst nur vor dem Öffnen der Datei schauen, ob die Datei schon existiert:
- Datei gibt es noch nicht: Datei neu anlegen und Header schreiben + Datensatz schreiben
- Datei gibt es schon: Datei öffnen (für Append) + Datensatz schreiben

Harald
 
Du brauchst nur vor jedem Öffnen der Datei schauen, ob die Datei schon existiert:
- Datei gibt es noch nicht: Datei neu anlegen und Header schreiben + Datensatz schreiben
Anm.: das "Datei neu anlegen" ebenfalls (wie unten geschrieben) einfach per "Datei für Append öffnen" realisieren.
- Datei gibt es schon: Datei öffnen (für Append) + Datensatz schreiben
Habe vorsichtshalber Haralds Vorschlag in blau ergänzt.
Wie man vor jedem Öffnen in CodeSys prüfen kann, kann ich leider "aus dem Ärmel" nicht sagen (habe im Moment nicht die Zeit, es nachzuforschen).

In meinem "auf-die-Schnelle-Vorschlag" stehen an den Stellen, wo FertigMeldungen abgefragt werden, Kommentare wie " // oder wenn Open/Write/Close mit Error beendet!".
Hiermit wollte ich andeuten, dass noch HandlungsBedarf besteht bzw. bestehen könnte. Die Aktionen können ggfs auch "unverrichteter Dinge" beendet werden.
Für solche Fehlerfälle sollte man sich überlegen, welche Massnahme[n] sinnvoll wären und sie ggfs in der Schrittkette vorsehen.
 
Zuletzt bearbeitet:
Zurück
Oben