Weiterhin wird die Änderung des Inhalts noch nicht einmal geloggt, selbst wenn für die Sysvar das Logging aktiviert wurde.
Und das ist wirklich super, da genau das (das Nicht-Triggern) einen Teufelskreis vermeiden kann.
Moderator: Co-Administratoren
Jedenfalls prinzipiell. Nur eben nicht bei einer Nur-Lesen-Anweisung und eben nicht bei .Value()
Hallo in die Runde.jp112sdl hat geschrieben: ↑10.05.2021, 14:00Genau wie bei State() auch.
Leere Klammer .Value() = lesen
Befüllte Klammer .Value(34) = schreibe 34
Stimmt, Variable() gibt es ja auch noch.
Ich nutze aber auch grundsätzlich .Value() zum Prüfen, weil ich nicht will, dass jedes Mal die Aktoren (auch nicht die netzbetriebenen) unnütz angefunkt werden.
Wie auch?Sternthaler hat geschrieben: ↑24.02.2023, 23:29Es gibt noch einen weiteren Unterschied:
- Value("xx") hinterlässt an einer SV keinen Timestamp().
Code: Alles auswählen
var tmpS0 = "0Test"; !! Name einer SV die zum Testen angelegt sein muss.
var tmpS1;
var tmpS2;
var tmpS31 = "Inhalt 1 / geschrieben mit Variable";
var tmpS32 = "Inhalt 2 / geschrieben mit State";
WriteLine("START");
tmpS1 = dom.GetObject(tmpS0);
if (! tmpS1) {
WriteLine(":" # tmpS0 # ": nicht gefunden");
} else {
WriteLine("Mach mal um :" # system.Date("%F %X") # ":");
WriteLine("");
tmpS2 = tmpS1.Variable();
WriteLine(" Per Variable() gelesen :" # tmpS2 # ":");
tmpS2 = tmpS1.Value();
WriteLine(" Per Value() gelesen :" # tmpS2 # ":");
tmpS2 = tmpS1.State();
WriteLine(" Per State() gelesen :" # tmpS2 # ":");
WriteLine(" Timestamp :" # tmpS1.Timestamp() # ":");
WriteLine("");
WriteLine("Schreibe etwas mit Variable()");
tmpS1.Variable(tmpS31);
tmpS2 = tmpS1.Variable();
WriteLine(" Per Variable() gelesen :" # tmpS2 # ":");
tmpS2 = tmpS1.Value();
WriteLine(" Per Value() gelesen :" # tmpS2 # ":");
tmpS2 = tmpS1.State();
WriteLine(" Per State() gelesen :" # tmpS2 # ":");
WriteLine(" Timestamp :" # tmpS1.Timestamp() # ":");
WriteLine("");
WriteLine("Schreibe etwas mit State()");
tmpS1.State(tmpS32);
tmpS2 = tmpS1.Variable();
WriteLine(" Per Variable() gelesen :" # tmpS2 # ":");
tmpS2 = tmpS1.Value();
WriteLine(" Per Value() gelesen :" # tmpS2 # ":");
tmpS2 = tmpS1.State();
WriteLine(" Per State() gelesen :" # tmpS2 # ":");
WriteLine(" Timestamp :" # tmpS1.Timestamp() # ": Diese Zeit merken");
}
WriteLine("ENDE");
Das sind nur optische Auswirkungen. Wichtiger ist, die Auswirkung in der ReGa zu beachten. Ist diese Systemvariable als Trigger in irgendeinem Programm hinterlegt und man möchte NICHT (z.B. für Testzwecke), dass das Programm durch die Änderung der Variable getriggert wird, dann kann man der Variable den Inhalt mit .Variable() unterschieben, ohne dass die ReGa drauf reagiert. Es wird auch kein Zeitstempel gesetzt.Sternthaler hat geschrieben: ↑25.02.2023, 20:32Jetzt zeigt Timestamp() die oben ausgegebene Ausführungszeit.