Hallo,
es scheint so als ob das FileSystem oder die LogDatei auf der SDCard ein Problem hat.
Wenn man die Log-Datei dann löscht, wird eine neue angelegt und es läuft wieder.
Im Handbuch haben wir extra geschrieben "..nur im ausgeschalteten Zustand die SD-Card ziehen/stecken..." Aber wahrscheinlich wurde das nicht immer gemacht
Jetzt muss ich irgendwie sicherstellen, das bei einem Defekt der Datei, diese umbenannt wird, damit eine neue Datei angelegt wird.
In den anderen Prozessen nutze ich die folgende Procedure:
Code
//---------------------------------------------------------------
// Log in Pipe speichern
procedure LogString(const InStrLog: string[41]);
var
xLog : byte;
bufferLog : TLogBuch;
begin
bufferLog.strLogTime:=RTCZeitBlock.strLogTime;
bufferLog.strLogDate:=RTCZeitBlock.strLogDate;
bufferLog.strLog:=InStrLog;
PipeSend( LogPipe, bufferLog );
end LogString;
Ich verwende für die Pipe den Type:
Code
// Logbuch Record
TLogBuch = record
strlogDate : string[6]; // strlog 01042018
strlogTime : string[6]; // strlog 235920
strLog : string[41]; // Logbuch String
end;
Code
// Meldungssystem
LogPipe : Pipe [8] of TLogBuch;// PIPE of byte für LOGBUCH
Im Process StatusDisplay schaue ich dann regelmäßig nach ob etwas in der Pipe vorhanden ist, wenn ja verarbeite ich es:
Code
//---------------------------------------------------------------
// Log speichern Pipe
// V1.1944 Thorsten Deck
//
procedure Save_LogPipe;
var
wResBlockWrite : Word;
dosTime, dosDate : word;
xFor, xstrNo, strNo : byte;
bufferLog : TLogBuch;
begin
// überprüfe Pipe
// if not LogViewActive then // sperre vom View aktiv
LogSaveActive:= true; // sperre setzen
xstrNo:= PipeStat( LogPipe );
if xstrNo > 0 then
// SD Card nicht vorhanden, dann Meldung aktiv lassen, Pipe leeren und aus der Funktion raus
if not bMMCok then
PipeFlush(LogPipe);
else // bMMCok wenn SDCard vorhanden dann laufe normal
SD_Error:= 0; // Setze ErrorCode auf 0
sdAktive(); // Timer für SD Anzeige
// erzeuge Datum und Zeit für Datei
dosTime := F16_StrToTime( RTCZeitBlock.strzeit);
dosDate := F16_StrToDate( RTCZeitBlock.strdatum );
// Dateiname erzeugen, für jeden Monat eine eigene Datei
//
Datei_Name := '20'+ByteToHex(RTCZeitBlock.jahr)+ByteToHex(RTCZeitBlock.monat)+'.log';
// Pfad setzen
LogDir := 'log';
lock(self);
F16_FileAssign(Log_Datei, LogDir, Datei_Name);// Handle mit FileNamen verknüpfen
if F16_FileExist(LogDir, Datei_Name,faAnyFile) then
F16_FileAppend(Log_Datei); // vorhandene Datei öffnen
else // File Exist
//Create_New_File(DosTime, DosDate);
F16_FileCreate(LogDir, Datei_Name, [faArchive], dosTime, dosDate,0);
SD_Error := 102; //DebugOut('102');
endif; // File Exist
// Schreibe Log-Zeile
for xFor := 1 to xstrNo do
PipeRecv( LogPipe, bufferLog ); // ziehe ersten Record aus Pipe
F16_BlockWrite (Log_Datei, @bufferLog, 1 ,wResBlockWrite );
endfor;
F16_FlushBufSec; // Sichere den Buffer
LogRecords:= F16_FileSizeH(Log_Datei); //Anzahl der Datenrecords im File
if not F16_FileClose(Log_Datei) then // File schließen
SD_Error := 104; //DebugOut('104');
endif; // CloseFile
if not F16_FileSetDate(LogDir, Datei_Name, DosTime, DosDate) then // TimeStamp
SD_Error := 105; //DebugOut('105');
endif; // CloseFile
if not F16_FileSetAttr(LogDir, Datei_Name, [faArchive]) then // TimeStamp
SD_Error := 106; //DebugOut('106');
endif; // CloseFile
unlock(self);
endif; // bMMCok
endif; // xstrNo
LogSaveActive:= false; // sperre entfernen
end Save_LogPipe;
Da die Steuerung sich bei einem Defekt hier unnötig aufhält, werde ich nun diese Routine etwas umschreiben und bei einem Fehler (SD_Error > 0 ) diese Routine beenden, die Pipe leeren "PipeFlush(LogPipe);" und bMMCok auf False setzen, dadurch wird ein Fehler im Display angezeigt und die SD-Card wird nicht mehr angesprochen.
Für mich scheint es so zu sein, als ob sich die Steuerung in diesem Bereich zwischen lock/unlock verlangsamt / hängen bleibt.
Hat Jemand eine Idee, wie ich absichtlich diese Datei beschädigen kann um das ganze zu simulieren?
Gruß
Thorsten