Var_ToAreaOffs32

Copia el valor de una variable en un área de memoria

Esta función copia el valor de la variable Var a la dirección definida por iArea y con un offset de 32 bits diOffs. El tamaño de la variable asignada a Var determina por tanto el número de datos a copiar.

Parámetros

Entrada

Var (ANY_SIMPLE_NOT_BOOL)

Variable cuyo valor va a ser copiado

Salida

iArea (INT)

Valor para el área de memoria1)

Si iArea es una variable, debe tener asignada un área de memoria de tipo DT o FL. Se debe comprobar esta asignación utilizando una instrucción que incorpore las funciones de la librería FP Tool Library: Is_AreaDT o Is_AreaFL.

diOffs (DINT)

Offset para la dirección inicial de 32 bits del área de memoria

Observaciones

Los valores para iArea y diOffs pueden ser proporcionados a través de la función GetPointer32. El valor para iArea tiene que estar en un área DT o FL.

Valor para el área de memoria1)

Áreas de memoria de relés

Disponible solamente en el FP7.

SYS_MEMORY_AREA_R

SYS_MEMORY_AREA_L

SYS_MEMORY_AREA_X

SYS_MEMORY_AREA_Y

Banderas

SYS_MEMORY_AREA_WR

Valor de preselección del temporizador/contador

SYS_MEMORY_AREA_SV

Valor actual del temporizador/contador

SYS_MEMORY_AREA_EV

Registros de datos

SYS_MEMORY_AREA_DT

Relés de enlace

SYS_MEMORY_AREA_WL

Registros de enlace

SYS_MEMORY_AREA_LD

Ficheros de datos

SYS_MEMORY_AREA_FL

Registros de entrada

SYS_MEMORY_AREA_WX

Registros de salida

SYS_MEMORY_AREA_WY

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
		bStart: BOOL:=FALSE;
			(*activation*)
		g_arArrayOut1: ARRAY [0..5] OF REAL:=[6(0.0)];
			(*data field with cumulative sum*)
		g_arArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
			(*data field 1*)
		CalcSum_Real1: CalcSum_Real;
			(*instance of user function block*)
		@'': @'';
	END_VAR

Cuerpo de la POU

Cuando la variable bStart pasa a TRUE, se ejecuta el bloque de función CalcSum_REAL. Calcula la suma de todos los elementos del campo g_arArrayIn1 y escribe el resultado en la variable g_arArrayOut1. De manera que el primer elemento de g_arArrayOut1 recibe el primer elemento de g_arArrayIn1. El segundo elemento de g_arArrayOut1 contiene las sumas del primer y del segundo elemento de g_arArrayIn1.El tercer elemento de g_arArrayOut1 contiene las sumas del primer, del segundo y del tercer elemento de g_arArrayIn1....

Tener en cuenta que el bloque de función CalcSum_REAL puede calcular el resultado independientemente del área de memoria en el que almacenen los datos y del número de elementos o del tamaño de los campos de datos. Si se desea asignar una dirección al campo de datos, este se tiene que declarar en la lista de variables globales. Ambos campos deben procesar el mismo número de elementos.

Cuerpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 7 ;
        NETWORK_BODY
B(B_VARIN,,g_arArrayIn1,10,4,12,6,);
B(B_VARIN,,g_arArrayOut1,10,5,12,7,);
B(B_F,GetPointer32!,,12,4,19,6,,?D?C);
B(B_F,GetPointer32!,,12,5,19,7,,?D?C);
B(B_CONTACT,,bStart,5,3,7,5,);
B(B_FB,CalcSum_Real!,CalcSum_Real1,19,2,29,7,,?BEN?Bp32InputArray?Bp32OutputArray?AENO);
L(7,4,19,4);
L(1,4,5,4);
L(1,0,1,7);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Ejemplo: programación del bloque de función de usuario CalcSum_REAL

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_INPUT
		p32ToDatafield: POINTER32;
			(*pointer on the data field for calculation*)
	END_VAR
	VAR_OUTPUT
		rSum: REAL:=0.0;
			(*calculate sum*)
	END_VAR
	VAR
		Sum_Operand: REAL:=0.0;
			(*inernal calculation of the sum*)
		In_Offs_Intern: DINT:=0;
			(*internal offset*)
		Idx: INT:=0;
			(*index*)
	END_VAR

