Lire les informations du pointer
La fonction GetPointer permet d’obtenir les informations du pointeur dans un type de données structurées prédéfini (DUT) de type POINTER. 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.
Entrée
Variable d’entrée de tout type de données devant être placée dans la zone mémoire DT, FL ou Y.
Sortie
Informations du pointeur de la variable d’entrée.
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 AreaOffs_ToVar et Var_ToAreaOffs, et les éléments du pointeur iArea et iOffset, 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_Offs ou AdrFL_Of_Offs, 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_Offs ou AdrFL_Of_Offs fonctionnent uniquement avec ces zones mémoire.
Les instructions du pointeur AreaOffs_ToVar et Var_ToAreaOffs fonctionnent correctement dans ces zones de mémoire.
Cette instruction remplace l’instruction AreaOffs_OfVar.
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:=[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
Cette fonction initialise les données désignées par prArray avec valeurs croissantes de 10, 20, 30...
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.
(* 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;
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.
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.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);