Seite 2 von 2

Re: Änderung SV-Kanalzuordnung zerstört Programme

Verfasst: 06.06.2019, 12:18
von Black
also das löschen oder das verändern zu verhindern finde ich... quatsch

es muss an der stelle einfach nur gewährleistet werden, dass die bezüge und verweise in sich korrekt und kosistent sind.
das sind sie jetz nicht.
lösungsansatz von mir wäre:
Bei Anlegen, Löschen, verändern einer Kanalzuordnung folgender durchlauf.
Iterieren über alle enthaltenen Singleconditions und Singledestinations
ist eine eine systemvariable ohne Kanalzuweisung: ?
wenn ja: type ist ivtSystemID, xxxChannel (Conditon oder Destination) ist ID_Error
ist es eine Sysvar mit gültiger ! Kanalzuweisung oder ein HSSDP ?
wenn ja Type ist ivtrObjectId, xxxChannel (Conditon oder Destination) ist der Kanal der Sysvar bzs des HSS.

Das ist die ganze kunst.

was anderes macht der sdv auch nicht, wenn dann in einem Programm eine Sysvar mit Kanalzuweisung geändert wird, dass dort der Kanalbezug entfernt wird, dann erscheint nach dem Korrekturlauf des SDV das programm wieder in der Form, das dort eine Systemvariable angeboten wird, und zwar die richtige.

Black

Re: Änderung SV-Kanalzuordnung zerstört Programme

Verfasst: 06.06.2019, 13:08
von jmaus
Black hat geschrieben:
06.06.2019, 12:18
lösungsansatz von mir wäre:
Bei Anlegen, Löschen, verändern einer Kanalzuordnung folgender durchlauf.
Iterieren über alle enthaltenen Singleconditions und Singledestinations
ist eine eine systemvariable ohne Kanalzuweisung: ?
wenn ja: type ist ivtSystemID, xxxChannel (Conditon oder Destination) ist ID_Error
ist es eine Sysvar mit gültiger ! Kanalzuweisung oder ein HSSDP ?
wenn ja Type ist ivtrObjectId, xxxChannel (Conditon oder Destination) ist der Kanal der Sysvar bzs des HSS.

Das ist die ganze kunst.
Ich möchte hier wirklich helfen, Michael. Aber ich tue mich wirklich schwer deinen Ausführungen zu folgen. Kannst du denn das nicht anhand eines einzelnen Beispieles vielleicht sogar mit Beispiel ReGa-Skript code einmal aufzeigen damit ich das reproduzierbar nachvollziehen kann? Das würde mir wirklich ungemein helfen denn ansonsten dauert es vmtl. noch eine Weile bis ich dann dazukomme mir eigene Beispiele auszudenken die das Problem und die Reparatur/Konsistenzprüfung reproduzieren helfen.

Re: Änderung SV-Kanalzuordnung zerstört Programme

Verfasst: 06.06.2019, 13:45
von Black
so damit es lesbarer bleibt, der Code aus PASS 1 aus der automatischen codegenerierung des SDV:

mal auf die schnelle probiert, ist lauffähig. Man könnte optimieren von hand, weiss ich , wie gesagt, aus der automatischen generierung.
das soll funktionieren, muss net toll aussehen, ich wollt für die zeilen auch keinen schönheitspreis gewinnen

Code: Alles auswählen

