Hallo Zusammen,
den Frame habe ich jetzt auf $384 erhöht und einen Dauertest gestartet, mal sehn.
Bei der ganzen Untersuchung ist mir jetzt aufgefallen, dass meine Rountine zum schreiben eines Datensatzes extrem lange dauert. Bei näherer Betrachtung habe ich festgestellt, dass das DiskReset mit fast 600 ms ziemlich lange dauert. Mein Kollege hatte beim erstellen der Firmware am Anfang der Routine grundsätzlich ein DiskInit, DiskReset und ChkDisk gemacht.
Wenn ich das Diskinit und Reset jetzt aber rausnehme (es wird dann nur einmal zu Systemstart gemacht) dann funktioniert der Dateizugriff nicht wirklich, der Controller braucht ewig in meiner Schreibroutine. Mehrere Sekunden.
Frage: Muss ich vor jedem Dateizugriff ein Reset und Init durchführen? Das legt den Controller dann ja doch ganz schon lahm.
Ich möchte eigentlich vermeiden, dass ich die ganze zeit mit offenen Dateien arbeiten muss, da unser System oft im Akkubetrieb läuft, und die Gefahr da ist, dass von aussen ohne Vorwahnung die Spannung zusammenbricht.
Hier mal die Routine, vielleicht fällt euch ja etwas auf.
Code
procedure Save_Status(StatusNew: byte);
var dosTime, dosDate : word;
begin
if (StatusNew <> Sys_State) or (EE_SD_Func>1) then // neuer Status?
dosTime := F16_StrToTime(bytetostr(hours:2:'0')+':'+bytetostr(minutes:2:'0'));
dosDate := F16_StrToDate(bytetostr(day:2:'0')+'.'+bytetostr(month:2:'0')+'.'+bytetostr(year:2:'0'));
calc_FileName;
if F16_DiskInit and F16_DiskReset and F16_CheckDisk then
File_Error := 100;
F16_FileAssign(Datei, '', Datei_Name);// Handle mit FileNamen verknüpfen
if F16_FileExist(Dir, Datei_Name,faAnyFile) then
F16_FileAppend(Datei); // vorhandene Datei öffnen
File_Error := 101;
else // File Exist
Create_New_File(DosTime, DosDate);
File_Error := 102;
endif; // File Exist
calc_timestamp;
write(Datei, LongToStr(timestamp)+';');
write(Datei, bytetostr(Day:2:'0')+'.'+bytetostr(month:2:'0')+'.'+bytetostr(year:2:'0')+';');
write(Datei, bytetostr(hours:2:'0')+':'+bytetostr(minutes:2:'0')+':'+bytetostr(seconds:2:'0')+';');
write(Datei, longtostr(BattRunTime)+';');
write(Datei, longtostr(Data.Serialnumber)+';');
write(Datei, Data.Firmware+';');
write(Datei, bytetostr(StatusNew)+';');
write(Datei, bytetostr(Sys_State)+';');
write(Datei, longtostr(Data.Akkukap_Prozent)+';');
write(Datei, longtostr(Data.RunTime_DC_on)+';');
write(Datei, longtostr(Data.LastRunTime)+';');
write(Datei, bytetostr(U6_on)+';');
write(Datei, bytetostr(U7_on)+';');
write(Datei, longtostr(U_Batt)+';');
write(Datei, longtostr(U1)+';');
write(Datei, longtostr(U2)+';');
write(Datei, longtostr(U3)+';');
write(Datei, longtostr(U4)+';');
write(Datei, longtostr(U5)+';');
write(Datei, longtostr(I_Load)+';');
write(Datei, longtostr(I_charge)+';');
write(Datei, longtostr(PCB_Temp)+';'+#CR+#LF);
if not F16_FileClose(Datei) then // File schließen
File_Error := 103;
endif; // CloseFile
if not F16_FileSetDate(Dir, Datei_Name, DosTime, DosDate) then // TimeStamp
File_Error := 104;
endif; // CloseFile
if not F16_FileSetAttr(Dir, Datei_Name, [faArchive]) then // TimeStamp
File_Error := 105;
endif; // CloseFile
else // Check Disk
if F16_DiskInit then
if F16_DiskReset then
if F16_CheckDisk then
File_Error := 0;
SD_Size := F16_GetDiskSize;
// SD_Free := F16_GetDiskFree; // braucht recht lange
Dir := F16_GetCurDir;
else // CheckDisk
File_Error := 3;
endif; // CheckDisk
else // DiskReset
File_Error := 2;
endif; // DiskReset
else // DiskInit
File_Error := 1;
endif; // DiskInit
if File_Error > 0 then
SD_Size := 0;
SD_Free := 0;
Dir := '';
endif; // Error > 0
endif; // CheckDisk
endif; // neuer Status?
end Save_Status;
Gruß Nils