Ich habe nun mit PC WorX 6 die Demo vom CSV Logger ausgetestet. Sie funktioniert so auch ohne Probleme jedoch habe ich noch eine Frage dazu:
Mir scheint es, dass DLOG_STORE_FILE_CSV zuerst seine Daten in der Struct oscat_DLOG_DATA zusammen sammelt.
Dies erfolgt ja mit den TRIG_T oder TRIG_M.
Die gesammelten Daten werden dann aber erst rausgeschrieben, wenn sich der Dateinahme ändert (z.B. durch #R für jede Minute)
So habe ich es zumindest beobachten können.
Nun möchte ich einen Wert einmal am Tag loggen und die 365 Werte in einer Datei pro Jahr zusammen haben.
Somit TRIG_T auf 86400 (24h60m60s).
Und im Filename ‘Meine_Daten_#A.csv’.
Nun würde das File aber erst im Jahr 2013 (Filename Änderung) zum ersten mal abgespeichert werden.
Also muss ich immer ein Jahr warten, um das letzte Jahr auswerten zu können. Es geht nicht, dass ich im Oktober den Jan-Feb des gleichen Jahres auswerte.
Gibt es eine Möglichkeit, dass man immer abspeichert wann TRIG_T/TRIG_M ausgelöst wurde?
Sozusagen Zeile für Zeile.
Oder muss man hier einen anderen Weg gehen oder den FB erweitern?
Auch ist noch das Problem, wenn in der Mitte des Jahres die SPS ausfällt sind die Daten der ersten Monate verloren da sie ja nur gepuffert waren und nciht abgespeichert.
Ich habe den DLOG_STORE_FILE_CSV nun etwas modifiziert.
Neu:
Es wird die Datei im Mode 2 geöffnet (open + write).
Neue Logdaten werden sofort in die Datei per Append eingefügt.
Bei einer Dateinamen Änderung oder bei einem Neustart der SPS wird wieder ein Header im File eingetragen.
Die alten Daten bleiben unverändert.
Diese Veränderungen sind natürlich eher nur sinnvoll wenn man lange Pausen zwischen den Logdaten hat.
deinen bemerkungen bezüglich der funktionsweise kann ich nichts gegenteiliges hinzufügen
das dies in deinen fall bei sehr grossen zeitabständen der schreibtrigger sehr ungünstig ist, stimmt natürlich auch
dieser umstand ist mir auch schon länger bekannt, und ich werde dies auch ändern
dies ist nur mehr eine frage der zeit (sobald als möglich)
zwischenzeitlich kannst du dir nur durch selbstgemachte anpassungen helfen
deine schnelle lösung funktioniert aber auch nur mit pcworx, da es hier in wirklichkeit gar keinen
lese,schreib oder append mode bei “file_open” gibt.
dies würde bei der network-bibliothek für beckhoff und codesys so gar nicht funktionieren
Danke für die Antwort.
Ich arbeite ja nur mit PC WorX, kann daher nicht beurteilen wie und ob es in anderen System so funktioniert.
Schlussendlich habe ich es so für mich umgesetzt:
Die ILC 150 ETH empfängt über RS232 alle 3 Minuten Sensordaten.
Diese Sensordaten bestehen aus Serial (OneWire), Bezeichnung, Temperatur, Spannung, Feuchtigkeit, Pressure
Wenn nun neue Sensordaten reinkommen wird dies ausgeführt:
(* log data *)
(* only if hour does match *)
IF (HOUR_OF_DT(Local_Time_UDINT) MOD Logging_Hour = 0)
AND (Devices[j].Last_Logging <> HOUR_OF_DT(Local_Time_UDINT)) THEN
Devices[j].Last_Logging := HOUR_OF_DT(Local_Time_UDINT);
DLOG_SENSOR_DATA(SensorData:=SensorData);
END_IF;
Es wird also zuerst mit Logging_Hour definiert wie oft geloggt werden soll. Momentan habe ich es so eingestellt, dass alle 6 Stunden ein Logging stattfindet.
Durch das “Devices[j].Last_Logging” wird sichergestellt, dass genau dieser Sensor nur einmal geloggt wird.
Die Daten der verschiedenen Sensoren kommen ja nicht gleichzeitig wie man dem CSV erkennen kann.
Das Speichern der CSV Datei wird auch über den Inhalt von UCB gesteuert und nicht vom DLOG_STORE_FILE_CSV.
DLOG_STORE_FILE_CSV speichert ja automatisch, wenn Daten im UCB drinnen sind.
ich bin inzwischen schon am überarbeiten der dlog_bausteine
(einstellbare zeit für speichern des buffer in datei und, schliessen der datei wenn nicht benötigt)
wenn du willst, kannst du ja gerne eine vorab-version haben, sobald ich etwas lauffähiges habe…
wird aber noch ein paar tage dauern
dann sollten man deine applikation mit den vorhandenen standard bausteine auch einfach lösen können
hast du noch ergänzende ideen zum thema ?
was würdest du gerne noch haben
was anderes machen etc…
Zeit ist nicht so wichtig, da es momentan nur hier auf dem Tisch liegt…
Wie gesagt betreibe ich es anders herum als beim Original. Der Trigger zum Speichern kommt nicht vom STORE_FILE FB sondern über den Inhalt von LOG_DATA.
Jeder Sensor hat 8 Strings die geloggt werden müssen. Somit vielleicht ein Log-Baustein mit einem Stringarray?
Derzeit habe ich bei meinem Sensor das Flag dabei ob er schon abgespeichert wurde (Devices[j].Last_Logging <> HOUR_OF_DT(Local_Time_UDINT)) . Wäre super wenn man das irgendwie über einen Log-Baustein definieren könnte.
Ich meine, wenn die nächsten Sensordaten kommen, dass der Baustein selbständig erkennt ob dieser Sensor in dieser Stunde/Minute/Sekunde (je nach Einstellung) schon geloggt wurde.
Achja, mit meinen Umbau war es mir nicht möglich einen Header im File zu erstellen. Dieser wurde dann mit jedem neuen Eintrag wieder eingetragen:
Header
Data Sensor 1
Header
Data Sensor 2
Header
…
..
Ansonsten stellt sich noch die Frage wie das dann mit dem STORE_FTP funktioniert. Derzeit nehme ich ja nur das STORE_CSV her, aber in Zukunft will ich FTP einsetzen. Es müsste also das File beim FTP selber aufgemacht und die neue Zeile angehängt werden.
Derzeit schiebt der STORE_FTP ja glaube ich einfach die ganze Datei zum FTP rüber. Habe ich aber noch nicht getestet!
um dein programm 100% zu verstehen, und auch dann optimal mit “standardmitteln” das gleiche umsetzen zu können
wäre es für mich viel einfacher wenn du mir den kompletten logging-part (programm) gibst
dann kann ich besser erkennen, ob deine spezielle anforderung etwas ist, was ich eventuell fix in die bibliothek integriere
Hallo Peewit
Dieses Problem mit dem Speicherzeitpunkt plagt mich auch. Ich möchte die Daten alle 30 min loggen, aber der File wird erst am Ende des Tages gespeichert , weil der Buffer vorher nicht voll wird.
Wenn man bei längeren Speicherintervallen nach jedem Log speichern könnte , wäre mir schon sehr geholfen.
Wie wäre es, wenn man das mit einem ( optionalen ) Parameter steuern könnte? Dieser Parameter sollte nach der Erfassung im Buffer ein sofortiges Schreiben auf den File auslösen. Da kann sich dann jeder Anwender selbst programmieren, wann das passieren soll.
Des weiteren ist ein Parameter nützlich, mit dem man zwischen "create and open " und “append” umschalten kann.
Diese Änderungen wären für Langzeitlogs schon sehr nützlich.
Du erwähntest etwas von eine " testversion " - ist die schon so weit ?
Hallo
Ich habe schon was am laufen
In einer woche kann ich eine testversion hergeben
In der neuen version ist das speicherproblem behoben,und man kann selber definieren wann gespeichert werden soll, und die datei wird auch immer wieder automatisch geoeffnet und geschlossen
mein Problem mit der Speicherzeit beim DLOG_STORE_FILE_CSV ist immer noch ungelöst. Habe selbst ein paar Sachen probiert, aber einen Absturz produziert – irgendwie ist immer der Wurm drin.
Funktioniert die Testversion bei Dir schon ?
Danke JSED
Sorry für die späte Antwort
Danke für den Link, aber ich arbeite mit Wago und Codesys - mit zwt kann ich nichts anfangen - war mein Fehler, daß ich nichts erwähnt habe .
Strukturuierter Text wäre mir das Liebste - oder eben eine Lib
also ich habe die neue Version von DLOG_STORE_FILE_CSV jetzt schon mal ausprobiert - bis jetzt keine Probleme !
Alles funktioniert einwandfrei !
Ein kleinse Problem habe noch :
Warum habe ich jetzt plötzlich 10000 byte im retain specher verbraucht , das ist irgendwie etwas viel für den Filenamen in DLOG_Store_File_CSV?
Ich finde , man sollte diesen “Faden” aus dem Bereich PC WorX in das allgemeine Forum zur Network Lib verschieben.
Ich bin noch auf der Suche
wirklich die einzige Retain variable scheint der Filename zu sein - trotzdem fehlen mir ca.10000 von den verfügbaren ca. 16000
HEUREKA
Während des Schreibens ist es mir siedend heiß gekommen: Codesys speichert speicher die gesamte Instanz eines FB im Retain , wenn auch nur eine einzige Variable innerhalb des Blocks RETAIN ist .
Lösung :
für jede Instanz eines DLOG_Store_file_CSV Bausteines wird im Program ( nicht in einem FB) eine Retain Variable mit dem Filename definiert.
Im DLOG Store_file:CSV wird diese Variable als Var_IN_OUT definiert.
tja das ist ja eine ziemlich grosse macke bei codesys
da wird mir nichts anderes übrig bleiben als die remanten var aus den fb zu nehmen und als in/out zunutzen
Die neue Version DLOG_Store_File_CSV läuft jetzt seit Wochen absolut fehlerfrei auf einer Wago 841er.
Einzige Änderung:
wie oben beschrieben die Retain Variablen aud dem FB herausgeholt und als global retain definieren.
Jetzt kommt nur die Überwachung des Speicheplatzes dran.
Ansonsten ist mein Problem wirklich super gelöst !
jsed