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
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 |