Logdatei in CSV in Eaton panel täglich erstellen und Zustandsänderungen Speichern

lieuthnant

Level-2
Beiträge
113
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Liebe Forumler,
ich möchte eine Logdatei in CSV Format erstellen wo ich die Zustandsänderungen speichere. Die Datei muss auf die Festplatte des Panels gespeichert werden.
Mit welchem Befehl kann ich auf die Festplatte des Panels die Datei anlegen, öffnen und auf die Zustandsänderung schreiben ?
Ich danke im Voraus.

Gruß
 
Hey,

mit ein paar mehr Infos könnte dir bestimmt geholfen werden...

Dient das Eaton Panel nur zur Anzeige? Welches Panel? Hast du eine Steuerung mit der du die Daten loggen willst? Wenn ja, welche Steuerung? Wie ist Steuerung und Panel miteinander verbunden?
Etc...

Gruß
Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist ein Eaton panel mit integrierter Steuerung. Genau eine XV102. Ich arbeite mit Codesys V2.3 Jetzt möchte ich in meine sps ( Codesys V2.3 ) ein code schreiben damit eine CSV datei erstellt wird. In dieser datei möchte ich die Zustandänderung der Variablen festhalten.
Gruß
 
zu meinem Problem bin ich etwas weiter gekommen aber ich habe ein paar Probleme noch.
Ich habe einen Blinker gebaut welcher jede "halbe Minunten" die Dateien protokolliert.
Die Datei sollte so aussehen:

