Magnitudenspektrum

Dieses Beispiel implementiert ein Einzelkanal-Magnitudenspektrum. Der Code ist in zwei Tasks aufgeteilt; einer Steuerungstask, welche das diskrete Eingangssignal von einem Hardwaremodul sammelt, z.B. EL3632, und einer CM-Task, die das Spektrum berechnet. Das Blockdiagramm unten zeigt die im Beispiel implementierte Analysekette.

Den Quellcode für das Beispiel können Sie hier herunterladen:
MagnitudeSpectrum_Sample.zip

Blockdiagramm

Magnitudenspektrum 1:

Programmparameter

Die Tabelle unten zeigt eine Liste mit wichtigen Parametern für die Konfiguration des Magnitudenspektrum-Funktionsbausteins.

FFT-Länge

4096

Fenstergröße

3200

Puffergröße

1600

Fenster Typ

eCM_HannWindow

Skalierungsart

eCM_ROOT_POWER_SUM

Skalierung in Dezibel (dB)

FALSE

Globale Konstanten

Diese Parameter werden in der Liste der globalen Variablen als Konstanten definiert.

VAR_GLOBAL CONSTANT
    cOversamples       : UDINT := 10;      // oversampling factor
    cBufferLength      : UDINT := 1600;    // size of buffer for spectrum
    cWindowLength      : UDINT := 3200;   // size of window
    cFFTResult         : UDINT := 2049;   // size of spectrum result
    cFFTLength         : UDINT := 4096;   // spectrum lines
END_VAR

Code für Steuerungstask

Der folgende Code-Ausschnitt zeigt die Deklaration im MAIN Programm:

PROGRAM MAIN

VAR CONSTANT 
    cInitSource   : ST_MA_MultiArray_InitPars := ( eTypeCode := eMA_TypeCode_LREAL, nDims := 1, aDimSizes := [cBufferLength]);
END_VAR

VAR
     nInputSelection   : UDINT := 1; // Switch between hardware and function generator 
     nSample  : UDINT;
     aEl3632 AT %I*    : ARRAY[1..cOversamples] OF INT; // Input from hardware e.g. EL3632
     aBuffer  : ARRAY[1..cOversamples] OF LREAL; 

     fbSource      : FB_CMA_Source :=( stInitPars := cInitSource, nOwnID := eID_Source, aDestIDs := [eID_Spectrum]); // Initialize source buffers
     fbSink        : FB_CMA_Sink := (nOwnID := eID_Sink); 
     aSpectrumResult   : ARRAY[1..cFFTResult] OF LREAL; // Copy result        
END_VAR

Methode ruft MAIN Programm auf:

fbSource.Input1D(pDataIn := ADR(aBuffer),
               nDataInSize := SIZEOF(aBuffer), 
               eElementType := eMA_TypeCode_LREAL,
               nWorkDim := 0,
               pStartIndex := 0,
               nOptionPars := 0);

fbSink.Output1D(pDataOut := ADR(aSpectrumResult), 
               nDataOutSize := SIZEOF(aSpectrumResult), 
               eElementType := eMA_TypeCode_LREAL, 
               nWorkDim := 0,
               nElements := 0,
               pStartIndex := 0,
               nOptionPars := 0,
               bNewResult => bCalculate);

Code für CM-Task

Deklaration im MAIN_CM Programm:

PROGRAM MAIN_CM

VAR CONSTANT
     cInitSpectrum : ST_CM_MagnitudeSpectrum_InitPars := (nFFT_Length := cFFTLength, 
                                    nWindowLength := cWindowLength, 
                                    bTransformToDecibel:= FALSE, 
                                    eWindowType := eCM_HannWindow, 
                                    eScalingType := eCM_RMS);
END_VAR
VAR 
     fbSpectrum : FB_CMA_MagnitudeSpectrum :=(stInitPars := cInitSpectrum, 
                                   nOwnID := eID_Spectrum, 
                                   aDestIDs := [eID_Sink]);
END_VAR

Methode ruft MAIN_CM Programm auf:

fbSpectrum.Call();

Das Ergebnis des Beispielcodes kann für ein sinusförmiges Signal beliebiger Amplitude und Frequenz als Eingangssignal getestet werden. Die Variable fRmsValue oben sollte genau dem Wert von Amplitude/SQRT(2) entsprechen.

Jede Frequenz kann dem entsprechenden Array-Index des Spektrumergebnisses zugeordnet werden. Rechenformel:
Abtastrate = Oversampling-Faktor / Abtasttaskzykluszeit
Index = Frequenz * (FFT Länge / Abtastrate)

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken

TwinCAT v3.1.4013

PC oder CX (x86, x64)

Tc3_CM, Tc3_CM_Base, Tc3_MultiArray