Histogramm

Dieses Beispiel implementiert ein Histogramm. Der Code ist in zwei Tasks aufgeteilt; eine Steuerungstask welche die Eingangsdaten sammelt, z.B. aus EL3632, und eine sogenannten CM-Task, die das Histogramm errechnet. Das Blockdiagramm unten zeigt die Analysekette.

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

Blockdiagramm

Histogramm 1:

Programmparameter

Die Tabelle unten zeigt die wichtigsten Parameter, um den Histogramm-Baustein zu konfigurieren:

Histogram Bins

100

Appended Datasets

10

Oversamples

10

Max. Bin Limit

+3 or +5

Min. Bin Limit

-3 or -5

Channels

1

Buffer Length

100

Globale Konstanten

Die oben angegebenen Parameter lassen sich als globale Konstanten definieren:

VAR_GLOBAL CONSTANT
    cBufferLength : UDINT := 100;
    cChannels     : UDINT := 1;
    cOversamples  : UDINT := 10;
    cMaxBins      : UDINT := 100;
    cAppendedData : UDINT := 10;
    cBinLimit_1   : LREAL := 3;
    cBinLimit_2   : LREAL := 5;
END_VAR

Code für die MAIN Task

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

PROGRAM MAIN
VAR CONSTANT
    cInitSource    : ST_MA_MultiArray_InitPars
    := (eTypeCode := eMA_TypeCode_LREAL, nDims := 2, aDimSizes := [1, cBufferLength]);
END_VAR
VAR
    nInputSelection : UDINT := 1;
    nSample         : UDINT;
    aEl3632 AT %I* : ARRAY [1..cOversamples] OF INT;
    aBuffer         : ARRAY [1..cOversamples] OF LREAL;
    fbSource        : FB_CMA_Source := (stInitPars := cInitSource, nOwnId
:= eID_Source, aDestIDs := [eID_Histogram]);
    fbSink          : FB_CMA_Sink := (nOwnID := eID_Sink);
    aHistReulst     : ARRAY [1..cMaxBins+2];
END_VAR

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

fbSource.Input2D(pDataIn := ADR(aBuffer),
                aDataInSize  := SIZEOF(aBuffer),
                eElementType := eMA_TypeCode_LREAL,
                nWorkDim0    := 0,
                nWorkDim1    := 1,
                pStartIndex  := 0,
                nOptionPars  := 0);

fbSink(pDataOut := ADR(aHistResult),
        nDataOutSize := SIZEOF(aHistResult),
        eElementType := eMA_TypeCode_UINT64,
        nWorkDim0    := 0,
        nWorkDim1    := 1,
        nElements    := 0,
        pStartIndex  := 0,
        nOptionPars  := 0);

Code für die CM Task

Die Variablen-Deklaration im MAIN_CM Programm:

VAR CONSTANT
    cInitHistArray : ST_CM_HistArray_InitPars := (nChannels := cChannels, nBins := cMaxBins, fMinBinnded := -cBinLimit_1, fMaxBinned := cBinLimit_1);
END_VAR

Die Methodenaufrufe im MAIN_CM Programm:

fbHistArray.CallEx(nAppendData := cAppendData, bReset := );

IF bConfig then
    fbHistArray.Configure(pArg := ADR(aHisArrayConfig), nArgSize := SIZEOF(aHistArrayConfig)
END_IF

Die Configure Methode ist optional, ermöglicht aber eine feine Einstellung der Parameter fMinBinned und fMaxBinned während der Laufzeit.

Random Number Generator

Ein Histogramm wird sehr oft als eine visuelle Hilfe verwendet, um die zugrunde liegende Verteilung aller Messwerte zu verstehen, z.B. die Spitzen im Schwingungssignal. Der im Samplecode enthaltene Funktionsgenerator ist für diesen Zweck erweitert. Der Funktionsgenerator kann die üblichen und praxisnahen Zufallszahlen und deren Verteilungen simulieren. Mit der Variablen E_DistributionType können Sie eine Verteilung wie Exponentielle, Normale (oder Gaußsche), Chi-Squared oder Gamma auswählen. Standardmäßig werden die Zufallszahlen aus einer Gleichverteilung erzeugt.

Histogramm 2:

Beachten Sie, dass jede Verteilung ein oder mehrere Parameter erfordert, um die Ausbreitung der Zufallszahlen oder deren Bereich festzustellen. Dies kann über die Eingangsvariable aRange erfolgen.

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken

TwinCAT v3.1.4016.12

PC oder CX (x86, x64)

Tc3_CM  (v1.0.19), Tc3_CM_Base, Tc3_MultiArray