Pufferbereich für gleitende Mittelwerte und Summen definieren
Dieser FP-Befehl spezifiziert einen speziellen Puffer zum Berechnen von Mittelwert und Summe aller enthaltenen Werte. Die Startadresse wird durch d_Start und die Größe durch n_Words festgelegt. Der Puffer hat eine besondere Struktur, die im Programmierbeispiel dargestellt ist, wobei die Anzahl der Array-Elemente des letzten Elements iArrData der durch n_words definierten Größe entspricht. Mit dem Befehl FP_AVERAGE_BUFFER_WRITE schreiben Sie in den Puffer.
Eingang
Spezifiziert die Speichergröße des Puffers
Werte: 1–30000
Ausgang
Anfangsadresse des Puffers
Verwenden Sie einen benutzerdefinierten SDT, wie im Programmierbeispiel dargestellt.
wenn ein für einen Parameter angegebener Wert außerhalb des zulässigen Bereichs liegt.
wenn ein für einen Parameter angegebener Wert außerhalb des zulässigen Bereichs liegt.
Elemente des strukturierten Datentyps (Bezeichner):
Puffergröße
Anzahl der gespeicherten Daten
Gesamtsumme der gespeicherten Daten
Gleitende Mittelwertbildung
Position des Schreibzeigers
Enthält die Werte des Puffers. Die Anzahl der ganzzahligen Werte (in diesem Beispiel 10) muss gleich der Puffergröße sein, die mit iNumberOfIntegerValues definiert ist.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
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
Wenn die Variable bDefine auf TRUE gesetzt wird, wird die Funktion ausgeführt.
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;