TIA Ref TO: Wer kann es gut erklären?

Rappenberger

Level-2
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen,

wer kann denn gut erklären, oder anhand einem Anwendungsfall, wie das mit den Referenzen bei symbolischer Programmierung funktioniert ?
Ich habe es mir mal angeschaut, aber kann aktuell noch nicht genau verstehen wie es funktionieren soll.
Ist es ein mächtiger "Datentyp" ?

Vielen Dank für euere Mithilfe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen,

wer kann denn gut erklären, oder anhand einem Anwendungsfall, wie das mit den Referenzen bei symbolischer Programmierung funktioniert ?
Ich habe es mir mal angeschaut, aber kann aktuell noch nicht genau verstehen wie es funktionieren soll.
Ist es ein mächtiger "Datentyp" ?

Vielen Dank für euere Mithilfe

IMHO ist Ref(), Ref_to() und Variant, mit der mächtigste Typ/Funktionen in SCL, weil du damit (irgendwie) fast alles machen kannst (aber nicht unbedingt immer sinnvoll😁).

Du kannst dadurch auf z.B. unterschiedliche Daten oder Array Größen zugreifen und diese passend verarbeiten.
Variant nimmt halt erst einmal alles an (wie in VBA auch) und dann kann man entscheiden oder abfragen, was für Daten enthalten sind und passen verarbeiten. Da gehört natürlich dann noch mehr außen herum, aber dadurch kann man Programme oder z.B. Datenverarbeitungsfunktionen sehr flexible aufbauen.

Bsp. abhängig Array-Größe (z.B. verschieden Sensordaten / Typen) Daten verarbeiten

Code:
 VAR_IN_OUT
      Input_Data : Variant;
   END_VAR

VAR_TEMP
Ref_Struct_2byte : REF_TO "type2byte";
Ref_Struct_4byte : REF_TO "type4byte";
Ref_Struct_8byte : REF_TO "type8byte";
Ref_Struct_16byte : REF_TO "type16byte";
END_VAR



END_VAR

#Ref_Struct_2byte ?= #Input_Data;   //Input Data Typ Variant
#Ref_Struct_4byte ?= #Input_Data;


IF #Ref_Struct_2byte <> NULL THEN
 ;   //Verabeiten bei 2 Byte Struktur 1
ELSIF #Ref_Struct_4byte <> NULL THEN
 ;   //Verabeiten bei 4 Byte Struktur 1
ELSE
 ;
ENDIF
 
Eine Referenz ist ein "getypter" Pointer auf eine Variable eines bestimmten Datentyps, damit bereits während der Programmierung feststeht, auf was der Pointer zeigt. Dadurch kann symbolisch und typsicher auf Werte in dem referenzierten Datentyp zugegriffen werden. Besonders vorteilhaft, wenn die Referenz auf einen UDT (z.B. Struktur) zeigt - dann kann auf Variablen in dem UDT zugegriffen werden, weil der Compiler weiß worauf die Referenz zeigt und die Struktur (z.B. Offsets) des UDT kennt.
 
IMHO ist Ref(), Ref_to() und Variant, mit der mächtigste Typ/Funktionen in SCL, weil du damit (irgendwie) fast alles machen kannst (aber nicht unbedingt immer sinnvoll😁).

Du kannst dadurch auf z.B. unterschiedliche Daten oder Array Größen zugreifen und diese passend verarbeiten.
Variant nimmt halt erst einmal alles an (wie in VBA auch) und dann kann man entscheiden oder abfragen, was für Daten enthalten sind und passen verarbeiten. Da gehört natürlich dann noch mehr außen herum, aber dadurch kann man Programme oder z.B. Datenverarbeitungsfunktionen sehr flexible aufbauen.

Bsp. abhängig Array-Größe (z.B. verschieden Sensordaten / Typen) Daten verarbeiten

Code:
 VAR_IN_OUT
      Input_Data : Variant;
   END_VAR

VAR_TEMP
Ref_Struct_2byte : REF_TO "type2byte";
Ref_Struct_4byte : REF_TO "type4byte";
Ref_Struct_8byte : REF_TO "type8byte";
Ref_Struct_16byte : REF_TO "type16byte";
END_VAR



END_VAR

#Ref_Struct_2byte ?= #Input_Data;   //Input Data Typ Variant
#Ref_Struct_4byte ?= #Input_Data;


IF #Ref_Struct_2byte <> NULL THEN
 ;   //Verabeiten bei 2 Byte Struktur 1
ELSIF #Ref_Struct_4byte <> NULL THEN
 ;   //Verabeiten bei 4 Byte Struktur 1
ELSE
 ;
ENDIF


Danke!
Wäre es damit auch möglich einen Baustein zu definieren der einen Sensor liest, unabhängig ob es ein Binärer oder ein IOLink Sensor ist mit einer Datenstruktur? Der Anwender muss quasi meinen Baustein nur mit Input Beschalten.

Folgender Gedanke:

VAR_IN
SensorData: VARIANT
END_VAR;

VAR_TEMP
Ref_Bool: REF_TO "BOOL"; //Auswertung bool
Ref_Struct: REF_TO "UDT_SENSOR"; //Sensor Daten (2 Byte Messwert, und signale)
END_VAR;

Ref_Bool ?= #Input_Data; //Input Data Typ Variant
Ref_Struct ?= #Input_Data;

IF RefstructRef_Bool <> NULL THEN
dbbitsensor:=bool sensor
ELSIF REFstruct <> NULL THEN
sensorstruct:=udt sensor
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, solches sollte damit möglich sein.

Du prüfst ja die Übergabeparameter ab, ob diese so vorliegen (bzw. angelegt werden können) wie erwartet und dadurch kann man entscheiden, wie man mit den Daten dann weiter verfährt.
Also es wird geprüft ob der Übergabeparameter (Variant) sich so anlegen lässt/ rein passt / initialisieren lässt o.ä., wenn dies möglich ist, ist der Rückgabewert RefstructRef_Bool <> NULL. (Jetzt mal so aus dem Kopf erklärt).

Wie in Deinem Beispiel, wenn die Prüfung ob der Referenzierte Bereich ein Bit (oder Sensor Struktur / Type Bit) ist, dann Verarbeitung A.
Wenn Bereich ein Typ Sensor_Variante_IOL ist dann Verarbeitung Sensor IO-Link und wenn der Bereich ein Typ Sensor_Variante_CAM ist dann Verarbeitung Sensor ist Kamera.
 
Ja, solches sollte damit möglich sein.

Du prüfst ja die Übergabeparameter ab, ob diese so vorliegen (bzw. angelegt werden können) wie erwartet und dadurch kann man entscheiden, wie man mit den Daten dann weiter verfährt.
Also es wird geprüft ob der Übergabeparameter (Variant) sich so anlegen lässt/ rein passt / initialisieren lässt o.ä., wenn dies möglich ist, ist der Rückgabewert RefstructRef_Bool <> NULL. (Jetzt mal so aus dem Kopf erklärt).

Wie in Deinem Beispiel, wenn die Prüfung ob der Referenzierte Bereich ein Bit (oder Sensor Struktur / Type Bit) ist, dann Verarbeitung A.
Wenn Bereich ein Typ Sensor_Variante_IOL ist dann Verarbeitung Sensor IO-Link und wenn der Bereich ein Typ Sensor_Variante_CAM ist dann Verarbeitung Sensor ist Kamera.
Super Danke. Gibt es irgendwo eine Übersicht, über die ganzen Befehle mit Referencen, IS NULL, NULL, EQ_TYPE, etc. pp ???
 
Zurück
Oben