F282_SCAL

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.

Paramètres

Entrée

EN (BOOL)

Activation de la fonction (lorsque EN = TRUE, la fonction est exécutée pendant chaque cycle de l’automate)

x (INT)

Valeur d’entrée x

xy_data (DUT défini par l’utilisateur)

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

y (INT)

Valeur de sortie y

ENO (BOOL)

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.

Remarques

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.

Drapeaux d’erreur

sys_bIsOperationErrorHold (passe à TRUE et reste TRUE)

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

sys_bIsOperationErrorNonHold (passe à TRUE pendant un cycle)

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

Limites de la valeur de sortie y :

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

Structure du DUT défini par l’utilisateur :

  1. Élément : nombre de points de référence z (INT). Le nombre de points de référence (valeurs xy) peut être défini avec une valeur dans l’intervalle de 2–100. Dans le graphique, huit points de référence (P1P8) sont utilisés.
  2. Elément : valeurs x (ARRAY[1..z] OF INT ou ARRAY[0..z-1] of INT)

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

Dépassement positif de la fonction :

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

Précision du calcul :

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

Exemple

DUT

Le nombre de points de référence et les valeurs xy sont déclarés dans le gestionnaire du DUT.

En-tête du POU

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.

Corps du POU

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.

Corps en 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_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

Corps en ST

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

Corps en IL

Modifié le : 2021-08-09Feedback on this pagePanasonic hotline