FUNCTION_BLOCK FB168 // UP Mess-Daten aufzeichnen und FFT-Analyse
TITLE = 'UP Mess-Daten aufzeichnen und FFT-Analyse' // UP Mess-Daten aufzeichnen und FFT-Analyse
AUTHOR : 'Larry'
VERSION : '1.6' // 20.04.2009
FAMILY : 'LL_Std'
KNOW_HOW_PROTECT
CONST
Array_max := 2048 ; // max. Anzahl von Einträgen im Array
Pi := 3.1415926 ;
Tag_in_ms := 86400000 ;
END_CONST
VAR_INPUT
akt_Messwert : INT ; // akt. Messwert (INT)
Anzahl_Werte : INT ; // Anzahl der zu erfassenden Werte [max. = 1024]
Drehzahl_Messung : REAL ; // Drehzahl während der Messung (1/Min.)
Werte_doppeln : BOOL ; // ? Daten verdoppeln / Zwischen-Daten bilden
Auswertung_x2 : BOOL ; // ? Auswertung quadrieren
Auswertung_glaetten_1 : BOOL ; // ? vor der Auswertung glätten
Auswertung_glaetten_2 : BOOL ; // ? nach der Auswertung glätten
akt_Uhrzeit : TOD ; // aktuelle Uhrzeit
akt_Datum : DATE ; // aktuelles Datum
Faktor_Amplitude : REAL := 1.0 ; // Anpassung der Ampituden-Darstellung
_Steuerung : INT ; // Steuer-Eingänge :
CMD_Reset_Puffer : BOOL ; // -Reset der Daten-Aufzeichnung
CMD_Einlesen : BOOL ; // -Daten einlesen
CMD_Auswertung : BOOL ; // -Daten auswerten
END_VAR
VAR_IN_OUT
_Meldungen : INT ; // Melde-Ausgänge :
OK_Reset_Puffer : BOOL ; // -Reset der Daten-Aufzeichnung erfolgt
Messung_aktiv : BOOL ; // -Messung ist gestartet
Liste_voll : BOOL ; // -alle/vorgegebene Daten sind erfasst
OK_Auswertung : BOOL ; // -Daten sind ausgewertet
Auswertung_IO : BOOL ; // -Auswertung ist IO
Auswertung_NIO : BOOL ; // -Auswertung ist NIO
END_VAR
VAR_OUTPUT
END_VAR
VAR
Last_Messwert : INT ; // Wert des zuletzt eingelesenen Messwertes
Index : INT ; // Zeiger auf Daten-Index für "Daten Einlesen"
FB_noch_aktiv : BOOL := false ; // Baustein wird noch bearbeitet
Daten_Init_OK : BOOL := false ; // Datenbereich ist initialisiert
Daten_Liste_voll : BOOL := false ; // Ende des Datenbereichs beim Schreiben erreicht
Messung_gestartet : BOOL := false ; // HM "Messung ist gestartet"
Messung_beendet : BOOL := false ; // HM "Ende der Messung"
FM_Messung_beendet : BOOL := false ; // Flankenmerker "Ende der Messung"
VorgabeWerte : ARRAY [1..5] OF STRUCT
Aktiv : BOOL ; // Messbereich auswerten ?
F_min : REAL ; // unterste Auswerte-Frequenz
F_max : REAL ; // oberste Auswerte-Frequenz
MittelWert : REAL ; // max. Mittelwert der Messerte im vorgegebenen Bereich
MaxWert : REAL ; // max. Spitzenwert der Messerte im vorgegebenen Bereich
END_STRUCT ;
Auswertung : STRUCT
Anzahl_Werte : INT ; // Anzahl der Quell-Werte
Frequenz_Faktor : REAL ; // Teilungs-Faktor Frequenz in der Auswertung [Hz/Index]
Anzahl_MessWerte : INT ; // Anzahl der Mess-Werte
Datum : DATE ; // Datum beim Start der Messung
Uhrzeit_Start : TOD ; // Uhrzeit beim Start der Messung
Uhrzeit_Ende : TOD ; // Uhrzeit beim Ende der Messung
Dauer_der_Messung : REAL ; // Dauer der letzten Messung [s]
Anz_Umdrehungen : REAL ; // Anzahl der Umdrehungen während der Messung
max_Amplitude : REAL ; // größter Amplituden-Wert
Mittelwert : REAL ; // Mittelwert aller Messwerte
Freq_Schwerpunkt : INT ; // Werte-Schwerpunkt bei Frequenz
MessBereich : ARRAY[1..5] OF STRUCT
MittelWert : REAL ; // Mittelwert der Messerte im vorgegebenen Bereich
MaxWert : REAL ; // Maximalwert der Messerte im vorgegebenen Bereich
Mittelwert_NIO : BOOL ; // Mittelwert > Vorgabewert
Maxwert_NIO : BOOL ; // Maximalwert > Vorgabewert
END_STRUCT ;
Amplitude : ARRAY [0..Array_max/2] OF INT ; // Frequenz-Spektrum // Index * "Frequenz_Faktor" ergibt die Frequenz des Datenpunktes
Werte_real : ARRAY [0..Array_max] OF REAL ; // Quell-Werte Real-Teil
Werte_imag : ARRAY [0..Array_max] OF REAL ; // Quell-Werte Imaginär-Teil
END_STRUCT ;
END_VAR
VAR_TEMP
i , j , k , L : INT ; // Schleifen-Variable
X , Y : INT ;
Anz_Bits : INT ;
Bit_Maske : INT ;
Winkel : REAL ;
Frequenz : REAL ;
temp , temp2 : REAL ;
Bereich_Summe : ARRAY [0..7] OF REAL ;
Bereich_Werte : ARRAY [1..5] OF INT ;
wCos , wSin : REAL ;
tReal , tImag : REAL ;
h_Uhrzeit : DINT ; // HM Zeit-Messung
Glaettung, k1, k2 : INT ;
Glaettung_Teiler : INT ;
Glaettung_Summe : REAL ;
END_VAR
// -----------------------------------------------------------------------------------------------------------------------
BEGIN
// -----------------------------------------------------------------------------------------------------------------------
IF NOT FB_noch_aktiv THEN
FB_noch_aktiv := true ;