Ankündigung

Einklappen
Keine Ankündigung bisher.

Remanentes Speichern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [EibStudio] Remanentes Speichern

    Eine Frage an die Spezialisten.

    Bei der Entwicklung unter Version 2 habe ich mich immer über die verschwundenen Vorgabewerte nach einem Neustart geärgert.
    Zur Sicherung der Variablen habe ich dan ein Makro aus einer BMX-Lib genutzt. (BMXRemanent8.lib)
    Das klappte bestens. Nach einem Neustart waren die Vorgabewerte wieder vorhanden. Läuft auch unter V3.

    Unter der V3 suche ich immer noch nach "Zeitfressern" , da die Verarbeitungszeiten schlechter geworden sind. Jetzt habe ich mir einmal die Remanentsicheung angesehen.

    Die nachfolge Textdatei zeigt mein Vorgehen.

    Im Programm habe ich etwa 60 zu sichernde Variable, die überwiegend aus diversen Schaltuhren und Temperaturvorgaben stammen.

    Bei der Betrachtung der aufgelösten Makro sehe ich jetzt etwa 5 x sun() je Remanentvariable , die es zu sichern gilt. Ich durchlaufe also bei 60 Feldern etwa 300 x sun() und das ständig(?)!

    Der aufgelöste Makrotext entspricht einer Zeile RemanentVariable2().

    Hierzu meine Fragen?

    a Wozu steht hier sun()? Ist das eine Zeitbremse?
    b Kann sun() herausgelöst werden:
    c Gibt es eine bessere Methode oder ein anderes Makro?
    d Ist an meiner Idee oder Ausführung etwas falsch?
    e Bremst sun() den Ablauf nicht ab?
    f Wie sichert ihr die Variablen?

    Schade : + ) ergibt die Grinsebacke , sollte eigentlich fragend daherschauen.

    Für jeden Tipp bin ich dankbar!

    Wolfgang
    Code:
    Aufbau der Variablen
    ============================
    // 13    + 6     Ausschaltzeit H/ M IDEGARBEITSchaltuhr
    RemanentVariable2(EGA_HA1)
    RemanentVariable2(EGA_MA1)
    RemanentVariable2(EGA_HA2)
    RemanentVariable2(EGA_MA2)
    RemanentVariable2(EGA_HA3)
    RemanentVariable2(EGA_MA3)
    //  19         RemanentVariable( WolfgSchaltuhrTag1
    RemanentVariable2(TXTOGW1)
    RemanentVariable2(TXTOGW2)
    RemanentVariable2(TXTOGW3)
    //// 22  + 6        Einschaltzeit H / M IDEGARBEITSchaltuhr
    RemanentVariable2(OGW_EH1)
    RemanentVariable2(OGW_EM1)
    RemanentVariable2(OGW_EH2)
    RemanentVariable2(OGW_EM2)
    RemanentVariable2(OGW_EH3) 
    RemanentVariable2(OGW_EM3)
    // 28    + 6     Ausschaltzeit H/ M IDEGARBEITSchaltuhr
    RemanentVariable2(OGW_AH1)
    RemanentVariable2(OGW_AM1)
    RemanentVariable2(OGW_AH2)
    RemanentVariable2(OGW_AM2)
    RemanentVariable2(OGW_AH3)
    RemanentVariable2(OGW_AM3)
    //
    ////RemanentVariable( IDOGHANNISchaltuhrTag1
    // 34
    RemanentVariable2(TXTOGH1)
    RemanentVariable2(TXTOGH2)
    RemanentVariable2(TXTOGH3)
    ////37  + 6     Stunden
    RemanentVariable2(OGH_EH1)
    RemanentVariable2(OGH_EM1)
    RemanentVariable2(OGH_EH2)
    RemanentVariable2(OGH_EM2)
    RemanentVariable2(OGH_EH3) 
    RemanentVariable2(OGH_EM3)
    //  43 + 6    Minuten 
    RemanentVariable2(OGH_AH1) 
    RemanentVariable2(OGH_AM1)
    RemanentVariable2(OGH_AH2)  
    RemanentVariable2(OGH_AM2)
    RemanentVariable2(OGH_AH3)
    RemanentVariable2(OGH_AM3)
    //RemanentVariable( IDOGBADSchaltuhrTag 
    // 49
    RemanentVariable2(TXTOGB1)
    RemanentVariable2(TXTOGB2)
    RemanentVariable2(TXTOGB3)
    // 52 +6
    RemanentVariable2(OGB_EH1)
    RemanentVariable2(OGB_EM1)
    RemanentVariable2(OGB_EH2)
    RemanentVariable2(OGB_EM2)
    RemanentVariable2(OGB_EH3) 
    RemanentVariable2(OGB_EM3)
    //  58 + 6    Minuten 
    RemanentVariable2(OGB_AH1) 
    RemanentVariable2(OGB_AM1)
    RemanentVariable2(OGB_AH2)  
    RemanentVariable2(OGB_AM2)
    RemanentVariable2(OGB_AH3)
    RemanentVariable2(OGB_AM3)
    // 64 = (63 Werte
    //
    //========================================================================================================================================
    //ABASchaltuhrTagesWahl = ABATEC.LIB
    modifizietes Makro SchaltuhrTageswahl mit Weitergabe der Tage 
    //=========================================================================================================================================
    ABASchaltuhrTagesWahl(ArbeitSchaltuhrTag1,DateID1,IDEGARBEIT,EGA1_Day_1,EGA1_Day_2,EGA1_Day_3,EGA1_Day_4,EGA1_Day_5,EGA1_Day_6,EGA1_Day_7)
    ABASchaltuhrTagesWahl(ArbeitSchaltuhrTag2,DateID2,IDEGARBEIT,EGA2_Day_1,EGA2_Day_2,EGA2_Day_3,EGA2_Day_4,EGA2_Day_5,EGA2_Day_6,EGA2_Day_7)
    ABASchaltuhrTagesWahl(ArbeitSchaltuhrTag3,DateID3,IDEGARBEIT,EGA3_Day_1,EGA3_Day_2,EGA3_Day_3,EGA3_Day_4,EGA3_Day_5,EGA3_Day_6,EGA3_Day_7)
    WebSchaltuhr(SchaltUhrID1,IDEGARBEIT,ArbeitSchaltuhrEinZeit1,EGA_HE1,EGA_ME1)    /Schaltzeiten 
    WebSchaltuhr(AusschaltID1,IDEGARBEIT,ArbeitSchaltuhrAusZeit1,EGA_HA1,EGA_MA1)
    WebSchaltuhr(SchaltUhrID2,IDEGARBEIT,ArbeitSchaltuhrEinZeit2,EGA_HE2,EGA_ME2)
    WebSchaltuhr(AusschaltID2,IDEGARBEIT,ArbeitSchaltuhrAusZeit2,EGA_HA2,EGA_MA2)
    WebSchaltuhr(SchaltUhrID3,IDEGARBEIT,ArbeitSchaltuhrEinZeit3,EGA_HE3,EGA_ME3)
    WebSchaltuhr(AusschaltID3,IDEGARBEIT,ArbeitSchaltuhrAusZeit3,EGA_HA3,EGA_MA3)
    
    WebSchaltuhrAusfuehren(ArbeitSchaltuhrTag1,ArbeitSchaltuhrEinZeit1,"EG-GAST-RKNacht-2/6/3",EIN)
    WebSchaltuhrAusfuehren(ArbeitSchaltuhrTag1,ArbeitSchaltuhrAusZeit1,"EG-GAST-RKNacht-2/6/3",AUS)
    
    WebSchaltuhrAusfuehren(ArbeitSchaltuhrTag2,ArbeitSchaltuhrEinZeit2,"EG-GAST-RKPraesens-2/6/17",EIN)
    WebSchaltuhrAusfuehren(ArbeitSchaltuhrTag2,ArbeitSchaltuhrAusZeit2,"EG-GAST-RKPraesens-2/6/17",AUS)
    WebSchaltuhrAusfuehren(ArbeitSchaltuhrTag3,ArbeitSchaltuhrEinZeit3,"EG-GAST-RKPraesens-2/6/17",EIN)
    WebSchaltuhrAusfuehren(ArbeitSchaltuhrTag3,ArbeitSchaltuhrAusZeit3,"EG-GAST-RKPraesens-2/6/17",AUS)
      if change(m_DateID1_IDEGARBEIT_Choice) then EGA1A_Choice = m_DateID1_IDEGARBEIT_Choice; ABASchaltuhrSave(EGA1,EGA1A_Choice) endif
      if change(m_DateID2_IDEGARBEIT_Choice) then EGA2A_Choice = m_DateID2_IDEGARBEIT_Choice; ABASchaltuhrSave(EGA2,EGA2A_Choice) endif
      if change(m_DateID3_IDEGARBEIT_Choice) then EGA3A_Choice = m_DateID3_IDEGARBEIT_Choice; ABASchaltuhrSave(EGA3,EGA3A_Choice) endif
    //
      if change(SchaltuhrHArbeitSchaltuhrEinZeit1) then        EGA_HE1 =   SchaltuhrHArbeitSchaltuhrEinZeit1 endif
      if change(SchaltuhrMArbeitSchaltuhrEinZeit1) then        EGA_ME1 =   SchaltuhrMArbeitSchaltuhrEinZeit1 endif
      if change(SchaltuhrHArbeitSchaltuhrAusZeit1) then        EGA_HA1 =   SchaltuhrHArbeitSchaltuhrAusZeit1 endif
      if change(SchaltuhrMArbeitSchaltuhrAusZeit1) then        EGA_MA1 =   SchaltuhrMArbeitSchaltuhrAusZeit1 endif
      if change(SchaltuhrHArbeitSchaltuhrEinZeit2) then        EGA_HE2 =   SchaltuhrHArbeitSchaltuhrEinZeit2 endif  
      if change(SchaltuhrMArbeitSchaltuhrEinZeit2) then        EGA_ME2 =   SchaltuhrMArbeitSchaltuhrEinZeit2 endif
      if change(SchaltuhrHArbeitSchaltuhrAusZeit2) then        EGA_HA2 =   SchaltuhrHArbeitSchaltuhrAusZeit2 endif
      if change(SchaltuhrMArbeitSchaltuhrAusZeit2) then        EGA_MA2 =   SchaltuhrMArbeitSchaltuhrAusZeit2 endif
      if change(SchaltuhrHArbeitSchaltuhrEinZeit3) then        EGA_HE3 =   SchaltuhrHArbeitSchaltuhrEinZeit3 endif
      if change(SchaltuhrMArbeitSchaltuhrEinZeit3) then        EGA_ME3 =   SchaltuhrMArbeitSchaltuhrEinZeit3 endif
      if change(SchaltuhrHArbeitSchaltuhrAusZeit3) then        EGA_HA3 =   SchaltuhrHArbeitSchaltuhrAusZeit3 endif
      if change(SchaltuhrMArbeitSchaltuhrAusZeit3) then        EGA_MA3 =   SchaltuhrMArbeitSchaltuhrAusZeit3 endif
    //==========================================================================================================================
    
    
    Auflösung einer Zeile "RemanentVariable2" bewirkt folgenden Code !!!!!!!!!!
    ======================================================================
    // instead of the other version, we do not have a default value so just take zero as an old value
    OGW_EH2_OldValue = convert( 0u08, OGW_EH2);    /* in program the variable will be checked on change against this value to detect a real value change */
    
    if systemstart() then OGW_EH2_OldValue = OGW_EH2 endif
    
    // use the area both versions have in common
    RVCommon( OGW_EH2 )
    // define a unique number throughout all variables, this will ensure that
    // in later versions all variables may be read one by one
    
    OGW_EH2_AlreadyWritten = AUS
    OGW_EH2_Pos1 = 0u16
    OGW_EH2_Pos2 = 0u16
    OGW_EH2_IsDirty = AUS
    OGW_EH2_Buffer2 = EMPTYSTRING
    OGW_EH2_KeyEqual = $OGW_EH2=$
    OGW_EH2_Number = 0u16;                /* we use this number for a shortcut later via command line */
    
    if systemstart() then {     RV_VariableCount = RV_VariableCount + 1u16;    OGW_EH2_Number = RV_VariableCount;} endif
    
    OGW_EH2_Buffer =  $OGW_EH2=$+convert(OGW_EH2, EMPTYSTRING)
    if change(OGW_EH2_Buffer) and OGW_EH2_OldValue != OGW_EH2 then {    OGW_EH2_IsDirty = EIN;    RV_DirtyCount = RV_DirtyCount + 1u32;    OGW_EH2_OldValue = OGW_EH2;    RV_DebugOut_String(OGW_EH2_Buffer+$ changed -> increasing DirtyCount $+convert(RV_DirtyCount,EMPTYSTRING));} endif
    //#ifdef DEBUG_RV
    //:return if RV_Debug then sendudp(RV_Debug_Port,RV_Debug_IP, $@ $+RV_Currenttime+$, RV:$, OGW_EH2_Buffer+$ changed -> increasing DirtyCount $+convert(RV_DirtyCount,EMPTYSTRING), 13, 10 ) endif;
    //#endif DEBUG_RV
    //#ifndef DEBUG_RV
     sun();
    //#endif DEBUG_RV
    
    // -------------- End of expansion ------------
    
    
    // read in the buffer wether the variable is found
    if after( RV_State == RV_State_ReadflashExamineBuffer,1u64)  then {    OGW_EH2_Pos1 = find( RV_Buffer, OGW_EH2_KeyEqual, 0u16 );    if OGW_EH2_Pos1 >= 0u16 and OGW_EH2_Pos1 < EOS then {        OGW_EH2_Buffer2 = split( RV_Buffer, OGW_EH2_Pos1+size(OGW_EH2_KeyEqual), EOS );        OGW_EH2_Pos2 = find( OGW_EH2_Buffer2, CRLF, 0u16 );        if OGW_EH2_Pos2 >= 0u16 and OGW_EH2_Pos2 < EOS then {            OGW_EH2_Buffer2 = split( OGW_EH2_Buffer2, 0u16, OGW_EH2_Pos2-1u16 );        } endif;        OGW_EH2 = convert(OGW_EH2_Buffer2, OGW_EH2);        RV_DebugOut_String($Slot $+convert(RV_Slot,EMPTYSTRING)+$ ReadBuffer: OGW_EH2=$+convert(OGW_EH2,EMPTYSTRING));        OGW_EH2_IsDirty = AUS;        /* increase the found variables counter of all variables */;        RV_VariablesRead = RV_VariablesRead + 1u16;        /* increase the found variables counter of this cyclus */;        RV_VariablesReadCyclus = RV_VariablesReadCyclus + 1u16;    } endif} endif
    //#ifdef DEBUG_RV
    //:return if RV_Debug then sendudp(RV_Debug_Port,RV_Debug_IP, $@ $+RV_Currenttime+$, RV:$, $Slot $+convert(RV_Slot,EMPTYSTRING)+$ ReadBuffer: OGW_EH2=$+convert(OGW_EH2,EMPTYSTRING), 13, 10 ) endif;
    //#endif DEBUG_RV
    //#ifndef DEBUG_RV
     sun();
    //#endif DEBUG_RV
    
    // -------------- End of expansion ------------
    
    
    /* this will only be executed once due to the validation scheme */
    if after(RV_State == RV_State_WriteflashStart,1u64) then OGW_EH2_AlreadyWritten = AUS endif
    
    OGW_EH2_DoAdd2Buffer = AUS
    
    if after( RV_State == RV_State_WriteflashCollectData and !OGW_EH2_AlreadyWritten, 1u64) then {    OGW_EH2_DoAdd2Buffer = size(RV_Buffer) + size(OGW_EH2_Buffer) + size(CRLF) <= RV_MaxBufferSize;    if OGW_EH2_DoAdd2Buffer then {        /* enough space to hold the variable */        if size(RV_Buffer) > 0u16 then RV_Buffer = RV_Buffer + CRLF + OGW_EH2_Buffer else RV_Buffer = OGW_EH2_Buffer endif;        OGW_EH2_AlreadyWritten = EIN;        OGW_EH2_IsDirty = AUS;        RV_DebugOut_String($add to flash($+convert(RV_Slot,EMPTYSTRING)+$) $+OGW_EH2_Buffer);    } else {        RV_DebugOut_String($not enough space in buffer for flash($+convert(RV_Slot,EMPTYSTRING)+$) for $+OGW_EH2_Buffer);        RV_NeedMoreSpace = RV_NeedMoreSpace + 1u16;    } endif;} endif
    //#ifdef DEBUG_RV
    //:return if RV_Debug then sendudp(RV_Debug_Port,RV_Debug_IP, $@ $+RV_Currenttime+$, RV:$, $add to flash($+convert(RV_Slot,EMPTYSTRING)+$) $+OGW_EH2_Buffer, 13, 10 ) endif;
    //#endif DEBUG_RV
    //#ifndef DEBUG_RV
     sun();
    //#endif DEBUG_RV
    
    // -------------- End of expansion ------------
    
    //#ifdef DEBUG_RV
    //:return if RV_Debug then sendudp(RV_Debug_Port,RV_Debug_IP, $@ $+RV_Currenttime+$, RV:$, $not enough space in buffer for flash($+convert(RV_Slot,EMPTYSTRING)+$) for $+OGW_EH2_Buffer, 13, 10 ) endif;
    //#endif DEBUG_RV
    //#ifndef DEBUG_RV
     sun();
    //#endif DEBUG_RV
    
    // -------------- End of expansion ------------
    
    
    if (OGW_EH2_Number == convert( RV_SetVariableNumberOrName, 0u16) or RV_SetVariableNumberOrName == $OGW_EH2$) then {    OGW_EH2 = convert( RV_SetVariableString, OGW_EH2);    RV_SetVariableNumberOrName = EMPTYSTRING;    RV_SetVariableString = EMPTYSTRING;} endif
    
    
    // -------------- End of expansion ------------
    
    
    if RV_DoDump2UDP then RV_DebugOut_String($Nr. $+convert(OGW_EH2_Number,$$)+$:OGW_EH2=$+convert( OGW_EH2, EMPTYSTRING)) endif
    //#ifdef DEBUG_RV
    //:return if RV_Debug then sendudp(RV_Debug_Port,RV_Debug_IP, $@ $+RV_Currenttime+$, RV:$, $Nr. $+convert(OGW_EH2_Number,$$)+$:OGW_EH2=$+convert(OGW_EH2,EMPTYSTRING), 13, 10 ) endif;
    //#endif DEBUG_RV
    //#ifndef DEBUG_RV
     sun();
    //#endif DEBUG_RV
    
    // -------------- End of expansion ------------

    #2
    Hallo Wolfgang,

    Zitat von schloessl Beitrag anzeigen
    BMXRemanent8.lib
    Unter der V3 suche ich immer noch nach "Zeitfressern"

    Hierzu meine Fragen?

    a Wozu steht hier sun()? Ist das eine Zeitbremse?
    b Kann sun() herausgelöst werden:
    c Gibt es eine bessere Methode oder ein anderes Makro?
    d Ist an meiner Idee oder Ausführung etwas falsch?
    e Bremst sun() den Ablauf nicht ab?
    f Wie sichert ihr die Variablen?
    a) Ein Makro darf definitionsgemäß nicht leer sein sonst meckert der Compiler. enertegus hat mir sun() hier als "Füller" empfohlen. Ich hätte es auch gerne weggelassen. Vielleicht kann er hier mal was zu sagen...

    b) Du kannst sun() weglassen und mußt dann alle DebugOut-Aufrufe im Makro löschen.

    c) Klar, Du kannst alternativ den flash selbst beschreiben. Dann aber nicht mit einem lesbaren Namen sondern nur mit einer Nummer.

    d) ??

    e) -> frag enertegus

    f) mit BMXRemanent9.lib :-), allerdings habe ich noch die V2 im Einsatz.

    Gruß,
    Bernd

    Kommentar


      #3
      Zitat von bmx Beitrag anzeigen
      f) mit BMXRemanent9.lib :-), allerdings habe ich noch die V2 im Einsatz.

      Gruß,
      Bernd
      Danke Bernd,

      für die schnelle Antwort!

      Ich werde mal die BMXRemanent9.lib suchen und es damit versuchen.

      Etwas verblüfft mich ja sehr! Ich dachte Du bist einer der großen Betatester und arbeitest noch mit der V2!

      Du warst klüger als ich!!!

      Trotz aller Unkenrufe läuft aber die BMXHA7E_15 zuverlässig, wenn auch etwas langsamer als in der V2.

      Alle anderen Varianten ob BMXHA7E_15.lib oder EnertecOnewire.lib geben keine Mux von sich.

      Ich hoffe Du steigst langsam auf die V3 um. Bis jetzt konnte ich und viele Andere Deine Makros immer problemlos nutzen. :-)

      Gruss
      Wolfgang

      Kommentar


        #4
        Hallo Wolfgang,

        ist hier zwar nicht das Thema aber: Welche bmxha7e_15 meintest Du, die läuft? bmxha7e_15a.lib?

        1. Hast Du den eibPC schon länger als 6 Wochen laufen lassen ohne neu zu starten?
        2. Wieviele Sensoren betreibst Du?
        3. Im parasitären oder nicht parasitären Betrieb?

        Danke vorab.

        Kommentar


          #5
          Hallo Wolfgang,

          >Ich werde mal die BMXRemanent9.lib suchen und es damit versuchen.
          Ist nicht offiziell hochgeladen, bringt auch keinen Vorteil. Ich habe intern die Version 13 für weitere Tests vorbereitet. Die wird dann größere Strings nutzen und vermutlich sequentiell arbeiten. Da aber mein Beta Gerät derzeit bei Papa enertex zur Kur ist, geht es da derzeit nicht weiter.

          >Betatester und arbeitest noch mit der V2!
          Eben, einen Betatest macht man nicht auf seiner Produktivumgebung wenn man den WAF nicht versauen will ...

          >Trotz aller Unkenrufe läuft aber die BMXHA7E_15 zuverlässig,
          >wenn auch etwas langsamer als in der V2.
          Hat in etwa die gleichen Schwierigkeiten. Da ist das so, das auch in sehr wenigen Zyklen der HA7E abgefragt und die Temperatur geliefert wird. Wenn ich die Erkennung in mehrere Zyklen verteilen würde, dann können die Sensoren nicht mehr so schnell abgefragt werden und das wäre gesamt zu langsam.

          Aber es steht Euch frei den Code zu nutzen, weiterentwickeln, ändern etc.

          Gruß,
          Bernd

          Kommentar


            #6
            Zitat von rennsemmel Beitrag anzeigen
            Hallo Wolfgang,

            ist hier zwar nicht das Thema aber: Welche bmxha7e_15 meintest Du, die läuft? bmxha7e_15a.lib?

            1. Hast Du den eibPC schon länger als 6 Wochen laufen lassen ohne neu zu starten?
            2. Wieviele Sensoren betreibst Du?
            3. Im parasitären oder nicht parasitären Betrieb?

            Danke vorab.
            Hallo Rennsemmel,

            schau mal die Freigabezyklen der Versionen und Patches an
            und verfolge die entsprechenden Kommentare.

            Glaubt Du wirklich daran eine V3.xxx hätte 6 Wochen überlebt!

            Die weiteren Fragen hatte ich in einer PM beantwortet.

            Gruss und hoffe weitert

            Wolfgang

            Kommentar

            Lädt...
            X