Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Datenspeicherung in EEprom oder Ramdevice Kategorie: Programmierung (von Jörg Hansen - 30.09.2015 13:48)
Als Antwort auf Datenspeicherung in EEprom oder Ramdevice von Rainer - 1.08.2015 13:51
Ich nutze:
C164CI-ControllerBoard, eigenes Board, OSOPT V3.1
> Hallo, ich habe eine Frage zur Speicherung in Eprom oder Ram.
> Kann man Strings in ein Array speichern ? Ich möchte als Datenlogger das Datum und die Uhrzeit fortlaufend
> speichern oder muss ich das umständlich mit strx.getnum umwandeln ?
>
> MfG
>
> R. Mandel

Hallo,

ich benutze genau diese Funktion: Event-Logging über V24 und parallel in ein EEPROM.
Ich habe 2 EEPROMS: eines für alle Konfigurationseinstellungen
(hier liegen auch die Start/Ende Adressen für das LogEEPROM ab)
Im 2. EEPROM (Adresse 3) speichere ich die letzten Log-Events mit Datum und Text als Ringspeicher.
Jedoch habe ich es mir hier mit der Speicherverwaltung einfach gemacht:
Jede Eintrag benötigt 64 Byte (32 für den Zeitstempel und 32 für den Text)

Aus den restlochen Code rufe ich nur die function log()
z.B. log("Steuerung initialisiert");  oder bei variablen log(logstring);

Hier mal der Quellcode:

//-----------------------------------------------------------------------------------
function log (string s) //Logging von Events zur Ausgabe auf hwcom und in EEPROM
//-----------------------------------------------------------------------------------
{string time;
 hwcom.put(13); //Carriage Return - Cursor an den Anfang der Zeile setzen
 time=(system.day()/10+0x30) + ((system.day()%10)+0x30); //Tag ausgeben
 time=time + "."; //Punkt zwischen Tag und Monat
 time=time + (system.month()/10+0x30) + ((system.month()%10)+0x30); //Monat ausgeben
 time=time + "."; //Punkt zwischen Monat und Jahr
 time=time + (system.year()/1000+0x30) + (((system.year()%1000)/100)+0x30); //Jahr ausgeben
 time=time + ((system.year()%100)/10+0x30) + ((system.year()%10)+0x30); //Jahr ausgeben
 time=time + 32; //ASCII-Zeichen 32 = Blank
 time=time + (system.hour()/10+0x30) + ((system.hour()%10)+0x30); //Stunde ausgeben
 time=time + ":"; //Doppelpunkt zwischen Stunde und Minute
 time=time + (system.minute()/10+0x30) + ((system.minute()%10)+0x30); //Minute ausgeben
 time=time + ":"; //Punkt zwischen Minute und Sekunde
 time=time + (system.second()/10+0x30) + ((system.second()%10)+0x30);//Sekunde
 time=time + 32; //ASCII-Zeichen 32 = Blank
 time=time + 32; //ASCII-Zeichen 32 = Blank
 hwcom.send(time,str.length(time)); //Zeitstempel über hwcom senden
 wait hwcom.ready();
 hwcom.send(s,str.length(s)); // Logtext über hwcom senden
 hwcom.ret();
 // Schreiben des Logs in EEPROM (24C64 auf Adresse 3 )
 eeprom.writestr(3,EEStart,time); //Zeitstempel
 eeprom.writestr(3,EEStart+32,s); //Logtext
 EEStart = (EEStart+64); // Schreibpointer hochsetzen
 if EEEnde < EEStart EEEnde=EEStart; // Endpointer mitschleppen, bis Ringspeicher voll ist
 if EEStart >= 0x2000 EEStart = 0x0000; //Wenn EEProm Ende, dann wieder vorne beginnen
 eeprom.writeint(0,513,EEStart); // neue Werte Restartfest im 1. EEPROM sichern
 eeprom.writeint(0,515,EEEnde);
};
//-----------------------------------------------------------------------------------
function leselog() // EEProm Logfile lesen
//-----------------------------------------------------------------------------------
{int i; //Schleifenzähler
 string s; //Stringinhalt
 byte y; // Stringlänge
 if debug //Ausgabe der Pointer
 {
 s="EEStart: ";
 str.putint(s,EEStart);
 hwcom.send(s,str.length(s));
 wait hwcom.ready();
 s="EEEnde: ";
 str.putint(s,EEEnde);
 hwcom.send(s,str.length(s));
 wait hwcom.ready();
 hwcom.ret();
 };
     for i = 0 ... (EEEnde-64) step 64 // von Anfang bis Endpointer-64 lesen
     {
     y=eeprom.readstr(3,i,s); //y liefert die Stringlänge, keine Fehlerbehandlung bei y=0
     hwcom.send(s,y);
     wait hwcom.ready();
     y=eeprom.readstr(3,i+32,s);
     hwcom.send(s,y);
     wait hwcom.ready();
     hwcom.ret();
     if i >= 0x1fc0 break; // nicht über Bereich hinauslesen falls falscher Pointer
     };
};


Vielleicht dient dies ja als Anregung.

GruÃ?
Jörg


    Antwort schreiben


Antworten: