Crest Faktor
Dieses Beispiel berechnet den Crest Faktor eines Eingangssignals. Auch wenn der Funktionsbaustein FB_CMA_CrestFactor in der Lage ist, mehrere Kanäle zu verarbeiten, wird zwecks Veranschaulichung nur ein Einzelkanal betrachtet. Das Blockdiagramm unten zeigt die im Programm implementierte Analysekette.
Den Quellcode für das Bespiel können Sie hier herunterladen:
CrestFactor_Sample.zip
Blockdiagramm
Programmparameter
Die Tabelle unten zeigt eine Liste mit wichtigen Parametern für die Konfiguration des Bausteins zur Berechnung des Scheitelfaktors.
Kanäle | 2 |
Puffergröße | 1600 |
Globale Konstanten
Diese Parameter werden in der Liste der globalen Variablen als Konstanten definiert.
VAR_GLOBAL CONSTANT
cOversamples : UDINT := 10; // oversampling factor
cChannels : UDINT := 2; // number of channels
cBufferLength : UDINT := 2000; // size of buffer
END_VAR
Code für Steuerungstask
Der folgende Code-Ausschnitt zeigt die Deklaration im MAIN Programm:
VAR CONSTANT
cInitSource : ST_MA_MultiArray_InitPars := ( eTypeCode := eMA_TypeCode_LREAL, nDims := 2, aDimSizes := [cChannels, cBufferLength]);
END_VAR
VAR
nInputSelection : UDINT := 1;
aCrestFactor : ARRAY[1..cChannels] OF LREAL;
nSampleIdx : UDINT;
nChannelIdx : UDINT;
aEl3632 AT %I* : ARRAY[1..cChannels] OF ARRAY[1..cOversamples] OF INT; // input from hardware e.g. EL3632
aBuffer : ARRAY[1..cChannels] OF ARRAY[1..cOversamples] OF LREAL;
fbSource : FB_CMA_Source := (stInitPars := cInitSource, nOwnID := eID_Source, aDestIDs := [eID_Crest]); // Initialize source
fbSink : FB_CMA_Sink := (nOwnID := eID_Sink);
END_VAR
Methode ruft Main Programm auf:
// Collect data in a source
fbSource.Input2D(pDataIn := ADR(aBuffer),
nDataInSize := SIZEOF(aBuffer),
eElementType := eMA_TypeCode_LREAL,
nWorkDim0 := 0,
nWorkDim1 := 1,
pStartIndex := 0,
nOptionPars := 0 );
// Push results to sink
fbSink.Output1D(pDataOut := ADR(aCrestFactor),
nDataOutSize := SIZEOF(aCrestFactor),
eElementType := eMA_TypeCode_LREAL,
nWorkDim := 0,
nElements := 0,
pStartIndex := 0,
nOptionPars := 0,
bNewResult => bNewResult);
Code für CM-Task
Deklaration im MAIN_CM Programm:
VAR CONSTANT
cInitCrest : ST_CM_CrestFactor_InitPars := ( nChannels := cChannels, nBufferLength := cBufferLength );
END_VAR
VAR
fbCrest : FB_CMA_CrestFactor := (stInitPars := cInitCrest, nOwnID:= eID_Crest, aDestIDs:= [eID_Sink]); // Initialize crest
END_VAR
Methode ruft MAIN_CM Programm auf:
fbCrest.Call();
Das Ergebnis des Beispielcodes kann für ein sinusförmiges Signal beliebiger Amplitude und Frequenz als Eingangssignal getestet werden. Der Scheitelfaktor, in diesem Falle das erste Element von aCrestFactor, muss gleich 3,01 dB sein.
Voraussetzungen
Entwicklungsumgebung |
Zielplattform |
Einzubindende SPS-Bibliotheken |
---|---|---|
TwinCAT v3.1.4013 |
PC oder CX (x86, x64) |
Tc3_CM, Tc3_CM_Base, Tc3_MultiArray |