[Tuto] Calcul moyenne instantanée

Trucs-Astuces-Micro cours sur les automatismes industriels
Répondre
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7089
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

[Tuto] Calcul moyenne instantanée

Message par itasoft »

Calcul de la valeur moyenne instantanée de la mesure (ex :sur les 10 dernières mesures)
-Déclarer un tableau de taille 10
-Sur changement d’état de la mesure (N<>N-1) :
-Faire un décalage logique à gauche du tableau
(ça éjecte la mesure la plus ancienne et libère la case [0] du tableau pour la nouvelle mesure)
-Copier la mesure dans la première case du tableau ex : TABLEAU[0] :=Mesure
(De ce fait, le tableau contient toujours les 10 dernière mesures qui se suivent dans le temps, ça s’appelle un tableau glissant, seule solution pour une moyenne instantanée )
-Faire la somme du tableau
-Calculer la moyenne : Moyenne :=Somme/10
-Copier la mesure N dans N-1
-
---Exemple sur Unity -------

Code : Tout sélectionner

if INT_Mesure<>INT_Mesure_Mem then
(*Décalage du tableau*)
	ROL_ARDINT(1, DINT_TABLEAU);
	DINT_TABLEAU[0]:=INT_TO_DINT(INT_Mesure);
	IF DINT_Compteur<10 then
		INC(DINT_Compteur);
	end_if;
	DINT_Somme:=SUM_ARDINT(DINT_TABLEAU);
	INT_Moyenne:=DINT_TO_INT(DINT_Somme / DINT_Compteur);
	INT_Mesure_Mem:=INT_Mesure;
end_if;
Automaticien privé (de tout)
itasoft@free.fr
Uphelus
Code son premier grafcet
Code son premier grafcet
Messages : 50
Enregistré le : 02 janv. 2019, 08:35

Re: [Tuto] Calcul moyenne instantanée

Message par Uphelus »

Bonjour,

Merci itasoft pour ta solution.

Je me permet quelques critiques (le prends pas mal c'est plus a titre de discutions et d'évolution que de contradiction). Ma méthode ne marchera qu'avec des entiers.

La méthode utilisé peut être gourmande en ressource si le tableau augmente en taille.
Ainsi pour une moyenne réalisé sur un tableau assez grand, par exemple une moyenne de mesures sur un niveau d'eau, cela permet de filtrer les vagues, je réalise:
incrément à 1 de l'entier nommé "n" (si n> valeur max du tableau alors n=0)
Suppression de la valeur de la case "n" du tableau de ma sommation,
Enregistrement de la mesure courante dans le tableau à la case "n",
Ajout de la valeur de la case "n" du tableau de ma sommation,

Code : Tout sélectionner

Val_Max	DINT				Valeur maximal de la taille de mon tableau
n 	DINT 				pointeur utilisé dans le tableau
TAB 	ARRAY[0..Val_Max] OF INT 	Tableau d'enregistrement de la mesure moyenné
Som	DINT				Résultat de la somme du tableau
Moy	INT				Résultat de la moyenne
Mesure	INT				Mesure courante

n := n+1;
IF n>Val_Max THEN n:=0; END_IF; (* Limitation à la valeur maximal du tableau *)
Som := Som-INT_TO_DINT(TAB[n]); (* Supression de la mesure il y a Val_Max cycles dans le sommation*)
TAB[n] := Mesure; (* Remplacement de la valeur il y a Val_Max cycle par la mesure courante *)
Som := Som+INT_TO_DINT(TAB[n]); (* Ajout de la mesure courante dans la sommation *)
Moy := DINT_TO_INT(Som/Val_Max); (* Calcul de la valeur moyenne *)
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7089
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [Tuto] Calcul moyenne instantanée

Message par itasoft »

Slts,
Ta méthode est chaudement recommandé si on ne dispose pas de l’instruction décalages sur tableau
(ROL_ARDINT) ou (ROL_ARREAL) sinon c’est faire compliqué quand on peut faire simple,
Automaticien privé (de tout)
itasoft@free.fr
Répondre