![]() |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Gibt's keine interne Festplatte?
von da täglich, alle 6Stunden.. auf Stick/CF-Card sichern? oder vllt eine USB-Festplatte? Gruß K-H |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Ich denkie mal das ist eine Preis-, Platz- und vorallem Energiefrage.
CF-Karte als Ersatz für HDDs sind schon seit langem bekannt ... praktisch der Vorgänger der SSDs. |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Lösung: RAM-DISK
Nur 1x täglich auf Flash-Speicher schreiben. |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Die "richtige" Methode ist wenn man die Datei zum Schreiben öffnet, mit Seek ans Ende geht und dort weiterschreibt.
Was man vermeiden sollte ist den alten Inhalt in eine Stringliste einzulesen, dann Daten anhängen und den gesamten Inhalt wegzuschreiben. Mit dieser falsche Methode würde man alle Daten, die man bisher geschrieben hat nochmals schreiben (nicht gut für die CF). Ich habe mal auf die Schnelle eine Hilfsklasse geschrieben, mit der man es besser machen kann.
Delphi-Quellcode:
type
// Mit dieser Klasse kann man Daten an eine bestehende Datei anhängen TAppendFileWriter = class(TObject) private FStream : TFileStream; FFilename : string; function GetFilesize: Int64; public constructor Create(const filename:string); destructor Destroy;override; procedure WriteString(const s : String); procedure WriteLine(const line:string); function Flush:Boolean; property Filename:string read FFilename; property Filesize:Int64 read GetFilesize; end; { TAppendFileWriter } constructor TAppendFileWriter.Create(const filename: string); begin inherited Create; FStream := TFileStream.Create(filename, fmOpenReadWrite or fmShareDenyWrite); FStream.Seek(0, soFromEnd); end; destructor TAppendFileWriter.Destroy; begin FStream.Free; inherited; end; procedure TAppendFileWriter.WriteString(const s: String); begin if s <> '' then FStream.WriteBuffer(s[1], Length(s)); end; procedure TAppendFileWriter.WriteLine(const line: string); begin WriteString(line+#13#10); end; function TAppendFileWriter.GetFilesize: Int64; begin Result := FStream.Size; end; // Daten sicher schreiben procedure TAppendFileWriter.Flush; begin if not FlushFileBuffers(FStream.Handle) then RaiseLastWin32Error; end; |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Wow, das ist ja super,besten Dank für eure Vorschläge!!!
Genau, der Embedded-PC braucht im Betrieb mit Win2k nur ca. 2 Watt. Da ich auch auf bewegte Teile verzichten wollte, läuft alles über eine Interne CF-Karte. Das Ganze soll mindestens 2 Jahre ohne Eingriffe (Tastatur,Monitor usw. gibts nicht) betrieben werden, lediglich der USB-Stick wird monatlich gewechselt. Immer nach dem Neustart um Mitternacht werde die Log-Files von der internen CF-Karte auf den USB-Stick kopiert. Hab jetzt mal eine RAM-Disk gemacht, sollte ja den selben Effekt haben wie eine StringList. Meine Speichervariante:
Code:
Ist wohl nicht gerade optimal,richtig? Ich werd auch mal versuchen die vorgeschlagene Klasse einzubauen. Kenn mich mit der Materie leider noch nicht so aus...
If FileExists(fileName) Then Begin //fileName=.csv-File des aktuellen Tages
try AssignFile(TxtFile, fileName); //.csv-File Laden Append(TxtFile); WriteLn(TxtFile,messwerte); //Neue Zeile mit Messwerte in Logfile hinzufügen (ca.300 Zeichen) CloseFile(TxtFile); Gruss Roman |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Zitat:
|
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Bei neueren Delphi-Versionen kann man auch was aus IOUtils.pas nutzen:
Delphi-Quellcode:
class procedure TFile.AppendAllText(const Path, Contents: string; const Encoding: TEncoding);
class function TFile.AppendText(const Path: string): TStreamWriter; |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Zitat:
Zudem haben die Sticks MLC-Speicherzellen, deshalb möchte ich möglichst wenig drauf scheiben... Der interne (CF-Karte) Speicher dient natürlich auch als Backup, falls mal kein Stick drin ist. Zitat:
Also wenn ich's jetzt hinkriege, dass der Inhalt der Ram-Disk kurz VOR dem Neustart auf die CF-Karte und den USB-Stick kopiert werden, ist mein Problem ja schon gelöst :thumb: Gruss Roman |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Tipp: Man kann in seinem Profil angeben, was man benutzt, damit Andere ihre Antworten/Lösungen entsprechend ausrichten können.
Nja, es kommt halt drauf an, wieviele Zugriffe man einsparen will. - Du kannst natürlich mit der RAM-Disk arbeiten, aber wenn es jetzt nur für diese CSV-Dateien sein soll, dann könnte man auch die Dateizugriffe selber anpassen. - Du kannst weiterhin die alten Pascalfunktionen belassen, solltest aber nicht ständig die Datei öffnen und schließen und solltest vorallem das Caching dieser Funktionen verbessern. (128 Byte sind pervers ... mindestens Clustergröße oder besser noch das Mehrfache davhon, wäre schon besser und würde ein Vielfaches der Zugriffe einsparen) |
AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten
Wir loggen in einer SPS unter WXP 5x pro Sekunde in CSV-Dateien. Der Zugriff erfolgt innerhalb der SPS (ca. 50MB pro Tag). Parallel läuft ein Delphi-Programm, das ca. 1x pro Sekunde Daten in eine Log-Datei schreibt.
Mir sind keine Ausfälle der CF Karten (ca. 300 Anwendungen) bekannt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 Uhr. |
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