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

Crest Faktor 1:

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