TIA Anwendungsfälle für Referenzen

PLC1

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,


ich habe mich soeben gefragt, welche Anwendungsfälle für Referenzen existieren. So wie ich es Verstanden habe, ersetzen Referenzen die indirekte Adressierung (Pointer) bei optimierten Bausteinen. Wieso geht man den Umweg über eine Referenz, wenn die Variable direkt symbolisch angesprochen werden kann? Gibt es hierbei vielleicht irgendwelche Vorteile bezüglich der Speicherbelegung zur Laufzeit?
Hier ein kleiner SCL-Auszug, welcher die gleiche Aufgabe mit und ohne den Einsatz einer Referenz ausführt.


#Result := #a + #b; //Ergebnis = 15
"Referenz_Ergebnis"."Ergebnis 1" := #Result; //Ergebnis in DB schreiben
#MyRefInt:= REF(#a);
#MyRefInt^ := 3;
#Result := #a + #b; //Ergebnis = 13
"Referenz_Ergebnis"."Ergebnis 2" := #Result; //Ergebnis in DB Schreiben
#a := 5; //Variable a rücksetzen




#Result := #a + #b; //Ergebnis = 15
"Referenz_Ergebnis"."Ergebnis 3" := #Result;
#a := 3; //entspricht obiger Referenzoperation
#Result := #a + #b; // Ergebnis = 13
"Referenz_Ergebnis"."Ergebnis 4" := #Result;
#a := 5;


Für eure Erfahrungen und Meinungen wäre ich sehr dankbar.


Gruß
PLC1
 
Moin,
also dein Beispiel ist so natürlich sinnfrei, das hast du richtig erkannt. Nützlich sind die Referenzen, wenn du Funktionen schreibst die möglichst Variabel eingesetzt werden sollen. Also einen Variant als InOut bekommen der bspw. unterschiedliche UDTs handeln soll. Um diese unterschiedlichen UDTs zu handhaben musst du als erstes eine Typprüfung machen "TypeOf(meinInOutVariant)" und dann je nach Typ-Ergebnis deinen Code bearbeiten.
Und hier war es dann ohne Referenzen ein wenig bucklig - denn du musstest via VariantGet(meinInOutVariant) dir den InOut erstmal in eine lokale laden, konntest dann symbolisch mit dieser lokalen arbeiten und musstest abschließend diese lokale wieder mit VariantPut(meinInOutVariant) auf die InOut zurückkopieren.
Dieses hin- und herkopieren wird durch die Referenzen vereinfacht. Die Referenz ist in meinen Augen jetzt wie früher eine AT-Sicht nur dass die Verknüpfung zwischen Sicht und Variable nicht in der Bausteindeklaration erfolgt, sondern durch den ?= -Zuweisungsoperator. Nach dieser Zuweisung kannst du die Referenz symbolisch (mit dem Dereferenzierer ^) manipulieren und diese Manipulationen wirken direkt auf deine InOut.

Man kann aber auch einfach wie früher n verschiedene Bausteine schreiben, die je eine UDT verarbeiten können. :D
 
Zurück
Oben