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
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

b

c

d

e

f

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 ------------
Kommentar