Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi kontinuierlichen Messdaten speichern (https://www.delphipraxis.net/104894-kontinuierlichen-messdaten-speichern.html)

Oracle 12. Dez 2007 12:55


kontinuierlichen Messdaten speichern
 
Ich habe momentan ein Projekt, wo ich Temperaturfühler auslese und diese Messdaten speichern soll.
Die Messung kann bis zu einer Woche gehen, was heißt dass jede Menge Daten zusammen kommen.
Es soll jede Sekunde der Temperaturwert (als double) und die aktuelle Zeit (auch double) gespeichert werden.

Wie wäre es am geschicktesten das umzusetzen? Sollte jeder Wert sofort in eine Datei geschrieben werden, oder lieber immer Gruppenweise, wie zum Beispiel einmal in der Minute.
Macht man das mit einem Filestream?

Ich habe gehört, dass die Daten wenn sie binär gespeichert werden weniger Platz verbrauchen. Wie muss ich dafür vorgehen.
Ist es am besten jedes Wertepaar als Record zu behandeln?

So Vielen dank schon mal an euch im Vorraus :-D

sirius 12. Dez 2007 13:15

Re: kontinuierlichen Messdaten speichern
 
Wenn du die Sache mit der Datenbank ausgeschlossen hast, dann würde ich in Blöcken schreiben. Damit verlierst du bei einem Systemabsturz nicht alle Daten.

Was heist denn binär für dich? Ein Double belegt immer 8 Byte. Und so speicherst du die auch. Ob du das jetzt in einen Record packst, bringt (je nach Anwendung) keinen Vor- und Nachteil im Platzverbrauch. Es könnte nur für dich leichter in der Programmierung werden.
Ich würde mir aber nochmal Gedanken über die Messgenauigkeit machen. Wahrscheinlich kannst du sowieso auf Single gehen. Das wären dann nur 4 Bytes. Auch gesehen habe ich schon Festkommawerte (mit 2 Kommastellen; ähnlich wie Currency).
Wenn du weiterhin sparen willst, kannst du dir ja mal Gedanken über den Zeitstempel machen. Entweder du speicherst nur am Anfang einmal die Zeit und weist dann einfach, dass jeder Wert entsprechend eine Sekunde später ist, oder du speicherst die ZeitDifferenz zum vorherigen Messwert, oder, oder oder.... du kannst dir in deinem Datenformat so einiges überlegen. Das hängt aber auch von deiner Technik und deinen Anfforderungsgenauigkeiten ab.

Etwas anderes ist es, wenn du die Messwerte später in Notepad (oder auch Excel) lesen willst. Dann mach dir mal keine Gedanken über Speicherplatzeinsparung, sondern eher über das notwendige Datenformat. Da musst du auch meistens die Zahlen in Text umwandeln, was je nach Länge der Zahlen (in Textformat) entspr. Bytes benötigt.

Oracle 12. Dez 2007 13:28

Re: kontinuierlichen Messdaten speichern
 
Danke erstal für die ausführliche Antwort.
Mit Binär meinte ich, dass es nicht im Klartext gespeichert wird. Also dass man es eben nicht mit Notepad öffnen kann.

Das mit der Zeit nur einmal am Anfang speichern, das finde ich gut, da die Abstände ja wirklich immer gleich sind.
Auch würde single als Datentyp für die Temperaturwerte reichen. Das spart auch nochmal ordentlich.

Jetzt würde ich gerne noch wissen wie ich das Programmiertechnisch am besten löse. Bisher habe ich in Delphi ausser ini Dateien noch nichts gespeichert. Mach ich das am besten mit einem TFilestream, dem ich dann jeden Messwert, bzw. jeden Block von Messwerten übergebe?

himitsu 12. Dez 2007 13:40

Re: kontinuierlichen Messdaten speichern
 
Da Windows ja über eine nette Dateicache verfügt, kannst du eigentlich sofort die Werte in die Datei schreiben.

TFileStream und eigentlich fast alles andere geht da auch ganz gut.
und wenn du möchtest, dann kannst du ja alle 15, 30 oder 60 Sekunden ein "Flush" (Dateipuffer leeren) ausführen.


Wegen der Zeit:
ich weiß ja nicht wie genau die Zeitbestimmung sein muß,
aber wenn es schon genauer sein muß (die Timer und Windows arbeiten ja nicht soooo genau) ...
eventuell wäre es da gut, wenn du zwischendurch nochmals die aktuelle Zeit mit einfließen läßt, dann verringern sich die Rechenungenauigkeiten.


Delphi-Quellcode:
[single] // x = INF // Signalwert für nachfolgende Zeit
[double] // aktuelle Zeit

[single] // Temperatur
[single] // Temperatur
[single] // Temperatur
[single] // Temperatur
[single] // Temperatur
...

[single] // x = INF // Signalwert für nachfolgende Zeit
[double] // aktuelle Zeit

[single] // Temperatur
[single] // Temperatur
[single] // Temperatur
[single] // Temperatur
...
z.B. viele Videoformate speichern nur den Unterschied zwischen folgebildern und fügen alle einer gewissen Zeit ein Vollbild in den Datenstrom mit ein, damit sich z.B. komprimierungsfehler nicht aufaddieren und man auch mal schön schnell in dem Film rumspringen muß, ohne gleich alle vom Dateianfang an durchgehn zu müssen.

sirius 12. Dez 2007 13:42

Re: kontinuierlichen Messdaten speichern
 
Du kannst auch nochmal über Festkommawerte nachdenken. Unter Umständen kommst du dann auf 2 Bytes runter. Wenn du z.B. eine Genauigkeit von 2 Nachkommastellen haben willst, dann schaffst du damit einen Temperaturbereich von 0 bis 650 Kelvin. (wenn du z.B. eine 24533 abspeicherst, bedeutet dies 245.22) Festkommawerte entsprechen ja auch eher dem Verhalten von A/D-Wandlern.

TFileStream ist ganz einfach. (ungetestet)
Delphi-Quellcode:
const Dateiname='xyz.dat';
var Datei:TfileStream;
...
if fileexists(Dateiname) then
begin
  Datei:=Tfilestream.create(Dateiname,fmopenread);
  Datei.seek(0,sofromend);
end
else
begin
  Datei:=Tfilestream.create(Dateiname,fmopenread);
  //Header schreiben, z.B.
  Datei.write(zeit,sizeof(zeit)); //zeit ist z.B. TDateTime
end;
try

  //Messwert schreiben
  Datei.write(Messwert,sizeof(Messwert);
  ...

finally
  Datei.free;
end;
Wahrscheinlich ist es güntstiger das Auslesen der Messwerte in einem Thread zu gestalten, damit du wirklich jede Sekunde lesen kannst, falls mal das Speichern (oder das GUI) etwas länger dauert.

Edit: himitsus Variante wird auch von vielen Messgeräteherstellern genutzt. Du hast eben Blöcke, die am Anfang einen Zeitstempel und eine Länge haben. Dadurch kannst du auch nach einer Pause in derselben Datei weiterschreiben und einfach einen neuen Block anfangen.

Nikolas 12. Dez 2007 13:47

Re: kontinuierlichen Messdaten speichern
 
Der Datentyp für die Messwerte hängt davon ab, was und wie du messen willst. Wenn du nur deine Zimmertemperatur ohne Nachkommastelle hin messen willst, reicht die ein byte. Wenn du sehr genaue Messwerte hast, die im schlimmsten Fall noch groß streuen, brauchst du was größeres.
Wie sehen denn deine Messwerte aus? (In welchem Intervall und mit welcher Genauigkeit).
Ich gehe fast davon aus, dass du auch schon mit einem word (2Byte: 0 bis 65535) auskommst. Du kannst dir ja eine einfache lineare Funktion basteln, die dann die Temperaturen auf dieses Intervall abbilden.
Mit der Speicherung wäre mein Gedanke der, dass du eher viele kleine Dateien anlegst, jeweils vielleicht für 10min. An den Anfang kommt der Zeitstempel und dann die Werte. Das hat auch den Vorteil, dass du nicht immer die Riesendatei anfassen musst, wenn du nachschauen willst, wie warm es am Donnerstag um 12 war. Und falls was kaputt geht, verlierst du nur wenige Messwerte.

sirius 12. Dez 2007 13:55

Re: kontinuierlichen Messdaten speichern
 
Zitat:

Zitat von Nikolas
Ich gehe fast davon aus, dass du auch schon mit einem word (2Byte: 0 bis 65535) auskommst.

siehe mein Post :zwinker:
Zitat:

Zitat von Nikolas
Du kannst dir ja eine einfache lineare Funktion basteln, die dann die Temperaturen auf dieses Intervall abbilden.

Sie muss nichtmal linear sein. Quadratisch hilft auch, wenn du im unteren Messbereich eine höhere Genauigkeit verlangst als im oberen.

Zitat:

Zitat von Nikolas
Das hat auch den Vorteil, dass du nicht immer die Riesendatei anfassen musst, wenn du nachschauen willst, wie warm es am Donnerstag um 12 war. Und falls was kaputt geht, verlierst du nur wenige Messwerte.

Aber eben den Nachteil der filebasierten Datenablage. Da kann schnell mal etwas verloren gehen. Bei einem Messgerät mag das noch gehen, aber bei vielen und einem verteilten Netzwerk..... :warn:

Oracle 12. Dez 2007 14:04

Re: kontinuierlichen Messdaten speichern
 
Also meine Messwerte haben zwei Nachkommastellen, deshalb finde ich die Variante sie mit 100 zu multiplizieren sehr gut.
Dann komm ich wirklich mit 2 Byte aus. Mehrere Dateien finde ich allerdings nicht so praktisch, da jede Datei eine Messung darstellen soll. Die Zeiten jeweils in Intervallen abzuspeichern finde ich sehr clever das werde ich mir gleich mal genauer überlegen.

himitsu 12. Dez 2007 14:07

Re: kontinuierlichen Messdaten speichern
 
nja groß ... bei dem Intervall und mit Singel für Temperatur so etwa 1,2 MB pro Woche.

da wäre die Mehrdateivariante alle 10 Minuten mit ~1300 Byte pro Datei schon reichlich Platzverschwendung (wann man den Platzverbrauch im Dateisystem betrachtet)

Reinhard Kern 12. Dez 2007 14:19

Re: kontinuierlichen Messdaten speichern
 
Zitat:

Zitat von Oracle
Also meine Messwerte haben zwei Nachkommastellen, deshalb finde ich die Variante sie mit 100 zu multiplizieren sehr gut.
Dann komm ich wirklich mit 2 Byte aus. Mehrere Dateien finde ich allerdings nicht so praktisch, da jede Datei eine Messung darstellen soll. Die Zeiten jeweils in Intervallen abzuspeichern finde ich sehr clever das werde ich mir gleich mal genauer überlegen.

Hallo,

das mit binär oder Text würde ich mir nochmal überlegen. Ich habe das zwar jahrzehntelang auch so gemacht, komme aber immer mehr davon ab. Binäre Dateien sind eben nicht offen lesbar (was das Debuggen erschwert), nicht reparierbar und können auch ohne die zugehörige Software überhaupt nicht gelesen werden. Daher geht der Trend in der IT ganz allgemein zu lesbaren Protokollen (FTP,HTTP) und lesbaren Dateien (XML). Eine XML-formatierte Datei mit Messwerten ist auch noch lesbar, wenn deine Software längst untergegangen ist.

Ich weiss natürlich nicht, ob du das überhaupt willst, aber meiner Meinung nach ist Verschleierung von Daten nicht Aufgabe eines Programmierers, im Gegenteil. Meine Kunden dürfen meine Dateien gerne auch noch lesen, wenn ich tot bin. Ich weiss aber, dass nicht jeder Programmierer so denkt.

Die Datenmenge kannst du ja nachrechenen, lohnt sich aber nicht: je Sekunde 2 Doubles geben nicht mal 2 MByte am Tag. Eine durchschnittliche heutige Festplatte reicht also ein paar Jahre. Ich würde wegen der leichteren Handhabung Monatsdateien anlegen.

Gruss Reinhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz