GetPointer32

Liefert Zeigerinformationen

Die Funktion GetPointer32 enthält die 32-Bit-Zeigerinformationen von Variablen in einem strukturierten Datentyp (SDT) des Datentyps POINTER32. 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.

Parameter

Eingang

Unnamed input (ANY)

Die Eingangsvariable eines beliebigen Datentyps muss sich im Speicherbereich DT, FL oder Y befinden.

Ausgang

Unnamed output (POINTER32)

Die Zeigerinformation der Eingangsvariable.

Anmerkungen

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 AreaOffs32_ToVar und Var_ToAreaOffs32 und mit den Zeigerelementen iArea und diOffset 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_Offs32 oder AdrFL_Of_Offs32 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_Offs32 oder AdrFL_Of_Offs32 können nur für diese Speicherbereiche verwendet werden.

  • die Zeigerfunktionen AreaOffs32_ToVar und Var_ToAreaOffs32 können nur in diesen Speicherbereichen korrekt ausgeführt werden.

Diese Funktion ersetzt die Funktion AreaOffs_OfVar.

Beispiel

POE-Kopf

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:=[10.0,20.0,30.0];
		diNumberOfElements: DINT:=0;
		rSum: REAL:=0.0;
		rMean: REAL:=0.0;
		rDeviation: REAL:=0.0;
	END_VAR

KOP-Rumpf

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

Beispiel: FunCalcStatisticsInitArray1

POE-Kopf

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.

ST-Rumpf

(* Berechnet die Anzahl der Elemente aus dem Zeigerelement diSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Kopiert Offset in einen internen Offset, der sich später erhöhen lässt*)
diOffset:=prArray.diOffset;
(* Schleife durch alle Elemente *)
for di := 1 to diNumberOfElements do
(* Berechnet das aktuelle Element di*10.0 *)
    rCurrentElement:=DINT_TO_REAL(di)*10.0;
(* Schreibt das aktuelle Element zu den Daten, auf die der Zeiger verweist *)
    Var_ToAreaOffs32(Var := rCurrentElement, 
                     iArea => prArray.iArea, 
                     diOffs => diOffset);
(* Erhöht den Offset bis zum nächsten EIement *)
    diOffset:=diOffset + INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;

FunCalcStatistics1

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.

ST-Rumpf

(* Berechnet die Anzahl der Elemente aus dem Zeigerelement iSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Kopiert Offset in einen internen Offset, der sich später erhöhen lässt*)
diOffset:=prArray.diOffset;
(* Schleife durch alle Elemente *)
for di := 1 to diNumberOfElements do
(* Liest das aktuelle Element aus den Daten ein, auf die der Zeiger referenziert *)
    rCurrentElement:=AreaOffs32_ToVar(iArea := prArray.iArea, diOffs := diOffset);
(* Berechnet die Summe und die Summe der Quadrate *)
    rSum:=rSum+rCurrentElement;
    rSquareSum:=rSquareSum+rCurrentElement*rCurrentElement; 
(* Erhöht den Offset bis zum nächsten EIement *)
    diOffset:=diOffset+INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* Abschließende Berechnung der zusätzlichen statistischen Parameter *)
rNumberOfElements:=DINT_TO_REAL(diNumberOfElements);
rMean:=rSum/rNumberOfElements;
rDeviation:=SQRT(1.0/(rNumberOfElements-1.0)*rSquareSum);

Letzte Änderung am: 2021-07-28Feedback zu dieser SeitePanasonic Hotline