FP_DATA_MAX_POS

Buscar el valor máximo en la tabla de datos

Esta instrucción FP determina el valor máximo y su posición en una tabla de datos.

Parámetros

Entrada

s1_Start (INT, DINT, UINT, UDINT, REAL, LREAL)

Área inicial de la tabla de datos

s2_End (INT, DINT, UINT, UDINT, REAL, LREAL)

Área final de la tabla de datos

Salida

d1_Max (INT, DINT, UINT, UDINT, REAL, LREAL)

Valor máximo

d2_Pos (DINT)

Posición del valor máximo

Observaciones

  • La entrada s1_Start especifica el área inicial de la tabla de datos, y s2_End el final. El valor mínimo se almacena en d1_Max y la posición (su dirección relativa) en d2_Pos.

  • La posición d2_Pos es la posición de la primera aparición del valor máximo respecto al comienzo de la tabla de datos.

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • si el área especificada utilizando el modificador índice supera el límite.

  • si s1_Start > s2_End

  • Si s1_Start y s2_End pertenecen a diferentes áreas de datos

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • si el área especificada utilizando el modificador índice supera el límite.

  • si s1_Start > s2_End

  • Si s1_Start y s2_End pertenecen a diferentes áreas de datos

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;
			(*activates the function*)
		adiDataField: ARRAY [0..4] OF DINT:=[2,3,222222,-333333,1];
		diOutputMax: DINT:=0;
			(*the maximum value of 
data_array; here: 222222*)
		diOutputPos: DINT:=0;
			(*the position of the
maximum value; here: 2*)
	END_VAR

Cuerpo de la POU

Cuando la variable bStart se encuentra 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_DATA_MAX_POS!,,12,1,22,6,,?DEN?Ds1_Start?Ds2_End?AENO?Cd1_Max?Cd2_Pos);
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_VARIN,,adiDataField[0],10,3,12,5,);
B(B_VARIN,,adiDataField[4],10,4,12,6,);
B(B_VAROUT,,diOutputMax,22,3,24,5,);
B(B_VAROUT,,diOutputPos,22,4,24,6,);
L(1,3,5,3);
L(7,3,12,3);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Cuerpo en ST

IF bStart then
    FP_DATA_MAX_POS(s1_Start := adiDataField[0], 
                    s2_End := adiDataField[4], 
                    d1_Max => diOutputMax, 
                    d2_Pos => diOutputPos);
END_IF;

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