FP_AVERAGE_BUFFER_DEFINE

Definir el área de buffer para mover los valores medios y totales

Esta instrucción FP especifica un buffer especial para calcular el valor medio y el total de todos los valores contenidos. La dirección inicial se establece con d_Start y el tamaño con n_Words. El buffer tiene una estructura particular, que se muestra en el ejemplo de programación, donde el número de elementos del array del último elemento iArrData corresponde al tamaño definido por n_words. Usar la instrucción FP_AVERAGE_BUFFER_WRITE para escribir en el buffer.

Parámetros

Entrada

n_Words (WORD, INT, UINT)

Especifica el tamaño del buffer

Valores: 1–30000

Salida

d_Start (WORD, INT, UINT)

Inicio del área de datos del buffer

Se recomienda utilizar un DUT definido por el usuario como se indica en el ejemplo de programación.

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • Si el valor especificado para un parámetro está fuera del rango permitido.

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • Si el valor especificado para un parámetro está fuera del rango permitido.

Ejemplo

DUT

Elementos de la DUT (Identificadores):

uiBufferSize

Tamaño del buffer

uiNumberOfStoredData

Nº de datos almacenados

diTotalValueOfStoredData

Suma total de datos almacenados

rMovingAverage

Promedio por desplazamiento de tomas

uiWritePointer

Posición del puntero de escritura

iArrData

Contiene los valores del buffer El número de valores enteros (10 en este ejemplo) debe ser igual al tamaño del buffer definido con iNumberOfIntegerValues.

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
		bDefine: BOOL:=FALSE;
		bWrite: BOOL:=FALSE;
		iCounter: INT:=0;
	END_VAR
	VAR CONSTANT
		iNumberOfIntegerValues: INT:=10;
			(*number of integers values must be equal to average buffer size*)
	END_VAR
	VAR
		dutAverageBufferInt10: DUT_FP_AVERAGE_BUFFER_INT_10;
			(*Average Buffer for integer numbers of size 10*)
	END_VAR

Cuerpo de la POU

Cuando la variable bDefine pasa a TRUE, se ejecuta la función.

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_F,FP_AVERAGE_BUFFER_DEFINE!,,13,2,28,6,,?DEN?Dn_Words?AENO?Cd_Start);
B(B_VARIN,,iNumberOfIntegerValues,11,4,13,6,);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,bDefine,4,1,6,3,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
L(1,2,4,2);
L(6,2,6,4);
L(6,4,13,4);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_CONTACT,,bWrite,2,1,4,3,);
B(B_CONTACT,,bDefine,6,1,8,3,N);
B(B_F,FP_AVERAGE_BUFFER_WRITE!,,14,2,28,6,,?DEN?D@'s'?AENO?Cd_Start);
B(B_VARIN,,sys_iRingCounter_2ms5,12,4,14,6,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,sys_bPulse1s,11,1,13,3,R);
L(1,2,2,2);
L(4,2,6,2);
L(8,2,11,2);
L(13,2,13,4);
L(13,4,14,4);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Cuerpo en ST

IF (bDefine) then
    FP_AVERAGE_BUFFER_DEFINE(n_Words := iNumberOfIntegerValues,
                             d_Start => Adr_Of_Var(dutAverageBufferInt10));
END_IF;

If (bWrite) AND NOT (bDefine) AND DF(sys_bPulse1s) then
    FP_AVERAGE_BUFFER_WRITE(s := sys_iRingCounter_2ms5,
                            d_Start => Adr_Of_Var(dutAverageBufferInt10));
End_if;

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