Définir la zone tampon des moyennes glissantes et valeurs totales
Cette instruction FP définit un tampon spécifique pour calculer la moyenne et la somme des valeurs contenues. L’adresse de départ est spécifiée par d_Start et la taille par n_Words. Le tampon a une structure particulière, décrite dans l’exemple de programmation, dans laquelle le nombre d’éléments Array du dernier élément iArrData correspond à la taille définie par n_words. Utilisez l’instruction FP_AVERAGE_BUFFER_WRITE pour écrire les valeurs dans le tampon.
Entrée
Indique la taille de la mémoire tampon
Valeurs : 1–30000
Sortie
Zone de départ des données du tampon
Nous recommandons d’utiliser un DUT défini par l’utilisateur comme dans l’exemple de programmation.
Si une valeur spécifiée pour un paramètre est en dehors de l’intervalle autorisé.
Si une valeur spécifiée pour un paramètre est en dehors de l’intervalle autorisé.
Éléments du DUT (identifiants) :
Taille du tampon
Nombre des données sauvegardées
Somme totale des données sauvegardées
Moyenne glissante
Position du pointeur d’écriture
Contient les valeurs du tampon. Le nombre de valeurs INTEGER (10 dans cet exemple) doit être égal à la taille du tampon définie par iNumberOfIntegerValues.
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
bDefine: BOOL:=FALSE;
bWrite: BOOL:=FALSE;
iCounter: INT:=0;
END_VAR
VAR CONSTANT
iNumberOfIntegerValues: INT:=10;
(*number of integers values must be equal to average buffer size*)
END_VAR
VAR
dutAverageBufferInt10: DUT_FP_AVERAGE_BUFFER_INT_10;
(*Average Buffer for integer numbers of size 10*)
END_VAR
La fonction est exécutée lorsque la variable bDefine est sur TRUE.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,FP_AVERAGE_BUFFER_DEFINE!,,13,2,28,6,,?DEN?Dn_Words?AENO?Cd_Start);
B(B_VARIN,,iNumberOfIntegerValues,11,4,13,6,);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,bDefine,4,1,6,3,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
L(1,2,4,2);
L(6,2,6,4);
L(6,4,13,4);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_CONTACT,,bWrite,2,1,4,3,);
B(B_CONTACT,,bDefine,6,1,8,3,N);
B(B_F,FP_AVERAGE_BUFFER_WRITE!,,14,2,28,6,,?DEN?D@'s'?AENO?Cd_Start);
B(B_VARIN,,sys_iRingCounter_2ms5,12,4,14,6,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,sys_bPulse1s,11,1,13,3,R);
L(1,2,2,2);
L(4,2,6,2);
L(8,2,11,2);
L(13,2,13,4);
L(13,4,14,4);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (bDefine) then
FP_AVERAGE_BUFFER_DEFINE(n_Words := iNumberOfIntegerValues,
d_Start => Adr_Of_Var(dutAverageBufferInt10));
END_IF;
If (bWrite) AND NOT (bDefine) AND DF(sys_bPulse1s) then
FP_AVERAGE_BUFFER_WRITE(s := sys_iRingCounter_2ms5,
d_Start => Adr_Of_Var(dutAverageBufferInt10));
End_if;