Liefert Zeigerinformationen
Die Funktion GetPointer enthält die Zeigerinformationen von Variablen in einem strukturierten Datentyp (SDT) des Datentyps POINTER. Diese lassen sich von Funktionen oder Funktionsbausteinen verwenden. Mit diesen Zeigerinformationen und den entsprechenden Zeigerfunktionen können Funktionen und Funktionsbausteine einen externen Datenadressbereich direkt beschreiben oder aus diesem lesen.
Eingang
Die Eingangsvariable eines beliebigen Datentyps muss sich im Speicherbereich DT, FL oder Y befinden.
Ausgang
Die Zeigerinformation der Eingangsvariable.
Benutzerdefinierte Funktionen oder benutzerdefinierte Funktionsbausteine können Zeigerinformationen wie folgt verwenden:
Das Zeigerelement iSize kann die Anzahl der Werte angeben, d.h. (Anzahl der Elemente = Pointer.iSize / Size_Of_Var (DataElement))
Mit den entsprechenden Zeigerfunktionen AreaOffs_ToVar und Var_ToAreaOffs und mit den Zeigerelementen iArea und iOffset können Sie externe Datenadressbereiche direkt beschreiben oder aus diesen lesen.
Mit den Speicherbereichsbefehlen Is_AreaDT oder Is_AreaFL und mit den Adressbefehlen AdrDT_Of_Offs oder AdrFL_Of_Offs lassen sich auch FP-Befehle für die externen Datenadressbereich verwenden.
Die Eingangsvariable muss sich aus folgenden Gründen im Speicherbereich DT oder FL befinden:
die Speicherbereichsfunktionen Is_AreaDT oder Is_AreaFL und die Adressfunktionen AdrDT_Of_Offs oder AdrFL_Of_Offs können nur für diese Speicherbereiche verwendet werden.
die Zeigerfunktionen AreaOffs_ToVar und Var_ToAreaOffs können nur in diesen Speicherbereichen korrekt ausgeführt werden.
Diese Funktion ersetzt die Funktion AreaOffs_OfVar.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
VAR
arData: ARRAY [0..2] OF REAL:=[3(0.0)];
iNumberOfElements: INT:=0;
rSum: REAL:=0.0;
rMean: REAL:=0.0;
rDeviation: REAL:=0.0;
@'': @'';
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_COMMENT,,These functions show the write access to an input array by using the GetPointer32 function.ø^The input array arDara is initialized with [10.0~ 20.0~ 30.0],3,0,42,2,);
B(B_VARIN,,arData,6,4,8,6,);
B(B_F,FunCalcStatisticsInitArray1!,,15,3,28,6,,?DprArray);
B(B_F,GetPointer32!,,8,4,15,6,,?D?C);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_VARIN,,arData,6,4,8,6,);
B(B_F,GetPointer32!,,8,4,15,6,,?D?C);
B(B_VAROUT,,diNumberOfElements,29,4,31,6,);
B(B_F,FunCalcStatistics1!,,15,3,29,9,,?DprArray?AdiNumberOfElements?ArSum?ArMean?ArDeviation);
B(B_VAROUT,,rSum,29,5,31,7,);
B(B_VAROUT,,rMean,29,6,31,8,);
B(B_VAROUT,,rDeviation,29,7,31,9,);
B(B_COMMENT,,These functions show the read access from an input array using the GetPointer function.ø^Some statistical features are calculated from the input array arData [10.0; 20.0; 30.0],3,0,42,2,);
L(1,0,1,9);
END_NETWORK_BODY
END_NET_WORK
END_BODY
Diese Funktion initialisiert die Daten, auf die von prArray referenziert wird, mit den zunehmenden Werten 10, 20, 30...
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden.Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
(* Calculate the number of elements from the pointer member diSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copy the offset to an internal offset which can be increased later *)
diOffset:=prArray.diOffset;
(* Loop over all elements *)
for di := 1 to diNumberOfElements do
(* Calculate the current element di*10.0 *)
rCurrentElement:=DINT_TO_REAL(di)*10.0;
(* Write the current element to the data to which the pointer refers *)
Var_ToAreaOffs32(Var := rCurrentElement,
iArea => prArray.iArea,
diOffs => diOffset);
(* Increase the offset to the next element *)
diOffset:=diOffset + INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
Die benutzerdefinierte Funktion FunCalcStatistics1 berechnet aus den Werten, auf die von prArray referenziert wird, Statistiken. Intern wird die Funktion AreaOffs_ToVar dazu genutzt, aus den externen Datenadressbereichen zu lesen.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden.
Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.FunCalcStatistics1
(* Calculate the number of elements from the pointer member iSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copy the offset to an internal offset which can be increased later *)
diOffset:=prArray.diOffset;
(* Loop over all elements *)
for di := 1 to diNumberOfElements do
(* Read the current element from the data to which the pointer refers *)
rCurrentElement:=AreaOffs32_ToVar(iArea := prArray.iArea, diOffs := diOffset);
(* Calculate the sum and the square sum *)
rSum:=rSum+rCurrentElement;
rSquareSum:=rSquareSum+rCurrentElement*rCurrentElement;
(* Increase the offset to the next element *)
diOffset:=diOffset+INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* Final calculation of the additional statistical parameters *)
rNumberOfElements:=DINT_TO_REAL(diNumberOfElements);
rMean:=rSum/rNumberOfElements;
rDeviation:=SQRT(1.0/(rNumberOfElements-1.0)*rSquareSum);