Datum |Uhrzeit| ZustandDervariable|
hier mein Code
Code:
// Fuer den Blinker
     IF bEnable = FALSE THEN
      BLK.TIMEHIGH := t#30s;
      BLK.TIMELOW := t#30s;
      bEnable := TRUE;
   END_IF
    BLK.ENABLE:=bEnable;
    bitstate:=BLK.OUT AND bEnable ;

    BLK(ENABLE:=bEnable  , TIMELOW:=t#30S , TIMEHIGH:=t#30s , OUT=>bitstate );

IF bitstate THEN                                                                          // Wenn Blinker High ist
    hFile := SysFileOpen (FileName,'a');                                       // Datei oeffnen 
    Echtzeit:=SysRtcGetTime (Echtzeit_Start);                            // Uhrzeit des Betriebssystems
    SpeicherText:=DT_TO_STRING(Echtzeit);                             // datum und Zeit in String konvertieren
    SysFileWrite(File:= hFile ,Buffer:= ADR(SpeicherText),Size:=LEN(SpeicherText)); // Datum und Uhrzeit in die Datei schreiben
    Start_Text:=DINT_TO_STRING(Start);                                 // konvertierung einer DINT Variable in STRING
    SysFileWrite(File:= hFile ,Buffer:= ADR(Start_Text),Size:=LEN(Start_Text));    // Startwert in die Datei schreiben
    Stop_Text:=DINT_TO_STRING(Stop);                                                               // konvertierung einer DINT Variable in STRING
    SysFileWrite(File:= hFile ,Buffer:= ADR(Stop_Text),Size:=LEN(Stop_Text));    // Stoppwert in die Datei schreiben
    Fuellstand_Text:=DINT_TO_STRING(Fuellstand);                                           // konvertierung einer DINT Variable in STRING
    SysFileWrite(File:= hFile ,Buffer:= ADR(Fuellstand_Text),Size:=LEN(Fuellstand_Text));  // Fuellstand in die Datei schreiben
    SpeicherText := '$R$N';                                                                                  // Eine neue Zeile erzeugen
    hFileclose1:=SysFileClose(File :=hFile);   // Datei schließen

ich bekomme leider komische ASC Zeichen und die Darstellung ist auch nicht richtig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
2020-02-06-15:28:03200100473DT#2020-02-06-15:28:03DT#2020-02-06-15:28:03200100473DT#2020-02-06-15:28:03DT#2020-02-06-15:28:03200100473
Datum Uhrzeit Wert1 Wert2 Wert3
Jetzt habe ich es fast richtig. Ich hätte aber eine Trennung zwischen der Werte und Ausserdem werden die Daten jedes 2 mal Protokolliert. Damit meine ich: Es wird geschrieben, dann nicht , dann wird geschrieben.
Vielleicht hat einer eine Lösung. ich arbeite weiter daran
Danke im Voraus
Gruß
 
Weiss einer warum die daten nicht in Spalten dargestellt werden ??
Es musste nach der ersten DT#2020-02-06-15:28:03 eine neue Zeile mit DT#2020-02-06-15:28:03.
So in der Art: DT#2020-02-06-15:28:03
DT#2020-02-06-15:28:03
DT#2020-02-06-15:28:03
ich habe versucht mit dem Befehl:
SpeicherText := '$R$N'; , mit \r und mit \n aber es gibt keine Änderung.
 
Die Spalten werden (z.B.) durch Semikolon getrennt. Füge mal zwischen Deine Daten jeweils ein ';' ein.
Die Zeilen durch CR LF (ich denke das ist das, was Deine Schreibweise '$R$N' bewirken soll).
Ich verstehe Deinen Code nicht so recht. Du öffnest die Datei, schreibst 4 einzelne Daten und schliesst die Datei wieder.
Aber offensichtlich enthält die Datei so gesehen zu viele Daten. Entspricht das Öffnen dem, was man sonst als APPEND bezeichnet?
Also nach dem Öffnen die neuen Daten an die in der Datei bereits vorhandenen anhängen, statt sie zu überschreiben?
Ich verstehe Deinen Code so, dass Du 30 s lang die Datei öffnest, beschreibst und wieder schliesst, dann 30 s lang Pause machst. Wertest Du nicht die Flanke des 30s-Signals aus?

PS:
Nach der Zeile
SpeicherText := '$R$N';
müsstest Du diese zwei Zeichen auch noch in die Datei schreiben, bevor Du sie schliesst?!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
vielen dank für die Infos. ich habe gestern spät Abend rausgefunden. Ich musste die SPS bereinigen. dann habe ich folgendesw gemacht:
Trennung:STRING(1):=';' ; // als deklaration und dann
SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung)); als Befehl für das Trennen und es funktioniert.
vielen Dank.
zu deiner Bemerkung:"Ich verstehe Deinen Code nicht so recht. Du öffnest die Datei, schreibst 4 einzelne Daten und schliesst die Datei wieder.
Aber offensichtlich enthält die Datei so gesehen zu viele Daten. Entspricht das Öffnen dem, was man sonst als APPEND bezeichnet?
Also nach dem Öffnen die neuen Daten an die in der Datei bereits vorhandenen anhängen, statt sie zu überschreiben?"
Ich bekomme wirklich zu viele Daten. Ich war der meinung, es liegt daran, dass ich zu lange schreibe. ich denke, wenn ich 1 Sekunde schreibe und 30 Sekunden warte wird sich die Menge der Daten reduzieren.
Zum Öffnen und schliessen der Datei, was würdest du empfehlen ?
Gruß
 
... dann habe ich folgendesw gemacht: ... und es funktioniert.

... ich denke, wenn ich 1 Sekunde schreibe und 30 Sekunden warte wird sich die Menge der Daten reduzieren.

