Hallo Leute,
ich teste gerade mal die Idee von rolf mit der Pipe um die LOGS auf die SD-Karte zu schreiben.
Blöderweise startet der Controller immer neu nachdem ich erfolgreich in die Pipe geschrieben habe.
Hier mein Aufbau:
In einen anderen Process wird dann regelmäßig diese Funktion gestartet, aber bis dahin komme ich mit dem Debugger erst gar nicht. Sobald er die Schleife mit dem Schreiben in die Pipe beendet hat startet die CPU neu (nein, der Watchdog ist das nicht )
Im Debugger sieht man die Daten korrekt in der Pipe stehen (siehe Anhang). Sobald er aus der Schleife geht, kommt der Neustart. Aber nur wenn ich Daten in die Pipe schreibe.
Da ich bis jetzt noch nie mit so einer Pipe gearbeitet habe, könnte es ja auch ein Fehler von mir sein. Hat Jemand eine Idee?
Thorsten
ich teste gerade mal die Idee von rolf mit der Pipe um die LOGS auf die SD-Karte zu schreiben.
Blöderweise startet der Controller immer neu nachdem ich erfolgreich in die Pipe geschrieben habe.
Hier mein Aufbau:
Code
var
// Meldungssystem
LogPipe : Pipe[255] of byte; // PIPE of byte für LOGBUCH
// Meldungssystem
LogPipe : Pipe[255] of byte; // PIPE of byte für LOGBUCH
Code
// Log in Pipe speichern
procedure LogString(const InStrLog: string[24]);
var
xLog : byte;
strLog : string[45];
begin
strLog:= RTCZeitBlock.strLog+InStrLog+#CR+#LF;
for xLog:= 1 to Length( strLog ) do
PipeSend( LogPipe, byte(strLog[xLog]) ); // wenn ich diese Zeile entferne stürzt die CPU nicht ab.
endfor;
end LogString;
procedure LogString(const InStrLog: string[24]);
var
xLog : byte;
strLog : string[45];
begin
strLog:= RTCZeitBlock.strLog+InStrLog+#CR+#LF;
for xLog:= 1 to Length( strLog ) do
PipeSend( LogPipe, byte(strLog[xLog]) ); // wenn ich diese Zeile entferne stürzt die CPU nicht ab.
endfor;
end LogString;
In einen anderen Process wird dann regelmäßig diese Funktion gestartet, aber bis dahin komme ich mit dem Debugger erst gar nicht. Sobald er die Schleife mit dem Schreiben in die Pipe beendet hat startet die CPU neu (nein, der Watchdog ist das nicht )
Im Debugger sieht man die Daten korrekt in der Pipe stehen (siehe Anhang). Sobald er aus der Schleife geht, kommt der Neustart. Aber nur wenn ich Daten in die Pipe schreibe.
Code
// Log speichern Pipe
procedure Save_LogPipe;
var
dosTime, dosDate : word;
xFor, xstrNo, strNo : byte;
strLog: string[45];
begin
xstrNo:= PipeStat( LogPipe ); // wenn Daten in Pipe, Anzahl ziehen
if xstrNo > 0 then // größer 0 dann aktiv werden
// erzeuge Datum und Zeit für Datei
dosTime := F16_StrToTime( RTCZeitBlock.strzeit);
dosDate := F16_StrToDate( RTCZeitBlock.strdatum );
// Dateiname erzeugen
// Beispiel JahrMonatTag.log = 20180422.log
Datei_Name := '20'+ByteToHex(RTCZeitBlock.jahr)+ByteToHex(RTCZeitBlock.monat)+ByteToHex(RTCZeitBlock.tag)+'.log';
LogDir := '';
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 // Datei vorhanden
//Datei erzeugen
F16_FileCreate(LogDir, Datei_Name, [faArchive], DosTime, DosDate,0);
endif; // File Exist
// Schreibe Log-Zeile
for xFor := 1 to xstrNo do
Write( SerOutD0, char(PipeRecv( LogPipe )) );
endfor;
if not F16_FileClose(Log_Datei) then // File schließen
endif;
if not F16_FileSetDate(LogDir, Datei_Name, DosTime, DosDate) then // Setzen Time Date der Datei
endif;
if not F16_FileSetAttr(LogDir, Datei_Name, [faArchive]) then
endif;
endif; // xstrNo Keine Daten in der PIPE
end Save_LogPipe;
procedure Save_LogPipe;
var
dosTime, dosDate : word;
xFor, xstrNo, strNo : byte;
strLog: string[45];
begin
xstrNo:= PipeStat( LogPipe ); // wenn Daten in Pipe, Anzahl ziehen
if xstrNo > 0 then // größer 0 dann aktiv werden
// erzeuge Datum und Zeit für Datei
dosTime := F16_StrToTime( RTCZeitBlock.strzeit);
dosDate := F16_StrToDate( RTCZeitBlock.strdatum );
// Dateiname erzeugen
// Beispiel JahrMonatTag.log = 20180422.log
Datei_Name := '20'+ByteToHex(RTCZeitBlock.jahr)+ByteToHex(RTCZeitBlock.monat)+ByteToHex(RTCZeitBlock.tag)+'.log';
LogDir := '';
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 // Datei vorhanden
//Datei erzeugen
F16_FileCreate(LogDir, Datei_Name, [faArchive], DosTime, DosDate,0);
endif; // File Exist
// Schreibe Log-Zeile
for xFor := 1 to xstrNo do
Write( SerOutD0, char(PipeRecv( LogPipe )) );
endfor;
if not F16_FileClose(Log_Datei) then // File schließen
endif;
if not F16_FileSetDate(LogDir, Datei_Name, DosTime, DosDate) then // Setzen Time Date der Datei
endif;
if not F16_FileSetAttr(LogDir, Datei_Name, [faArchive]) then
endif;
endif; // xstrNo Keine Daten in der PIPE
end Save_LogPipe;
Da ich bis jetzt noch nie mit so einer Pipe gearbeitet habe, könnte es ja auch ein Fehler von mir sein. Hat Jemand eine Idee?
Thorsten
Attachments
Filename: | 24-04-_2018_19-41-48.jpg |
Filesize: | 102.85 KB |
Title: | Watch |
Information: | Watch |
Download counter: | 146 |