GetPointer32

Lire les informations du pointer

La fonction GetPointer32 permet d’obtenir les informations du pointeur de 32 bits dans un type de données structurées prédéfini (DUT) de type POINTER32. Ces informations peuvent être utilisées par des fonctions ou des blocs fonctions. Ces informations du pointeur et les fonctions correspondantes permettent aux fonctions ou blocs fonctions de lire les données à partir de la zone d’adresses des données externes ou de les écrire.

Paramètres

Entrée

Unnamed input (ANY)

Variable d’entrée de tout type de données devant être placée dans la zone mémoire DT, FL ou Y.

Sortie

Unnamed output (POINTER32)

Informations du pointeur de la variable d’entrée.

Remarques

Les fonctions ou blocs fonctions définis par l’utilisateur peuvent utiliser ces informations de la façon suivante :

  • L’élément du pointeur iSize peut indiquer le nombre de valeurs (nombre d’éléments = Pointer.iSize / Size_Of_Var (DataElement))

  • Avec les fonctions du pointeur correspondantes AreaOffs32_ToVar et Var_ToAreaOffs32, et les éléments du pointeur iArea et diOffset, vous pouvez lire les données à partir de la zone d’adresses des données externes ou les écrire.

  • Avec les instructions de la zone mémoire Is_AreaDT ou Is_AreaFL et les instructions d’adresse AdrDT_Of_Offs32 ou AdrFL_Of_Offs32, vous pouvez également utiliser les instructions FP avec les zones d’adresses des données externes.

La variable d’entrée doit être dans la zone mémoire DT ou FL pour les raisons suivantes :

  • Les instructions de la zone mémoire Is_AreaDT ou Is_AreaFL et les instructions d’adresse AdrDT_Of_Offs32 ou AdrFL_Of_Offs32 fonctionnent uniquement avec ces zones mémoire.

  • Les instructions du pointeur AreaOffs32_ToVar et Var_ToAreaOffs32 fonctionnent correctement dans ces zones de mémoire.

Cette instruction remplace l’instruction AreaOffs_OfVar.

Exemple

En-tête du POU

Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.

	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

Corps en LD

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

Exemple : FunCalcStatisticsInitArray1

En-tête du POU

Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU.Le même en-tête de POU est utilisé pour tous les langages de programmation.

Corps en ST

(* Calcul du nombre d’éléments à partir de l’élément du pointeur diSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copie de l’offset vers un offset interne pouvant être incrémenté ultérieurement *)
diOffset:=prArray.diOffset;
(* Boucle sur tous les éléments *)
for di := 1 to diNumberOfElements do
(* Calcul de l’élément en cours di*10.0 *)
    rCurrentElement:=DINT_TO_REAL(di)*10.0;
(* Transmission de l’élément en cours aux données indiquées par le pointeur *)
    Var_ToAreaOffs32(Var := rCurrentElement, 
                     iArea => prArray.iArea, 
                     diOffs => diOffset);
(* Augmentation de l’offset de l’élément suivant *)
    diOffset:=diOffset + INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;

FunCalcStatistics1

La fonction FunCalcStatistics1, définie par l’utilisateur, calcule les statistiques à partir des valeurs désignées par prArray. L’instruction AreaOffs_ToVar est utilisée en interne à partir des zones d’adresses des données externes.

Corps en ST

(* Calcul du nombre d’éléments à partir de l’élément du pointeur iSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copie de l’offset vers un offset interne pouvant être incrémenté ultérieurement *)
diOffset:=prArray.diOffset;
(* Boucle sur tous les éléments *)
for di := 1 to diNumberOfElements do
(* Lecture de l’élément en cours à partir des données indiquées par le pointeur *)
    rCurrentElement:=AreaOffs32_ToVar(iArea := prArray.iArea, diOffs := diOffset);
(* Calcul de la somme et de la somme au carré *)
    rSum:=rSum+rCurrentElement;
    rSquareSum:=rSquareSum+rCurrentElement*rCurrentElement; 
(* Augmentation de l’offset de l’élément suivant *)
    diOffset:=diOffset+INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* Calcul final des paramètres statistiques supplémentaires *)
rNumberOfElements:=DINT_TO_REAL(diNumberOfElements);
rMean:=rSum/rNumberOfElements;
rDeviation:=SQRT(1.0/(rNumberOfElements-1.0)*rSquareSum);

Modifié le : 2021-08-09Commentaires sur cette pageAssistance téléphonique