AreaOffs32_ToVar

Copia el contenido de una dirección con offset de 32 bits en una variable

Esta función copia en la variable Var, el número de palabras definido por el tamaño de la variable Var, desde la dirección determinada por iArea y el offset diOffs.

Parámetros

Entrada

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

Salida

Var (ANY_SIMPLE_NOT_BOOL)

Variable en la que se va a copiar el contenido de la dirección

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

Variables Globales

En la Lista de Variables Globales, se definen las variables a las que pueden acceder todas las POUs del proyecto.

Aquí se declaran las variables RealArrayIn1 y RealArrayIn2. Se declaran en áreas de memoria diferentes para ilustrar la eficiencia del bloque de función CalcSum_REAL. Las variables se podrían declarar igualmente en el cabecera de la POU del programa Program_CalcSums.

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

Cuerpo de la POU

Cuando la variable bSart pasa a TRUE, se ejecuta el bloque de función CalcSum_REAL. Calcula la suma de todos los elementos del array RealArrayIn1, de dos dimensiones y escribe el resultado en la variable RealSum1.

Cuerpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_FB,CalcSum_Real!,CalcSum_Real1,22,1,32,5,,?BEN?Bp32ToDatafield?AENO?ArSum);
B(B_VARIN,,g_arArrayIn1,13,3,15,5,);
B(B_VAROUT,,rRealSum1,32,3,34,5,);
B(B_F,GetPointer32!,,15,3,22,5,,?D?C);
B(B_COMMENT,,10.0 + 20.0 + 30.0 + 40.0 + 50.0 + 60.0,21,5,32,7,);
B(B_COMMENT,,= 210.0,33,5,38,6,);
B(B_COMMENT,,if (bStart == TRUE):,2,5,13,6,);
L(7,3,22,3);
L(1,3,5,3);
L(1,0,1,8);
        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

  • Red 1:

    Si el campo de datos proporcionado no está dentro del área DT ó FL, la salida ENO del bloque de función pasa a FALSE y finaliza la ejecución.

  • Red 2: 4:

    Se realizan las inicializaciones para el cálculo de la suma. Puesto que la variable de clase VAR_INPUT no se puede modificar directamente, se tiene que copiar la variable de entrada In_Offset en la variable interna In_Offs_intern.

    Consultar: Var_ToAreaOffs32

  • Red 5: 8:

    Lazo para realizar la suma.

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

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