Interpolation linéaire des valeurs INT discrètes
Cette fonction renvoie la valeur y en position x en exécutant une interpolation linéaire basée sur les points de référence voisins Pw(xw, yw) et Pw+1(xw+1, yw+1). Dans cet exemple, w est le point de référence le plus proche, dont la valeur x est inférieure à la valeur d’entrée x, c.-à-d. que la fonction relie les points de référence en série et renvoie la valeur de sortie y basée sur la valeur d’entrée x.
Entrée
Activation de la fonction (lorsque EN = TRUE, la fonction est exécutée pendant chaque cycle de l’automate)
Valeur d’entrée x
Applique le premier élément du DUT défini par l’utilisateur, c.-à-d. le nombre de valeurs xy à cette entrée. Voir la description de la structure des DUT ci-dessous.
Sortie
Valeur de sortie y
ENO est défini sur TRUE dès que la fonction est exécutée. Pratique en cas d’utilisation de blocs fonctions en cascade avec des fonctions EN.
Au lieu d’utiliser cette instruction F, nous recommandons d’utiliser l’instruction FP7 correspondante : FP_SCALE Exécuter une interpolation linéaire des valeurs discrètes
La fonction peut être utilisée pour :
Linéariser des valeurs mesurées, par ex. avec des capteurs non-linéraires
Renvoyer la température de départ y d’un chauffage par rapport à la température extérieure x
etc.
Si le nombre de points de référence n’est pas entre 2 ... 100, ou les valeurs de x ne sont pas dans l’ordre croissant (x1 < x2 < x3 < ...).
Si le nombre de points de référence n’est pas entre 2 ... 100, ou les valeurs de x ne sont pas dans l’ordre croissant (x1 < x2 < x3 < ...).
Lorsque la valeur d’entrée x est inférieure à la coordonnée x du premier point de référence (P1 : x < x1), la sortie y est définie sur la coordonnée y du premier point de référence (sortie y = y1, ligne horizontale pointillée dans le graphique, en haut à gauche).
Lorsque la valeur d’entrée x est supérieure à la coordonnée x du dernier point de référence (P8 : x > x8), la sortie y est définie sur la coordonnée y du dernier point de référence (y = y8, ligne horizontale pointillée dans le graphique, en haut à droite).
DUT pour les valeurs xy (points de référence P1, P2,...) :
Les points de référence (P1, P2,...) sont copiés vers la fonction via une variable de type DUT contenant le nombre de points de référence et les valeurs xy (nombre ;x1, x2,... ; y1, y2 ;...).
Elément : valeurs x (ARRAY[1..z] OF INT ou ARRAY[0..z-1] of INT)
Elément : valeurs y (ARRAY[1..z] OF INT ou ARRAY[0..z-1] of INT)
Informations importantes :
Valeurs x
Les valeurs x doivent être entrées dans l’ordre croissant (x1 < x2 < x3 < ...). Lorsque les valeurs x sont les mêmes (par ex. x2 = x3 = x4), les points de référence P2(x2,y2) et P3(x3,y3) sont ignorés.
Pour éviter un dépassement positif dans le calcul, les points de référence voisins doivent remplir les conditions suivantes :
|ya - yb| < 32767 |x - xb| < 32767 |(ya - yb)*(x - xb)| < 32767 |xa - xb| < 32767 |
Cette fonction ne peut traiter que des nombres entiers. Les chiffres suivant le point décimal sont supprimés lors du calcul de la valeur y. Par exemple, si à la position x, y = 511,13, la fonction renvoie la valeur 511
Le nombre de points de référence et les valeurs xy sont déclarés dans le gestionnaire du DUT.
Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.
VAR
start: BOOL:=FALSE;
(*avtivates the function*)
input_value: INT:=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: INT:=0;
(*output_value y*)
@'': @'';
END_VAR
Dans cet exemple, la variable d’entrée déclarée (measured_value) correspond au type de DUT défini ci-dessus. Les valeurs x et y ont été affectées dans l’en-tête du POU. Cependant, vous pouvez modifier les valeurs x et y dans le corps en affectant une valeur à la variable, par ex. Measuredvalues.X_Values[1] pour x.
La fonction est exécutée lorsque la variable start est sur TRUE. Pour la valeur d’entrée x, la valeur de sortie y est calculée via une interpolation linéaire des points de référence voisins sauvegardés dans 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_F,F282_SCAL!,Instance,15,0,22,5,,?DEN?Dx?Dxy_data?AENO?Cy);
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,);
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
F282_SCAL(input_value, measured_value.referencepoints, output_value);
END_IF;