... Zum Öffnen und schliessen der Datei, was würdest du empfehlen ?
Dann sind wir ja einen Schritt weiter.
Statt über die Zeit (1 s), würde ich die positive Flanke des BlinkTaktes auswerten und dazu zwei Befehle einfügen:
Code:
    BLK(ENABLE:=bEnable  , TIMELOW:=t#30S , TIMEHIGH:=t#30s , OUT=>bitstate );
   
[COLOR=#0000cd][B]    trigger := bitstate AND NOT bitstateprev // pos. FLanke erkennen
    bitstateprev := bitstate // FlankenMerker static
[/B][/COLOR]
    IF [COLOR=#0000cd][B]trigger[/B][/COLOR] THEN    // Wenn Blinker High [COLOR=#0000cd][B]wird[/B][/COLOR]
Bezüglich Öffnen/Schliessen:
Ich würde das Öffnen "vorab" nur einmal ausführen und das Schliessen zum Abschluss, wenn keine Daten mehr in die Datei geschrieben werden müssen bzw. die Daten in eine andere Datei geschrieben werden sollen, die quasi die aktuelle Datei zum Empfangen der Daten ablösen soll.
Ich weiss nicht, welche Kriterien bei Dir dafür in Frage kämen und ... von CodeSys habe ich auch keine Ahnung ;)

Was ist aus Deinem $R$N-Problem geworden? Klappt es jetzt auch mit dem Beginnen neuer Zeilen?
 
Was ist aus Deinem $R$N-Problem geworden? Klappt es jetzt auch mit dem Beginnen neuer Zeilen?
Ja, es klappt jetzt, da ich folgendes gemacht habe:
String deklariert mit dem Inhalt ';' zugewiesen.
dann zwischen den verschiedenen Werte den String geschrieben.
Folgendes habe ich probiert und kann nicht verstehen warum es nicht klappt
Code:
CASE uiSchritte OF

0:
hFile := SysFileOpen (FileName,'a');
        SysFileWrite(File:= hFile ,Buffer:= ADR(Spalte1),Size:=LEN(Spalte1));
        SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));

        SysFileWrite(File:= hFile ,Buffer:= ADR(Spalte2),Size:=LEN(Spalte2));
        SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));

        SysFileWrite(File:= hFile ,Buffer:= ADR(Spalte3),Size:=LEN(Spalte3));
        SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));

        SysFileWrite(File:= hFile ,Buffer:= ADR(Spalte4),Size:=LEN(Spalte4));
        SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));

     uiSchritte:=1
1:

IF Logdatei_Blinkbaustein_Flanke.Q  THEN

    hFile := SysFileOpen (FileName,'w');
    Echtzeit:=SysRtcGetTime (Echtzeit_Start);
    SpeicherText:=DT_TO_STRING(Echtzeit);
    SysFileWrite(File:= hFile ,Buffer:= ADR(SpeicherText),Size:=LEN(SpeicherText));
    SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));
    Start_Text:=DINT_TO_STRING(Start);
    SysFileWrite(File:= hFile ,Buffer:= ADR(Start_Text),Size:=LEN(Start_Text));
    SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));
    Stop_Text:=DINT_TO_STRING(Stop);
    SysFileWrite(File:= hFile ,Buffer:= ADR(Stop_Text),Size:=LEN(Stop_Text));
    SysFileWrite(File:= hFile ,Buffer:= ADR(Trennung),Size:=LEN(Trennung));
    Fuellstand_Text:=DINT_TO_STRING(Fuellstand);
    SysFileWrite(File:= hFile ,Buffer:= ADR(Fuellstand_Text),Size:=LEN(Fuellstand_Text));
    SysFileWrite(File:= hFile ,Buffer:= ADR(LF),Size:=LEN(LF));
Die Datei wird meiner Meinung nach beim Mal den Case "0" durchlaufen und die Datei anlegen, danach wird nur geschrieben. Das heisst, in case "1". Beim kompilieren bekomme ich keinen Fehler . Die dsatei wird angelegt aber die Überschrift werden nicht geschrieben.
Bei der Deklaration hatte ich :
VAR
Spalte1:STRING := 'Datum_und_Uhrzeit';
Spalte2:STRING :='Start';
Spalte3:STRING :='Stop';
Spalte4:STRING :='Fuellstand';
END_VAR
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich vermute, der Open liefert einen Status und Du musst mit dem ersten Schreiben warten, bis Du eine Rückmeldung hast, dass der Open ohne Fehler ausgeführt wurde.
0: Datei öffnen
1: sobald Open ausgeführt, Überschriften schreiben
2: "normale" Protokollierung
 
Zurück
Oben