F283_DSCAL

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.

Parámetros

Entrada

EN (BOOL)

Activación de la función (si EN = TRUE, la función se ejecuta en cada ciclo de scan)

x (DINT)

Valor de entrada x

xy_data (DUT definida por el usuario)

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 (BOOL)

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.

y (DINT)

Valor de salida y

Observaciones

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.

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)

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 < ...).

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)

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 < ...).

Limitaciones de los valores de salida y:

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; ...).

Estructura de la DUT definida por el usuario:

  1. Elemento: número de puntos de referencia z (INT). El número de puntos de referencia (pares de valores xy) puede encontrarse en cualquier lugar entre 2–100. En la gráfica se utilizan ocho puntos de referencia (P1P8).
  2. Elemento: Valores x (ARRAY[1..z] OF DINT o ARRAY[0..z-1] of DINT)

  3. Elemento: Valores y (ARRAY[1..z] OF DINT o ARRAY[0..z-1] of DINT)

NOTA

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).

Desbordamiento de la función:

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

Precisión de los cálculos:

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.

Ejemplo

DUT

En la piscina de DUTs, se declaran el número de puntos de referencia y los pares de valores xy.

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
		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.

Cuerpo de la POU

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.

Cuerpo LD

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

Cuerpo en ST

IF start then
    F283_DSCAL(input_value, measured_value.referencepoints, output_value);
END_IF;

Cuerpo IL

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