boolean infoAll  =  false;
boolean infotip =   true;
boolean corr =      false;
boolean infoshown= false;
string sPRG;
string sSDest;
string sCond;
string sSCond;
object oPRG;
object oRule;
object oCond;
object oSCond;
object oDest;
object oSDest;
object oOBJ;
integer iRule=1;
integer SaveID=0;
integer nErr=0;
integer nCorr=0;
integer nPRG=0;
integer x=0;
string sCorr=""; if (corr) {sCorr= " --> korrigiert"; }
string sProgInfo="";
string slinie= "----------------------------------------------------------------";
boolean isVarDP;
boolean isHssDP;
WriteLine ("ProgrammAnalyse Konsistenz ConditionChannel und DestinationChannel");
WriteLine ("Black in Juni 2019");
WriteLine (slinie);
foreach (sPRG,dom.GetObject (ID_PROGRAMS).EnumIDs () ){
  oPRG= dom.GetObject (sPRG);
  if (oPRG) {
    infoshown= false;
    sProgInfo= "Analyse Program: " # oPRG.Name () # " [ID: "# oPRG.ID () #"]";
    if (infoAll) {WriteLine (sProgInfo);}
    oRule= oPRG.Rule ();
    iRule=1;
    while (oRule){
        foreach (sCond, system.GenerateEnum (0,oRule.RuleConditions().Count()-1)) {
           oCond= oRule.RuleCondition (sCond.ToInteger () );
             foreach (sSCond, system.GenerateEnum (0,oCond.CndSingleCount ()-1)) {
                oSCond= oCond.CndSingleCondition (sSCond);
                  !- Hier sind wir in der Singlecondition
                  !- Testen auf eine Systemvariable/HSS
                  if ((oSCond.LeftValType () == ivtSystemId) || (oSCond.LeftValType() == ivtObjectId)) {
                     oOBJ= dom.GetObject (oSCond.LeftVal () );
                     if (oOBJ) {
                        isVarDP = (oOBJ.Channel() == ID_ERROR) && ((oOBJ.Type() == OT_VARDP) || (oOBJ.Type() == OT_ALARMDP));
                        isHssDP = (oOBJ.Channel() != ID_ERROR) || (oOBJ.Type() == OT_HSSDP);
                        if (isVarDP && (oSCond.LeftValType () != ivtSystemId)) {
                           !- Es muss eine SystemVariable sein, ist aber keine
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- LeftValType muss ivtSystemId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSCond.LeftVal ();
                               oSCond.LeftValType (ivtSystemId);
                               oSCond.LeftVal (x);
                            }
                            infoshown=true;
                        }
                        elseif (isHssDP && (oSCond.LeftValType () != ivtObjectId)) {
                           !- Es muss ein HSSDP sein, ist aber kein
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- LeftValType muss ivtObjectId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSCond.LeftVal ();
                               oSCond.LeftValType (ivtObjectId);
                               oSCond.LeftVal (x);
                           }
                           infoshown=true;
                        }
                        if (isHssDP && (oSCond.ConditionChannel () != oOBJ.Channel () )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- ConditionChannel() indiziert nicht Object (LeftVal).Channel ()" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              oSCond.ConditionChannel (oOBJ.Channel ());
                           }
                           infoshown=true;
                        }
                        elseif ((!isHssDP) && (oSCond.ConditionChannel () != ID_ERROR )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- ConditionChannel() indiziert nicht ID_ERROR" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              oSCond.ConditionChannel (ID_ERROR);
                           }
                           infoshown=true;
                        }
                     }
                  }
             } !- Klammer foreach Single Condition
        } !- Klammer Foreach Condition
        oDest= oRule.RuleDestination ();
        if (oDest) {
           foreach (sSDest, system.GenerateEnum (0,oDest.DestSingleCount() -1)) {
              oSDest= oDest.DestSingleDestination (sSDest.ToInteger () );
              if (oSDest) {
                  if ((oSDest.DestinationParam() == ivtSystemId) || (oSDest.DestinationParam() == ivtObjectId)) {
                     oOBJ= dom.GetObject (oSDest.DestinationDP () );
                     if (oOBJ) {
                        isVarDP = (oOBJ.Channel() == ID_ERROR) && ((oOBJ.Type() == OT_VARDP) || (oOBJ.Type() == OT_ALARMDP));
                        isHssDP = (oOBJ.Channel() != ID_ERROR) || (oOBJ.Type() == OT_HSSDP);
                        if (isVarDP && (oSDest.DestinationParam () != ivtSystemId)) {
                           !- Es muss eine SystemVariable sein, ist aber keine
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SDEST-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationParam muss ivtSystemId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSDest.DestinationDP ();
                               oSDest.DestinationParam (ivtSystemId);
                               oSDest.DestinationDP (x);
                            }
                            infoshown=true;
                        }
                        elseif (isHssDP && (oSDest.DestinationParam () != ivtObjectId)) {
                           !- Es muss ein HSSDP sein, ist aber kein
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SDEST-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationParam muss ivtObjectId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSDest.DestinationDP ();
                               oSDest.DestinationParam (ivtObjectId);
                               oSDest.DestinationDP (x);
                            }
                            infoshown=true;
                        }
                        if (isHssDP && (oSDest.DestinationChannel () != oOBJ.Channel () )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationChannel() indiziert nicht Object (LeftVal).Channel ()" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              x= oSDest.DestinationDP ();
                              oSDest.DestinationChannel (oOBJ.Channel ());
                              oSDest.DestinationDP (x);
                           }
                           infoshown=true;
                        }
                        elseif ((!isHssDP) && (oSDest.DestinationChannel() != ID_ERROR )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationChannel() indiziert nicht ID_ERROR" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              x= oSDest.DestinationDP ();
                              oSDest.DestinationChannel (ID_ERROR);
                              oSDest.DestinationDP (x);
                           }
                           infoshown=true;
                        }
                     }
                  }
              } !- if oSDest
           }  !- Foreach
        } !- oDest
      oRule= oRule.RuleSubRule ();
      iRule=iRule+1;
   } !- While Rule
  } !- if oPRG

}
  if (infoshown ) {WriteLine (slinie);}
