Interpolación lineal de valores DINT discretos
La función asocia el valor y a la posición x realizando una interpolación lineal basada en los puntos de referencia por vecindad Pw(xw, yw) y Pw+1(xw+1, yw+1). En este ejemplo, w y x son los puntos de referencia más próximos, menor y mayor respectivamente, que la entrada x. La función conecta los puntos de referencia individuales, el inferior más cercano y el superior más cercano, traza la recta que pasa por esos dos puntos y calcula el valor de salida y que pasa por esa recta para un valor de entrada x.
Entrada
Activación de la función (si EN = TRUE, la función se ejecuta en cada ciclo de scan)
Valor de entrada x
Aplicar a esta entrada el primer elemento de la DUT definida por el usuario, esto es, el número de valores xy. Véase más abajo la descripción de la estructura de la DUT.
Salida
ENO se pone a TRUE una vez ejecutada la instrucción. De gran utilidad cuando se conectan bloques de funciones en cascada a través de la entrada EN.
Valor de salida y
En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción FP7 correspondiente: FP_SCALE Realizar un escalado de valores discretos
La función se puede utilizar para:
linealizar valores de medida, por ejemplo en sesores de salida no lineal.
Establecer el valor de temperatura de salida (y) de un calentador en función de la temperatura en el exterior (x)
etc.
si el número de puntos de referencia no es mayor que 2 ó menor que 100, o las coordenadas x no están en orden ascendente (x1 < x2 < x3 < ...).
si el número de puntos de referencia no es mayor que 2 ó menor que 100, o las coordenadas x no están en orden ascendente (x1 < x2 < x3 < ...).
Si el valor de entrada x es menor que la coordenada x del primer punto de referencia (P1: x < x1), la salida y será la coordenada y del primer punto de referencia (salida y = y1).
Si el valor de entrada x es mayor que la coordenada x del último punto de referencia (P8: x > x8), la salida y será la coordenada y del último punto de referencia (salida y = y8).
DUT para los pares de valores xy (puntos de referencia P1, P2, ...):
Los puntos de referencia (P1, P2, ...) se copian a la función a través de una variable de tipo DUT que contiene el número de puntos de referencia y los pares de valores xy (número; x1, x2, ...; y1, y2; ...).
Elemento: Valores x (ARRAY[1..z] OF DINT o ARRAY[0..z-1] of DINT)
Elemento: Valores y (ARRAY[1..z] OF DINT o ARRAY[0..z-1] of DINT)
Los valores x se deben introducir en orden ascendente (x1 < x2 < x3 < ...). Si existen valores x idénticos (e.g. x2 = x3 = x4) se ignoran los puntos de referencia P2 (x2, y2) y P3 (x3, y3).
Para evitar que se produzcan desbordamientos a la hora de realizar los cálculos, los puntos de referencia tienen que cumplir las siguientes condiciones:
|ya - yb| < 2147483647 |x - xb| < 2147483647 |(ya - yb)*(x - xb)| < 2147483647 |xa - xb| < 2147483647 |
Esta función solo puede procesar números enteros. Los números seguidos de un punto decimal se redondean cuando se calcula el valor y. Por ejemplo, si para la posición x, se obtiene y = 511,13, la función devuelve 511.
En la piscina de DUTs, se declaran el número de puntos de referencia y los pares de valores xy.
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
start: BOOL:=FALSE;
(*avtivates the function*)
input_value: DINT:=0;
(*input_value x*)
measured_value: Interpolation_8 (X_values := [-5,5,15,20,30,42,45,50],Y_values := [5,-5,10,2,2(5),0,2]);
(*number of reference
points*)
output_value: DINT:=0;
(*output_value y*)
@'': @'';
END_VAR
Aquí se declara la variable de entrada measured_value, correspondiente al tipo de DUT definido. La asignación de valores x e y se realiza en la cabecera de la POU. Sin embargo, los valores x e y se pueden modificar en el cuerpo, asignando un valor a la variable, es decir, Measuredvalues.Y_Values[3] para y3.
Cuando la variable start está ajustada a TRUE, se ejecuta la función. Para el valor input_value en la posición x, el valor de salida y se calcula por medio de una interpolación lineal de los puntos de referencia vecinos almacenados en la variable measured_value.
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_VARIN,,input_value,13,2,15,4,);
B(B_VARIN,,measured_value.referencepoints,13,3,15,5,);
B(B_VAROUT,,output_value,22,2,24,4,);
B(B_CONTACT,,start,6,1,8,3,);
B(B_F,F283_DSCAL!,Instance,15,0,22,5,,?DEN?Dx?Dxy_data?AENO?Cy);
L(8,2,15,2);
L(1,2,6,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F283_DSCAL(input_value, measured_value.referencepoints, output_value);
END_IF;