Nachdem es mit der v.3 jetzt die mtimechart() gibt, braucht man sich über das Speichern von langen Datenaufzeichnungen im Flash Memory keine großen Gedanken mehr machen. Das ist wunderbar!
Aber es fehlt noch eine einfache Möglichkeit, den Status einzelner Variablen, und damit dann auch den Status des EibPC über den systemstart() hinweg zu retten.
Die 999 Slots im Flash Memory sollten dafür reichen, auch wenn man so verschwenderisch ist, und pro Slot nur eine Variable speichert.
Ideal ware eine Function die jeweils für eine Variable:
- Bei systemstart() je nach Wunsch, der Variable aus dem Flash den Wert zuweist, oder das Flash mit einem initial Wert beschreibt.
- Bei Änderung der Variablen nach einem Time-Delay den Wert ins Flash schreibt.
- Auf Komando den Wert der Variablen ins Flash-Memory schreibt.
- Für alle Daten-Typen funktioniert.
Ich habe mit Hausmitteln ein einfaches Macro dafür geschrieben. Das funktioniert auch, ist aber ein wenig umständlich.
Vielleicht geht das aber auch einfacher, ich bin Anfänger.
Eine Function istaber sicher die beste Lösung.
Das Macro zur Ansicht:
alexander
Aber es fehlt noch eine einfache Möglichkeit, den Status einzelner Variablen, und damit dann auch den Status des EibPC über den systemstart() hinweg zu retten.
Die 999 Slots im Flash Memory sollten dafür reichen, auch wenn man so verschwenderisch ist, und pro Slot nur eine Variable speichert.
Ideal ware eine Function die jeweils für eine Variable:
- Bei systemstart() je nach Wunsch, der Variable aus dem Flash den Wert zuweist, oder das Flash mit einem initial Wert beschreibt.
- Bei Änderung der Variablen nach einem Time-Delay den Wert ins Flash schreibt.
- Auf Komando den Wert der Variablen ins Flash-Memory schreibt.
- Für alle Daten-Typen funktioniert.
Ich habe mit Hausmitteln ein einfaches Macro dafür geschrieben. Das funktioniert auch, ist aber ein wenig umständlich.
Vielleicht geht das aber auch einfacher, ich bin Anfänger.
Eine Function istaber sicher die beste Lösung.
Das Macro zur Ansicht:
Code:
// $Id: RemMem.lib 64 2014-04-08 15:24:45Z asc $ //////////////////////////////////////////////////////////////////////// // To observe: // - macro does not give any information about read/write success/failure. // - macro does not pass information about pending write operations. /////////////////////////////////////////////////////////////////// // :begin RemMemControl3(Pos,Var,remVar,forceWrite) :info $ Saves the state of any scalar variable Var to the flash memory.\\ if forceWrite is set to OFF on systemstart() Var receives its value from the flash memory.\\ if forceWrite is set to ON on systemstart(), the value of Var during systemstart() is written to the flash memory.\\ When Var changes, after a delay of changeDelay@ the new value of Val is written to the flash memory.\\ ATTENTION: Two variables of the same type must be passed to the macro: \\ Var is the variable the macro persists the state for,\\ remVar must be passed for internal use of the macro and must not be changed from outside the macro!$\\ $slot on the flash memory u16$\\ $any scalar variable to safe the state $\\ $for internal use only. Must be ame type as Var$\\ $If set to EIN, writes the value of Val to the flash memory. During systemstart(),\\ if set to EIN, prevents a readflash( ) and writes the initial value of Val to the flash memory$ :var readSuccess@ :var readComplete@ :var readFault@ :var writeFault@ :var readDelay@ :var changeDelay@ :var readTimeout@ :var writeTimeout@ :var readPending@ :var writePending@ :var writeReq@ readSuccess@ = EIN readComplete@ = AUS readFault@ = ON writeFault@ = ON readDelay@ = 2000u64 /* delay after systemstart() for reading RemMem */ changeDelay@ = 60000u64 /* wait that time before writing to RemMem */ writeTimeout@ = 120000u64 readTimeout@ = 120000u64 readPending@ = AUS writePending@ = AUS writeReq@ = AUS ////////////// // reading ///////////// // read from flash if forceWrite is EIN if after(systemstart(),readDelay@) then{ readSuccess@ = EIN; write( "DebugOut-10/4/0",$Init RemMem()$c14 ); write( "DebugOut-10/4/0",$forceWrite: $c14+convert(forceWrite,$$c14) ); if( forceWrite) then{ write( "DebugOut-10/4/0",$skip reading$c14 ); readPending@ = AUS; readFault@ = OFF; writeReq@ = ON; }else{ readPending@ = EIN; readFault@ = ON; write( "DebugOut-10/4/0",$readflash()$c14 ); readFault@ = readflash( remVar,Pos ); }endif ; forceWrite = AUS; }endif // readflash() timeout handling if( delay(readPending@, readTimeout@ ) and readPending@) then{ write( "DebugOut-10/4/0",$TimeoutR$c14 ); readSuccess@ = AUS; readFault@ = OFF; }endif // after readflash() handling if( after(!readFault@,1u64 )) then{ write( "DebugOut-10/4/0",$read comlete$c14 ); write( "DebugOut-10/4/0",$rem: $c14+convert(remVar,$$c14) ); write( "DebugOut-10/4/0",$Suc: $c14+convert(readSuccess@,$$c14) ); if( readSuccess@ ) then{ Var = remVar; }else{ writeReq@ = EIN; }endif; readComplete@ = EIN; readPending@ = AUS; }endif /////////////// // writing ////////////// // check if a write is needed if( delay(change(Var),changeDelay@ )) then{ write( "DebugOut-10/4/0",$check$c14+convert(Var,$$c14)+$!=$c14+convert(remVar,$$c14) ); if Var != remVar then{ writeReq@ = EIN; write( "DebugOut-10/4/0",$write req$c14 ); }endif }endif // write to flash if (after((writeReq@ and readComplete@ and !writePending@ ), 1u64 )) then{ writePending@ = EIN; writeReq@ = AUS; writeFault@ = ON; write( "DebugOut-10/4/0",$writeflash()$c14 ); writeFault@ = writeflash( Var,Pos ); }endif // write timeout if( delay(writePending@,writeTimeout@) and writePending@ ) then{ write( "DebugOut-10/4/0",$TimeoutW$c14 ); writeFault@ = OFF; }endif // after write handling if after(!writeFault@,1u64 ) then{ write( "DebugOut-10/4/0",$write reset$c14 ); remVar = Var; writeFault@ = ON; writePending@ = AUS; }endif // handle outside trigger for write if( after(forceWrite and readComplete@,1u64) and forceWrite) then{ writeReq@ = EIN; forceWrite = AUS; }endif :end ////////////////////////////////////////////////////////////////////////
Kommentar