AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Datenlogger zerstört CompactFlash (CF) Karten
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Datenlogger zerstört CompactFlash (CF) Karten

Ein Thema von rhuber · begonnen am 11. Sep 2012 · letzter Beitrag vom 11. Sep 2012
Antwort Antwort
Seite 1 von 2  1 2      
rhuber

Registriert seit: 11. Sep 2012
12 Beiträge
 
Delphi 7 Personal
 
#1

Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 11:56
Hallo zusammen,nach einer langen Zeit als nur-Leser brach ich jetzt doch mal eure Hilfe!
Leider hab ich keinen besseren Bereich im Forum gefunden, deshalb versuch ich's mal hier:

Hab ein gröberes Problem mit meinem Datenlogger, der im Minutentakt ca. 10 Temperaturwerte in ein .csv-File schreib. Von 5 Datenloggern ist nach wenigen Monaten bereits bei 3 die CF-Karte defekt(Zugriffsfehler auf Logfile-Ordner,nach aut. Scan durch Win2k alle bisherigen csv-Files weg...)

Das System sieht so aus:
- Embedded-PC Alix 3.d3 (500MHz Geode LX, 256MB RAM,CF-Festplatte)
- Windows 2000 SP4 (praktisch sämtliche Schreibzugriffe unterdrückt)
- Windows und Logs laufen auf CF-Karte (SLC-Typ,sollte >1Million Schreibzugriffe ertragen)
- Alle 60s werden in Logfile neue Werte eingetragen, nach 24h wird neues Logfile erstellt (also max. 1500 Schreibzugriffe auf gleiche Datei,max.600kbyte)
- FileMon gibt jede Minute jedoch 4 Schreibzugriffe an, also max. 6000 auf selbes Logfile

Weshalb sich die CF-Karten so schnell verabschieden ist mir ein Rätsel! Sind es evtl. einfach schlechte Karten, oder liegt es an meiner suboptimalen Schreibfunktion? Ich verwende folgende:

Code:
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);
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 12:00
Flashdisks haben 10.000 bis 2.000.000 Schreibzyklen - je nach Typ, die vom Hersteller garantiert werden. Ist nunmal so, muss man einplanen.
Jens
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 12:02
Ich würde die Datei nicht bei jedem Schreibzugriff Öffnen/Schliessen.
Markus Kinzler
  Mit Zitat antworten Zitat
rhuber

Registriert seit: 11. Sep 2012
12 Beiträge
 
Delphi 7 Personal
 
#4

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 12:13
Hmm,die verwendeten SLC-Karten müssten >1.000.000 Schreibzyklen aushalten, im Gegensatz zu den üblichen MLC (>10.000 bis >100.000). Hätte daher eigentlich ausreichend Reserven...

Ok,also am Besten bei Programmstart Logfile öffnen, und dann erst beim Beenden wieder schliessen? Könne ich denn so Schreibzugriffe sparen? Lesezugriffe sollen ja unproblematisch sein.

Danke!

EDIT: Wird etwa erst mit dem Aufruf von CloseFile() geschrieben, solange ich nur WriteLn()ausführe bleibt alles im RAM??

