Proporciona información sobre el puntero
La función GetPointer proporciona información sobre el puntero en una DUT predefinida de tipo POINTER que puede ser utilizada posteriormente por funciones o por bloques de función. Con esta información y las correspondientes funciones de manejo de punteros, las funciones y los bloques de funciones pueden leer o escribir directamente desde/en áreas de datos externas.
Entrada
La variable de entrada puede ser de cualquier tipo y debe estar asignada a una de las siguientes áreas de memoria DT, FL o Y.
Salida
Información del puntero de la variable de entrada.
Las funciones y los bloques de funciones de usuario pueden utilizar la siguiente información:
El elemento iSize ayuda a determinar el número de valores, es decir, (número de elementos = Pointer.iSize / Size_Of_Var (DataElement))
Con las funciones AreaOffs_ToVar y Var_ToAreaOffs y con los elementos iArea y iOffset, se pueden leer y escribir directamente desde/ en áreas de datos externas.
Con las instrucciones del manejo de memoria Is_AreaDT o Is_AreaFL y con las instrucciones para el manejo de direcciones AdrDT_Of_Offs o AdrFL_Of_Offs, también se pueden utilizar las instrucciones FP con las áreas de datos externas.
La variable de entrada tiene que estar en el área de memoria DT o FL por las siguientes razones:
porque las instrucciones Is_AreaDT o Is_AreaFL y las instrucciones AdrDT_Of_Offs o AdrFL_Of_Offs solo trabajan con estas áreas de memoria.
porque las instrucciones de punteros AreaOffs_ToVar y Var_ToAreaOffs trabajan correctamente solamente dentro de estas áreas de memoria.
Esta instrucción sustituye a la instrucción AreaOffs_OfVar.
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU. Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.
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
Esta función inicializa los datos apuntados por prArray con los valores 10, 20, 30...
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU.Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.
(* 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 función de usuario FunCalcStatistics1 calcula las estadísticas a partir de los valores apuntados por prArray. Internamente la instrucción AreaOffs_ToVar se utiliza para leer las áreas de datos externos.
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU.
Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.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);