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