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


Kommentar