F283_DSCAL

Interpolation linéaire des valeurs DINT 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 (DINT)

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

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.

y (DINT)

Valeur de sortie y

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 DINT ou ARRAY[0..z-1] of DINT)

  3. Elément : valeurs y (ARRAY[1..z] OF DINT ou ARRAY[0..z-1] of DINT)

NOTA

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

|x - xb| < 2147483647

|(ya - yb)*(x - xb)| < 2147483647

|xa - xb| < 2147483647

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

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.Y_Values[3] pour y3.

Corps du POU

La fonction est exécutée lorsque la variable start est sur TRUE. Pour la valeur d’entrée x (input_value), la valeur de sortie y est calculée via une interpolation linéaire entre les 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_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

Corps en ST

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

Corps en IL

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