Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Binäre Datei aus Wetterstation auswerten! Aber wie?? (https://www.delphipraxis.net/78597-binaere-datei-aus-wetterstation-auswerten-aber-wie.html)

duff 7. Okt 2006 16:13


Binäre Datei aus Wetterstation auswerten! Aber wie??
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe ein Problem mit einer Binären Datei!! Es ist so das diese Datei Wetterdaten enthält

Relativer Luftdruck
Innentemperatur
Inenfeuchte
Außentemperatur
Außenfeuchte
Taupunkt
Windchill
Windgeschwindigkeit
Windrichtung
Gesamtregen
Uhrzeit
Datum

Jetzt möchte ich diese Werte (die alle 15 min gespeichert werden) für ein eigenes Programm verwenden, um
Statistiken zu erstellen.

Ich habe leider noch nie mit fremden binären Dateien gearbeitet und weiß nicht wie ich an die
Sache rangehen soll.

Was ich zu der Codierung gefunden habe bringt mich bisher auch nicht weiter

Code:
// 36 Bytes pro Datensatz
// 28 Bytes Trailer (also ( Dateigröße-28 ) / 36 = Anzahl der Historiensätze)
// 
// Datensatz
// --------- 
// 00-03 : 04 Byte / - / 01 00 00 00 
// 04-07 : 04 Byte / longword / Uhrzeit in Sekunden seit 01.01.1900 00:00 
// 08-0B : 04 Byte / single / absoluter Luftdruck in hPa (rel = abs + Offset)
// 0C-0F : 04 Byte / single / Windstärke in m/s (km/h = m/s * 3,6)
// 10 : 01 Byte / byte / Windrichtung N=0, NNW=15 
// 11 : 01 Byte / - / 00 
// 12 : 01 Byte / - / 00 
// 13 : 01 Byte / - / 00 
// 14-17 : 04 Byte / single / Regenmenge in mm
// 18-1B : 04 Byte / single / Innentemperatur in C
// 1C-1F : 04 Byte / single / Außentemperatur in C
// 20 : 01 Byte / byte / Innenfeuchte
// 21 : 01 Byte / - / 00 
// 22 : 01 Byte / byte / Außenfeuchte
// 23 : 01 Byte / - / 00 
// 
// Trailer
// ------- 
// 00-03 : 04 Byte / - / 87 65 43 21 
// 04-07 : 04 Byte / - / ??? wer weis es ??? 
// 08-0B : 04 Byte / - / ??? wer weis es ??? 
// 0C-0F : 04 Byte / - / 00 00 00 00 
// 10-13 : 04 Byte / longword / Anzahl der Sätze in Datei
// 14-17 : 04 Byte / longword / Zeitstempel des ersten Datensatzes in Datei
// 18-1B : 04 Byte / longword / Zeitstempel des letzten Datensatzes in Datei
Es wäre toll wenn mir jemand helfen könnte!!!

SirThornberry 7. Okt 2006 16:19

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
am einfachsten schaffst du das ganze mit TFileStream. Öffne die Datei damit und springe mit "Position" an die Startposition wo die Daten los gehen. Dann kannst du mit Stream.Read die einzelnen Werte der Reihe nach wie sie in der Datei (laut spezifikation) stehen auslesen.

Luckie 7. Okt 2006 16:21

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
Klingt doch realtiv einfach:
Code:
Trailer
Datensatz
Datensatz
..
..
..
Datensatz
Delphi-Quellcode:
type
  TDatensatz = packed record
    unbekannt: Integer;
    Timestamp: Longword;
    Luftdruck: Single;
    WindStärke: Single;
    ..
    ..
  end;
Der erste Datensatz ist jetz an der Stelle: Dateianfang + sizeof(Trailer), Der zweite dann: Dateianfang + sizeof(Trailer) + sizeof(Datensatz).

marabu 7. Okt 2006 16:25

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
Hallo Michael,

ein Trailer steht immer am Ende ...

Freundliche Grüße vom marabu

duff 7. Okt 2006 16:33

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
mal sehen ob ich das hinbekommen! Zur Not melde ich mich nochmal :roll:

Danke

SirThornberry 7. Okt 2006 16:35

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
mit dem Ansazt von luckie ist es eigentlich kein problem:
Delphi-Quellcode:
var
  lDatensatz: TDatensatz;
  lStream  : TFileStream;
begin
  lStream := TFileStream.Create('history_ab_05.10.06.dat', fmOpenRead);
  try
    lStream.Read(lDatensatz, SizeOf(lDatenSatz));
    //Jetzt steht in lDatensatz der erste Datensatz
  finally
    lStream.Free;
  end;

himitsu 7. Okt 2006 16:53

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
Delphi-Quellcode:
Type TTrailer = packed Record
    StartSignatur: LongWord;  // =$21436587
    unbekannt1, unbekannt2: LongWord;
    _nichts: LongWord;
    Datensaetze: LongWord;    // Anzahl der Sätze in Datei
    Uhrzeit_Beginn: LongWord; // Zeitstempel des ersten Datensatzes in Datei
    Uhrzeit_Ende: LongWord;   // Zeitstempel des letzten Datensatzes in Datei
  End;
  TDatensatz = packed Record;
    StartSignatur: LongWord;  // =$00000001
    Uhrzeit: LongWord;        // Uhrzeit in Sekunden seit 01.01.1900 00:00
    AbsLuftdruck: Single;     // absoluter Luftdruck in hPa (rel = abs + Offset)
    Windstaerke: Single;      // Windstärke in m/s (km/h = m/s * 3,6)
    Windrichtung: Byte;       // Windrichtung N=0, NNW=15
    _nichts1: Array[0..2] or Byte;
    Regenmenge: Byte;         // Regenmenge in mm
    Innentemperatur: Single;  // Innentemperatur in C
    Aussentemperatur: Single; // Außentemperatur in C
    Innenfeuchte: Byte;       // Innenfeuchte in %
    _nichts2: Byte;
    Aussenfeuchte: Byte;      // Außenfeuchte in %
    _nichts3: Byte;
  End;
Man könnte auch die beiden Typen kombinieren und dann gemeinsam auslesen.
Dann muß man nur nach dem Auslesen die Signatur prüfen und wei welche Type dann gemeint ist.
Delphi-Quellcode:
Type TDatensatz = packed Record;
    Case StartSignatur: LongWord of
      $00000001: (
        Uhrzeit: LongWord;        // Uhrzeit in Sekunden seit 01.01.1900 00:00
        AbsLuftdruck: Single;     // absoluter Luftdruck in hPa (rel = abs + Offset)
        Windstaerke: Single;      // Windstärke in m/s (km/h = m/s * 3,6)
        Windrichtung: Byte;       // Windrichtung N=0, NNW=15
        _nichts1: Array[0..2] of Byte;
        Regenmenge: Single;       // Regenmenge in mm
        Innentemperatur: Single;  // Innentemperatur in C
        Aussentemperatur: Single; // Außentemperatur in C
        Innenfeuchte: Byte;       // Innenfeuchte in %
        _nichts2: Byte;
        Aussenfeuchte: Byte;      // Außenfeuchte in %
        _nichts3: Byte;
      );
      $21436587: (
        unbekannt1, unbekannt2: LongWord;
        _nichts4: LongWord;
        Datensaetze: LongWord;    // Anzahl der Sätze in Datei
        Uhrzeit_Beginn: LongWord; // Zeitstempel des ersten Datensatzes in Datei
        Uhrzeit_Ende: LongWord;   // Zeitstempel des letzten Datensatzes in Datei
      );
    End;
Delphi-Quellcode:
Read(Datensatz, SizeOf(TDatensatz));
If Datensatz.Startsignatur = $00000001 Then Begin
  // Datensatz
End Else If Datensatz.Startsignatur = $21436587 Then Begin
  // Trailer
End Else Begin
  // Fehler
End;

duff 7. Okt 2006 17:29

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
Hallo,

dass bringt mich schon mal richtig weiter.. Danke!

Nur kann es sein das in der Datei noch sowas wie ein Header steht? Weil die Werte sind irgendwie Käse die da drin stehen!! Beispiel wäre ein Minuswert der Innentemperatur!!!

Hawkeye219 7. Okt 2006 17:53

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
Hallo duff,

himitsu wollte wohl die Aufmerksamkeit der Leser testen und hat zwei kleine Fehler eingebaut:

Delphi-Quellcode:
:
_nichts1: Array[0..2] of Byte;             // <<-- "of" statt "or"
Regenmenge: Single; // Regenmenge in mm   // <<-- "Single" statt "Byte"
:
Gruß Hawkeye

duff 7. Okt 2006 18:00

Re: Binäre Datei aus Wetterstation auswerten! Aber wie??
 
ah sehr gut jetzt sehen die werte vernünftig aus :thumb:

Jetzt hätte ich für´s erste noch eine letzte Frage :oops:

Da ich nun das erste mal mit TFileStream arbeite... Wie gehe ich jetzt weiter vor um den 2,3,4... letzten Datensatz einzulesen und auszuwerten??

Danke euch allen für die tolle Hilfe :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 1 von 2  1 2      

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