Cuerpo LD

  • Redes 1–5:

    Aquí se realizan las inicializaciones para el cálculo de la suma.

  • Red 6:

    Copia el valor de un elemento del campo de datos de entrada.

  • Red 7:

    Añade este valor a la suma actual.

  • Red 8:

    Copia el valor actual de la suma en un elemento del campo de datos de salida.

  • Red 9:

    Se calcula el offset para siguiente elemento.

  • Red 10:

    Salto a la etiqueta (red 6) hasta que se procesen todos los elementos.

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_F,Is_AreaDT!,,12,0,18,2,,?D?C);
B(B_VARIN,,p32ToDatafield.iArea,9,1,11,3,);
B(B_F,Is_AreaFL!,,12,3,18,5,,?D?C);
B(B_F,@AND-2!,,19,1,24,4,NN,?D?D?C);
B(B_F,E_MOVE!,,29,0,35,4,,?DEN?D?AENO?C);
B(B_VARIN,,FALSE,27,2,29,4,);
B(B_VAROUT,,ENO,35,2,37,4,);
B(B_RETURN,,,36,1,38,3,);
L(12,2,12,4);
L(12,1,12,2);
L(11,2,12,2);
L(18,1,18,2);
L(18,2,19,2);
L(18,3,18,4);
L(18,3,19,3);
L(35,2,36,2);
L(24,2,29,2);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 2 ;
        NETWORK_BODY
B(B_VARIN,,p32ToDatafield.diOffset,18,0,20,2,);
B(B_VAROUT,,In_Offs_Intern,20,0,22,2,);
L(1,0,1,2);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 2 ;
        NETWORK_BODY
B(B_VARIN,,0.0,18,0,20,2,);
B(B_VAROUT,,rSum,20,0,22,2,);
L(1,0,1,2);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 2 ;
        NETWORK_BODY
B(B_VARIN,,1,18,0,20,2,);
B(B_VAROUT,,Idx,20,0,22,2,);
L(1,0,1,2);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL := Lbl1: ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 4 ;
        NETWORK_BODY
B(B_F,AreaOffs32_ToVar!,,17,0,27,4,,?DiArea?DdiOffs?C@'Var');
B(B_VARIN,,p32ToDatafield.iArea,15,1,17,3,);
B(B_VAROUT,,Sum_Operand,27,1,29,3,);
B(B_VARIN,,In_Offs_Intern,15,2,17,4,);
L(1,0,1,4);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_F,@ADD-2!,,17,0,22,3,,?D?D?C);
B(B_VARIN,,rSum,15,0,17,2,);
B(B_VARIN,,Sum_Operand,15,1,17,3,);
B(B_VAROUT,,rSum,22,0,24,2,);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_F,Size_Of_Var!,,17,1,24,3,,?D?C);
B(B_VARIN,,Sum_Operand,15,1,17,3,);
B(B_F,@ADD-2!,,32,0,37,3,,?D?D?C);
B(B_VARIN,,In_Offs_Intern,30,0,32,2,);
B(B_VAROUT,,In_Offs_Intern,37,0,39,2,);
B(B_F,INT_TO_DINT!,,24,1,32,3,,?D?C);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_F,@LT-2!,,13,1,18,4,,?D?D?C);
B(B_VARIN,,p32ToDatafield.diSize,11,2,13,4,);
B(B_F,E_ADD-2!,,22,0,28,5,,?DEN?D?D?AENO?C);
B(B_VARIN,,1,20,3,22,5,);
B(B_VAROUT,,Idx,28,2,30,4,);
B(B_VARIN,,Idx,20,2,22,4,);
B(B_JUMP,,Lbl1,28,1,30,3,);
B(B_VARIN,,Idx,3,1,5,3,);
B(B_F,INT_TO_DINT!,,5,1,13,3,,?D?C);
L(18,2,22,2);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY
Temas relacionados

Se pueden obtener más ejemplos desde el directorio "Ejemplos" del CD de instalación del FPWIN :

Modificado el: 2021-07-15Comentarios sobre esta páginaPanasonic hotline