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.
Entrada
Área inicial de la tabla de datos
Área final de la tabla de datos
Salida
Valor máximo
Posición del valor máximo
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.
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
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
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
Cuando la variable bStart se encuentra a TRUE, se ejecuta la función.
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
IF bStart then
FP_DATA_MAX_POS(s1_Start := adiDataField[0],
s2_End := adiDataField[4],
d1_Max => diOutputMax,
d2_Pos => diOutputPos);
END_IF;