!-**************************************************************************************************************************************
!-}
WriteLine ("Geprüft: " # dom.GetObject (ID_PROGRAMS).Count () # " Programme");
if (nErr==0) {
  WriteLine ("Keine Aufälligkeiten festgestellt");
} else {
  WriteLine ("Dabei wurden " # nErr # " Inkonsistenzen gefunden in " # nPRG # " Programmen");
  Write ("Von diesen " # nErr # " Inkonsistenzen wurden ");
  if (nCorr==0) {WriteLine ("keine korriert");} else {WriteLine (nCorr # " korrigiert"); }
}
gruss, Black

Re: Änderung SV-Kanalzuordnung zerstört Programme

Verfasst: 06.06.2019, 14:23
von jmaus
Danke Michael, das hilft ungemein weiter. Werde ich dann mal versuchen einzusetzen bzw,. zu analysieren um das Problem direkt in ReGa/WebUI bereits abzufangen.

Re: Änderung SV-Kanalzuordnung zerstört Programme

Verfasst: 06.06.2019, 19:12
von koppenho
Hypnos hat geschrieben:
06.06.2019, 08:48
koppenho hat geschrieben:
05.06.2019, 19:35
Wenn die Programme, bzw. die Kodierung der WebUI-Konditionen eine Kanalzuordnung ignorieren, würde nichts passieren. Nach dem Löschen einer Kanalzuordnung sollte es in der WebUI so aussehen, als ob es nie eine Zuordnung gegeben hätte. Eine WebUI-Programm sollte dann eine einfache SV referenzieren.
Das ist aber auch gefährlich. Wenn ich eine Systemvariable lösche und deren Bedingung und Logik damit automatisch aus allen Programmen entfernt wird, ändert sich ja damit die Logik der Programme.
Löschen einer SV haben wir noch noch gar nicht betrachtet. Wir diskutierten bisher nur über die Änderung/Löschung einer Kanalbindung bei dem die SV erhalten bleibt.
Hypnos hat geschrieben:
06.06.2019, 08:48
Da sollte zumindest eine auffällige Warnung angezeigt werden.
Die Sichere Variante wäre es einfach das Löschen zu verbieten, solange eine Systemvariable noch in einem Programm enthalten ist.
Dem kann ich nur zustimmen.

Es gibt noch eine Situation, die wir bisher übersehen haben. Was passiert mit der Kanalbindung wenn das zum Kanal gehörende Gerät gelöscht wird? Erwarten würde ich, dass die Bindung entfernt wird und die SV ansonsten unversehrt zurückbleibt.

Re: Änderung SV-Kanalzuordnung zerstört Programme

Verfasst: 06.06.2019, 20:14
von Black
@koppenho

beim löschen bleibt bekannterweise ein Geisterbezug stehen. Die aktuelle raspberrymatik sollte (konjunktiv) dieses bei regastart aber glattziehen können (ansonsten der SDV Menüpunkt CheckChannel Sysvar).

Nach diesem Lauf zieht Cond-Dest Channel die restlichen bezüge wieder grade.

Black