DEMO_Beispiel für DLOG_STORE_FILE_CSV

Begonnen von racer, 15. April 2016, 15:38:04

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

racer

Hallo,

wo finde ich das DEMO-Beispiel für oben genannte Funktion.

PS: An den Eingang DTI des Bausteins muss das aktuelle Datum/Uhrzeit angelegt werden. Wie kann ich dies aus dem System auslesen.

Programmierung erfolgt mit Codesys 3.5
Zu programierende Komponente ist eine SPS von ifm GmbH.

Kann mir jemand weiterhelfen?

peewit

in der network lib selber ist ein ordner demo mit ausgeblendeteten bausteine

racer

#2
Danke.
Wo wird die CSV-Datei abgespeichert.
Filename: 'test_#R.csv'
Error_c und Error_t des "DLOG_STORE_FILE_CSV" sind 0 -> also keine Fehler.
Habe mal ein paar Bilder meines Programms gemacht und angehängHabe das Demoprogramm aus der Bibliothek kopiert, eingefügt und übersetzt.


[gelöscht durch Administrator]

racer

Nach einer kleinen Überarbeitung sieht das Program wie im Anhang aus und es gibt folgende Fehlermeldungen.

Wer kann mir weiterhelfen?

[gelöscht durch Administrator]

racer

Mein Datenlogger funktioniert jetzt. Habe aber weitere Fragen:

1.
Ich logge mehrere Sensorwerte vom Typ REAL mit DLOG_REAL.
Wenn ich als Trennzeichen bei "SEP" des DLOG_STORE_FILE_CSV-Baustein ein Komma eingebe werden beim öffnen der CSV-Datei mit Excel alle Sensorwerte in der ersten Spalte gespeichert. Wie schaffe ich es dass pro Sensor (=pro DLOG_REAL-BAustein) eine Spalte verwendet wird (möchte die Daten anschließend graphisch auswerten)?

2.
Die Daten werden ja zwischengespeichert und irgendwann (je nach Einstellung) in eine .csv geschrieben. Können bei der Zwischenspeicherung Daten verloren gehen oder ein Überlauf passieren?

Vielen Dank im voraus.

peewit

hallo

1.
wenn du eine csv erstellt mit "," als trennzeichen dann zeigt excel das nicht korrekt an weil es dein trennzeichen nicht kennt
in europa ist das standard csv-trennzeichen ein ";"
dann funktioniert es auch mit excel automatisch

wenn du aber trotzdem dein trennzeichen weiter verwenden möchtest dann musst du in excel den text import durchführen
dort kannst du alles genau definieren damit der import trotzdem funktioniert

2.
ja daten können verloren gehen
intern werden die daten mittels UNI_CIRCULAR_BUFFER zwischengespeichert
werden daten nicht schnellgenug weiterverarbeitet kommt es zu einen überlauf und daten gehen verloren

wie erkennt man das.
in der aktuellen version nicht so einfach
der UNI_CIRCULAR_BUFFER verwendet die datenstruktur UNI_CIRCULAR_BUFFER_DATA und darin gibt es ein Feld "BUF_USED"
Füllstand (0-100 %) das solltest du mal im auge behalten...

in den neueren version vom data_logger (noch in arbeit)  sind diese probleme extra als fehlermeldung ausgeführt
1. warnung wenn > 90 % des buffers in verwendung sind
2. sobald daten verloren gehen

wenn eines von beiden auftritt sollte man die applikation anpassen !!



racer

#6
Danke schonmal.

Ich habe den im Anhang dargestellten Aufruf von BUF_USED getestet.
Allerdings ist die Variable BUF_USED immer '0', obwohl eine CSV-Datei geschrieben wird.
1. Was ist falsch. Möchte, dass ich über Variable "Speicher_voll" bei 90% gewarnt werden.
2. Kann man programmieren, dass bei 90% der Buffer automatisch in eine CSV-Datei geschrieben wird, neue Daten aufgenommmen werden und diese anschließend in einer neuen Datei gespeichert werden.



[gelöscht durch Administrator]

peewit

hi

alle datalogger bausteine sind über die datenstruktur "x" verbunden

das feld ist im UCB Bereich zu finden

siehe Bild (achtung darin sind schon felder der zukünftigen version zu sehen )



[gelöscht durch Administrator]

racer

Danke für die schnelle Antwort.

Mein oben beschriebenes Problem änder sich nicht.
Rufe den Speicher jetzt so wie du gezeigt hast auf. (x.UCB.BUF_USED)
Zusätzlich frage ich zur Kontrolle mal die BUF_SIZE und BUF_count ab
Alle drei bleiben immer Null. Was ist falsch?

peewit

wenn deine sps schnell arbeitet dann ist fast immer alles null in den einträgen
soweit ok

was ist denn den eigentliches problem ?

racer

#10
Ich möchte verhindern das Daten im Zwischenspeicher, bevor sie in die .csv geschrieben werden verloren gehen.
Ich möchte 200 Temperatursensoren überwachen und alle 10 Sekunden für jeden Sensor den Messwert loggen. Das ganze vielleicht über ein paar Stunden.

Wann werden die zwischengespeicherten Daten in die .csv geschrieben?
Kann man die Größe der csv-Datei abfragen?

peewit

wenn daten verloren gehen erkennst du das sofort weil dann die die daten versetzt sind
alle 10 sekunden speichern ist normalerweise kein zeitliches problem

es kann aber sein das die 200 Spaltenüberschriften und 200 Werte mehr als 4096 bytes brauchen
dann kann das alles nicht auf einmal im buffer eingelagert werden

da hilft dann eine buffer vergroesserung !


für buf_used kannst dir was programmieren

var max_buf_used

if x.ucb.buf_used > max_buf_used then
  max_buf_used = x.ucb.buf_used
end if


das was du vorhast ist eine lösbare aufgabe, da ich genau das vor einigen tagen mit der neuen data-logger version gemacht habe

die groesse der datei ist nicht direkt relevant
du musst dir nur überlegen wieviele dateien insgesamt werden aus deiner sps lliegen (gesamtspeicherbedarf)
da ist es von vorteil wenn du wiederkehrende dateinamen benutzt damit dann alte dateien automatisch von den neuen überschrieben werden
und der gesamtspeicherbedarf kann dir nicht entgleiten...

racer

Danke.

wo nehme ich die Buffer-Vergrößerung vor, falls die 4096Byte nicht ausreichen sollten.

peewit

da bislang der ucb buffer dem netzwerkbuffer entsprach ist es sinnvoll für ucb eine eigene type zu deklarieren
da ansonsten der speicherbedarf explodiert


TYPE
   UCB_BUF  : ARRAY[0..8191] OF BYTE;   (* hier kannst du die groesse vorgeben *)
END_TYPE

TYPE UNI_CIRCULAR_BUFFER_DATA :
STRUCT
   D_MODE : INT;
   D_HEAD : WORD;
   D_STRING : STRING(STRING_LENGTH);
   D_REAL : REAL;
   D_DWORD : DWORD;
   BUF_SIZE : UINT;
   BUF_COUNT : UINT;
   BUF_USED : USINT;
   BUF : NW_BUF_LONG;     --> ändern auf    BUF : UCB_BUF
   _GetStart : UINT;
   _GetEnd : UINT;
   _Last : UINT;
   _First : UINT;
END_STRUCT
END_TYPE

racer

Danke peewit für deine Hilfe und Unterstützung. :)