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 ;