Bernard
Level-2
- Beiträge
- 205
- Reaktionspunkte
- 53
-> Hier kostenlos registrieren
Lineare Mittelwertbildung und Archiv über X Array Elemente
Hallo an alle,
mein Ansatz ist folgender.Ich baue einen Datenbaustein der nur eine Variable hat,ein Array[1..X] of real.Die Größe des Array ist beliebig(nur durch S7 geschränkt) und realisiert das Messarchiv .
Der gebaute Fb(Linear_Mittelwert_real) macht dann folgendes, er füllt das Array vollständig und bildet über alle Elemente den linearen Mittelwert unabhängig von der Größe des Array.Ist das Archiv voll fängt der FB wieder bei der ersten Zelle an.
Die Archivierung erfolgt getaktet(bei O3X nicht nötig da selbst ein Takt),aus der Taktfrequenz und der Größe des Archives ergibt sich die Geschwindigkeitsänderung des Mittelwertes.Beispiel Takt:=100ms,DB:=100 Elemente, somit währe das Archiv nach 10Sekunden vollständig neu gefüllt worden.
Awl-Quelle liegt bei.
Beispielprogramm liedt bei.
Aufrufgrafik liegt bei.
AWL Textcode:
Hallo an alle,
mein Ansatz ist folgender.Ich baue einen Datenbaustein der nur eine Variable hat,ein Array[1..X] of real.Die Größe des Array ist beliebig(nur durch S7 geschränkt) und realisiert das Messarchiv .
Der gebaute Fb(Linear_Mittelwert_real) macht dann folgendes, er füllt das Array vollständig und bildet über alle Elemente den linearen Mittelwert unabhängig von der Größe des Array.Ist das Archiv voll fängt der FB wieder bei der ersten Zelle an.
Die Archivierung erfolgt getaktet(bei O3X nicht nötig da selbst ein Takt),aus der Taktfrequenz und der Größe des Archives ergibt sich die Geschwindigkeitsänderung des Mittelwertes.Beispiel Takt:=100ms,DB:=100 Elemente, somit währe das Archiv nach 10Sekunden vollständig neu gefüllt worden.
Awl-Quelle liegt bei.
Beispielprogramm liedt bei.
Aufrufgrafik liegt bei.
AWL Textcode:
Code:
FUNCTION_BLOCK "Linear_Mittelwert_real"
TITLE =
VERSION : 0.1
VAR_INPUT
Takt : BOOL ; //Externer Impuls
Real_Messwert : REAL ; //Messwert normiert auf real
DB_NR : INT ; //Nr des DB ,der DB ist Array[1..X] of real Ausschließlich
END_VAR
VAR_OUTPUT
Linearer_Mittelwert : REAL ;
END_VAR
VAR
Pointer_Speicher_Stat : DWORD ;
END_VAR
VAR_TEMP
DB_NR_intern : INT ;
Pointer_Speicher_temp : DWORD ;
Pointer_schleife : DWORD ;
schleife : INT ;
SummeMesswert : REAL ;
Anzahl_Messelemente : DINT ;
END_VAR
BEGIN
NETWORK
TITLE =Messwertspeicherung in einem beliebig großem Array of real(DB)
//Datensammlung des Messwertes.Bei jeder messung wird der Wert hochlaufend in
//eine Zelle geschrieben.Ist der DB voll wird mit der ersten zelle
//wieder angefangen.
UN #Takt; //wenn Takt=false keine Bearbeitung
SPB Ende;
//***************************************************
L #DB_NR; //Indirektes öffnen des Messpeicher DB
T #DB_NR_intern;
AUF DB [#DB_NR_intern];
//***************************************************
L #Pointer_Speicher_Stat; //Übergabe statischen an Temp zwecks Indirekte
T #Pointer_Speicher_temp;
//++++++++++++++++++++++++++++++
L #Real_Messwert; //Wertablage in Mess_speicher db
T DBD [#Pointer_Speicher_temp];
//++++++++++++++++++++++++++++++
L P#4.0; //Pointererhöhung für nächste Messspeicherung
L #Pointer_Speicher_Stat;
+D ;
T #Pointer_Speicher_Stat;
//***************************************************
//Berechnen der Grenzen des Messspeicher DB und Neubelegung des Pointers mit null
L #Pointer_Speicher_Stat; //Adresse des Pointers ermitteln
SRD 3; //umwandeln nach dint,int
L DBLG; //laden der DB Länge in byte
>=D ; //wenn der Pointer >= ist als die Anzahl der Byte`des DB
SPBN neu;
L P#0.0; //Neubelegung des Pointer
T #Pointer_Speicher_Stat;
neu: NOP 0;
NETWORK
TITLE =Lineare Mittelwertbildung über alle Elemente des Array`s (DB)
L P#0.0; //Pointer auf erstes Messelement legen
T #Pointer_schleife;
L 0.000000e+000;
T #SummeMesswert; //vorbelegung Summe Messwert mit null
L DBLG; //Datenbausteinlänge in Byte
L 4;
/D ;
T #Anzahl_Messelemente;
next: T #schleife;
L DBD [#Pointer_schleife]; //lade Messelement
L #SummeMesswert;
+R ;
T #SummeMesswert;
L P#4.0;
L #Pointer_schleife;
+D ;
T #Pointer_schleife;
L #schleife;
LOOP next;
//*************************************************
L #SummeMesswert;
L #Anzahl_Messelemente;
DTR ; //Umwandlung in real
/R ; //Die summe der Messungen durch Anzahl ist Mittelwert
T #Linearer_Mittelwert;
Ende: NOP 0;
SET ;
SAVE ;
END_FUNCTION_BLOCK