GetPointer32

Proporciona información sobre el puntero

La función GetPointer32 proporciona información sobre el puntero de 32 bits en una DUT predefinida de tipo POINTER32 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.

Parámetros

Entrada

Unnamed input (ANY)

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

Unnamed output (POINTER32)

Información del puntero de la variable de entrada.

Observaciones

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 AreaOffs32_ToVar y Var_ToAreaOffs32 y con los elementos iArea y diOffset, 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_Offs32 o AdrFL_Of_Offs32, 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_Offs32 o AdrFL_Of_Offs32 solo trabajan con estas áreas de memoria.

  • porque las instrucciones de punteros AreaOffs32_ToVar y Var_ToAreaOffs32 trabajan correctamente solamente dentro de estas áreas de memoria.

Esta instrucción sustituye a la instrucción AreaOffs_OfVar.

Ejemplo

Cabecera de la POU

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

Cuerpo 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

Ejemplo: FunCalcStatisticsInitArray1

Cabecera de la POU

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.

Cuerpo en ST

(* 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;

FunCalcStatistics1

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.

Cuerpo en ST

(* 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);

Modificado el: 2021-07-15Comentarios sobre esta páginaLínea directa de Panasonic