Geändert von rhuber (11. Sep 2012 um 12:15 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 12:22
EDIT: Wird etwa erst mit dem Aufruf von CloseFile() geschrieben, solange ich nur WriteLn()ausführe bleibt alles im RAM??
Das kommt auf die Einstellungen von Windows bzw. des Schreib-Caches an. Manche Controller cachen ebenfalls. Bis kein Flush oder Close ausgeführt ist, kann man daher allgemein erstmal nur sagen: Die Daten könnten schon geschrieben sein, vielleicht auch nicht.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 12:49
Was loggt denn der Datenlogger?
Nur Zugriffe auf DateiAPIs, die Zugriffe auf den Datenträgercontroler, oder die realen Zugriffe auf die Speicherzellen?


Jupp, beim Öffnen wird das Ende der Datei aisgelesen, dann nochmal darin nach einem "Dateiendezeichen" gesucht, der Zeiger auf das Ende gesett und wenn du dann die Datei schleißt, wird natürlich der komplette Cluster neu beschrieben und womöglich noch ein Annpassung im Volume Bitmap und dann auch noch die Anpassung der Dateigröße und des Änderungsdatums im Verteichnis und womöglich auch noch in allen übergeordneten Verzeichnissen. (Letzteres wurde in Windows 7 mal abgeschafft, vermutlich zum Zeitgewinn und in Hinblick auf SSDs)

Wie stabil läuft denn das System und wie wichtig sind die geloggten Daten?
Erstmal die Datei nicht ständig öffnen/schließen, dann auf Streams ausweichen, welche keine eigene Cache implementieren, so wie so alten Dateifunktionen, womit dann beim Absturz des Programms keine Daten verloren gehen.
Je nach Schreibverhalten und Speicherauslastung werden hier, über die WindowsFileCache, wenn man die Datei nicht ständig schließt, auch die physischen Dateiuzugriffe verringert.

Oder wenn das Schreiben nicht so wichtig ist, dann mit einer größeren eigenen Cache zwischenspeichern und die Dateizugriffe minimieren.

Sind die Daten ganz wichtig, dann müßte man sogar noch die Schreibcache vom Windows und des Datenträgers ausschalten, was aber die realen Zugriffe noch erhöht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
rhuber

Registriert seit: 11. Sep 2012
12 Beiträge
 
Delphi 7 Personal
 
#7

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 13:50
Vielen Dank für eure Antworten!!!

Das mit dem Schreibcache hab ich gar nicht überlegt; FileMon (zur Überwachung der CF-Zugriffe) loggt ziemlich sicher nur die Datei APIs und nicht die realen Zugriffe...

Das System läuft extrem stabil (im Labor seit über einem Jahr), startet sich jeweils um Mitternacht selbst neu und schreibt die Logfiles des letzten Tages auf einen USB-Stick.
Es ist nicht tragisch wenn mal ein Tag verloren geht, viel wichtiger ist dass das System nicht hängen bleibt (was es aber im Falle eines CF-Defekts tut,dann hängt nämlich mein AutoReboot-Tool ->gemacht mit ExitWindowsEx,gibts da eine "Hardcore-Variante"?).

Nun, ich kenne mich leider mit den Datei APIs nicht sehr gut aus; gibts eine einfache Alternative zu "WriteLn()", mit welcher vorerst noch nichts geschrieben wird? Also zuerst nur in den RAM speichern und erst später die Änderungen schreiben,ohne zuviel am Code ändern zu müssen?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 13:57
gibts eine einfache Alternative zu "WriteLn()", mit welcher vorerst noch nichts geschrieben wird? Also zuerst nur in den RAM speichern und erst später die Änderungen schreiben,ohne zuviel am Code ändern zu müssen?
.. die TStringList
mit der Methode saveToFile zu speichern.

Die LogDaten im ram zu halten nützt natürlich nichts, wenn das Programm abstürzt.


nicht schön ...
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, classes;
var
  sl : TStringList;

procedure writeLn(s: ansiString);
begin
  sl.add(s);
end;

begin

  { TODO -oUser -cConsole Main : Insert code here }

  sl := TStringList.Create;
  try
    writeLn('test');
    sl.SaveToFile('filePath+fileName');
  finally
    sl.Free;
  end;
end.

Grüße
Klaus
Klaus

Geändert von Klaus01 (11. Sep 2012 um 14:33 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 14:28
In dem Fall würde ich auch fast sagen: Logs in StringListen, und speichern bei Programmende, Ausnahmefehlern die sich früh genug abfischen lassen und zu einem definierten Zeitpunkt. Und zwar direkt auf den Stick, dann ist die CF Karte überhaupt nicht mehr an Bord.
Hat natürlich den Nachteil, dass Logs flöten gehen, wenn mal einer mutwillig den Stecker zieht, aber die Hardware lässt an der Stelle dann einfach nicht arg viel Spiel für Datensicherheit. Im Zweifel könnte man noch an einen externen DB Server denken, der dann z.B. via WLAN alles schön in Tabellen speichert.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 14:39
Es ist ja auch möglich die Stringlist alle 2 Stunden oder so mal zu speichern.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 Uhr.
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