FB_ALY_CorrelationFunctionReference

Der Correlation Function Reference Baustein berechnet die diskrete Korrelationsfunktion zwischen einem aufgenommenen Signal (im Folgenden Referenzsignal), welches aus einer tcab-Datei eingelesen wird, und einem oder mehreren Eingangssignalen (Channel 00, …, Channel 0n).

Die Korrelationskoeffizienten werden für Zeitverschiebungen von m Zyklen zwischen den beiden Signalen berechnet, wobei der maximale und der minimale Wert für m durch die Parameter Minimum Lag (negative ganze Zahl) und Maximum Lag (positive ganze Zahl) begrenzt ist.

Durch den Parameter Step Size wird bestimmt, um wie viele Zyklen die Signale für die Berechnung zweier aufeinanderfolgender Korrelationskoeffizienten verschoben werden. D.h. m ist immer ein Vielfaches der Step Size. Dementsprechend sind für Minimum Lag und Maximum Lag auch nur Vielfache der Step Size zulässig. Ist die Step Size auf eins gesetzt und beispielsweise Minimum Lag auf -6 sowie Maximum Lag auf +4, so werden Koeffizienten für Verschiebungen um -6, -5, -4, -3, -2, -1, 0, +1, +2, +3 und +4 Zyklen berechnet. Setzt man die Step Size auf zwei, werden Koeffizienten für Verschiebungen um -6, -4, -2, 0, +2 und +4 Zyklen berechnet.

Ab dem Start der Analyse wird von dem eingelesenen Signal pro Zyklus ein Wert verarbeitet. Ist das Ende der Datei erreicht, wird wieder mit dem ersten Wert der Datei begonnen. Das eingelesene Signal wird also als periodisch angenommen. Möchte man nur bestimmte Zeitabschnitte des Eingangssignals mit dem Referenzsignal korrelieren, kann man dies über die Eingänge Enable Execution und Reset sowie über den Ausgang New Result steuern.

Die Korrelationskoeffizienten können über verschiedene Zeitfenster berechnet werden. Diese werden durch den Parameter Window Mode gesetzt. Im Continuous Modus werden alle Werte seit Beginn der Analyse in die Berechnungen miteinbezogen. Im SlidingWindow Modus läuft die Berechnung kontinuierlich über die letzten, durch die Window Size gesetzte Anzahl von Zyklen. Im FixWindow Modus erfolgt die Berechnung über die Länge des Referenzsignals und die Ausgangswerte werden immer zum Ende der aufgenommenen Sequenz aktualisiert.

Für m ungleich Null verschiebt sich das Fenster für das entsprechende Signal um m Zyklen. Damit bleibt die Anzahl von Werten, welche in die Berechnung der Koeffizienten mit einbezogen werden, für alle Werte von m gleich. Eine Ausnahme hierzu bilden nur die Ergebnisse aus den ersten Zyklen nach Start der Analyse. Ist die Anzahl der verstrichenen Zyklen kleiner als |m|, werden entsprechend weniger Werte in die Berechnung mit einbezogen.

Für positive Werte von m werden die Werte des Referenzsignals (Channel Ref) in einem Ringspeicher gespeichert, damit jeweils der vor m Zyklen eingegangene Wert des Referenzsignals mit den aktuellen Werten von Channel 00 bis Channel 0n verglichen werden kann. Dies entspricht einer Verschiebung des Referenzsignals in die Vergangenheit. Für negative Werte von m müsste das Referenzsignal dementsprechend in die Zukunft verschoben werden. Da dies offensichtlich nicht möglich ist, wird stattdessen das zweite Signal (Channel 00,..Channel0n) gespeichert und nach hinten verschoben.

Die Korrelationskoeffizienten können nach unterschiedlichen Berechnungsvorschriften berechnet werden. Diese wird durch den Correlation Mode bestimmt. In den Modi Base und Normed werden die Koeffizienten analog zu der Definition aus der Signalverarbeitung berechnet, welche die Korrelation über die Faltung berechnet. Im Normed – Modus werden die Koeffizienten zudem durch die Anzahl der Summanden geteilt. Covariance und CovarianceBessel berechnen die Kovarianz ohne und mit Bessel-Korrektur. Der Modus Pearson nutzt die Definition des in der Statistik üblichen Pearson Korrelationskoeffizienten. In den Konfigurationsoptionen sind die genauen Berechnungsvorschriften mathematisch aufgeführt. Hier bezeichnet xn den Wert des Referenzsignals und yn den Wert des Eingangssignals (jeweils Channel00, …, Channel0n) zum Zeitstempel tn (entsprechend dem n-ten Zyklus seit Start der Analyse oder seit Reset, ausgenommen der Zyklen in denen Enable Execution = FALSE). Der Wert von N hängt von dem gewählten WindowMode ab. Für den SlidingWindow-Mode und FixWindow-Mode ist N gleich der Window Size, vorausgesetzt seit Start der Analyse sind bereits entsprechend viele Zyklen vergangen, sodass xn-N-m (bzw. yn-N+m) aufgenommen wurde, andernfalls reduziert sich N zu n-m+1 bzw. n+m+1. Im FixWindow-Mode ist die Window Size nicht manuell zu setzen, sondern entspricht der Länge des eingelesenen Signalabschnitts (Referenzsignal). und die Ausgangswerte werden zum Ende des Signalabschnitts aktualisiert. Im Continuous-Mode gilt stets N = n+1.

In der Abbildung sind beispielhaft für eine Konfiguration (Correlation Mode = Pearson, Window Mode = FixWindow, Window Size = 120 (= Anzahl an Werten in der Datei), Step Size = 5, Maximum Lag = 20, Minimum Lag = -20) und einen Eingangskanal die verschiedenen Eingangs- und Ausgangswerte des Bausteins dargestellt. Auf der linken Seite sind in den beiden unteren Plots die Eingangssignale Channel 00 und Reset abgebildet, darüber ist auf der gleichen Zeitachse die eingelesene Sequenz, gemäß ihrer Verarbeitung, abgebildet. Zu Beginn der Analyse wird begonnen das Signal einzulesen. Ist der letzte Wert aus der Datei im 120ten (bzw. 240ten) Zyklus verarbeitet, wird erneut mit dem ersten begonnen. Im 300ten Zyklus wird ein Reset durchgeführt und es wird erneut mit dem ersten Wert der Datei begonnen. Zudem werden alle Werte aus den internen Speichern gelöscht und die Berechnung der Koeffizienten beginnt erneut. Beispielsweise wurde hier erkannt, dass Channel 00 in den vorherigen Zyklen keine gültigen Werte enthielt und jetzt die Schwingung erneut angeregt wurde. In diesem Bereich könnte auch durch Enable Execution = FALSE die Analyse unterbrochen werden. Da WindowMode = FixWindow, werden die Ausgänge nur im 120ten, 240ten und 420ten Zyklus aktualisiert. Die entsprechenden Koeffizienten (von Ausgang Output00) sind im rechten Plot dargestellt. An den Wertepaaren (Maximizing Lag, Maximum Coefficient) kann man jeweils ablesen, um wie viel das Eingangssignal zum Referenzsignal verschoben ist. Beispielsweise ist im 420ten Zyklus (Maximizing Lag, Maximum Coefficient) = (-10,1). Das heißt, hätte der Reset 10 Zyklen früher stattgefunden, hätten das Referenzsignal und Channel 00 in diesem Fenster exakt übereinander gepasst.

FB_ALY_CorrelationFunctionReference 1:

Syntax

Definition:

FUNCTION_BLOCK FB_ALY_CorrelationFunctionReference 
VAR_OUTPUT
    ipResultMessage: Tc3_EventLogger.I_TcMessage;
    bError: BOOL;
    bNewResult: BOOL;
    bConfigured: BOOL;
    bBusy: BOOL;
    eState: E_ALY_ReadState;
    fValueRead: LREAL;
    stFileHeader: ST_ALY_FileHeader;
END_VAR

FB_ALY_CorrelationFunctionReference 2: Ausgänge

Name

Typ

Beschreibung

ipResultMessage

I_TcMessage

Beinhaltet nähere Informationen zum aktuellen Rückgabewert. Für diesen speziellen Schnittstellenzeiger ist intern sichergestellt, dass er immer gültig/zugewiesen ist.

bError

BOOL

Der Ausgang ist TRUE, wenn ein Fehler auftritt.

bNewResult

BOOL

Wenn ein neues Ergebnis berechnet wurde, ist der Ausgang TRUE.

bConfigured

BOOL

Zeigt TRUE an, wenn der Baustein erfolgreich konfiguriert ist.

bBusy

BOOL

TRUE, wenn der FB aufgrund von Dateizugriffen aktiv ist.

eState

E_ALY_ReadState

Aktueller Status des FB aufgrund des asynchronen Dateizugriffs.

fValueRead

LREAL

Wert des aus einer Datei gelesenen Datenpunkts.

stFileHeader

ST_ALY_FileHeader

Header-Informationen der gelesenen Datei.

FB_ALY_CorrelationFunctionReference 3:Methoden

Name

Definitionsort

Beschreibung

Call()

Local

Methode zur Berechnung der Ausgänge für eine bestimmte Konfiguration.

Configure()

Local

Allgemeine Konfiguration des Algorithmus mit seinen parametrisierten Bedingungen.

FB_init()

Local

Initialisieren der Anzahl der Eingangskanäle.

Reset()

Local

Setzt alle internen Zustände oder die bisher durchgeführten Berechnungen zurück.

SetChannelValue()

Local

Methode zur Übergabe von Werten an den Algorithmus.

GetChannelOutputArray()

Local

Abrufen des Ergebnis-Arrays für einen bestimmten Kanal, ohne neue Werte hinzuzufügen.

GetChannelOutputValues()

Local

Abrufen der Ergebnisse (Einzelwerte) für einen bestimmten Kanal, ohne neue Werte hinzuzufügen.

SwitchState_Idle()

Local

Initiieren des Wechsels vom Zustand Read in den Zustand Idle. Siehe Zustandsdiagramm.

SwitchState_Read()

Local

Initiieren des Wechsels vom Zustand Idle in den Zustand Read. Siehe Zustandsdiagramm.

UpdateState()

Local

Aktualisierung des Zustands, nachdem eine Zustandsänderung initiiert wurde und bis der Zielzustand nicht erreicht ist.

GetBusyState()

Local

Gibt TRUE zurück, wenn der FB aktiv ist.

Zustandsdiagramm

Aufgrund des asynchronen Dateizugriffs in Echtzeitanwendungen benötigt dieser Funktionsbaustein eine Zustandsmaschine, um den Dateizugriff vorzubereiten und abzuschließen.

Beim Start ist der Funktionsbaustein im Zustand Idle. Um die Daten aus der Datei zu lesen, muss er in den Zustand Read wechseln. Daher muss die Methode SwitchState_Read() einmal aufgerufen werden, um den Funktionsbaustein in den Zustand PendingRead zu versetzen. Anschließend muss die Methode UpdateState() aufgerufen werden, bis sich der Funktionsbaustein im Zustand Read befindet. In diesem Zustand kann der Baustein ein oder mehrere Zyklen durchlaufen. Wenn der Funktionsbaustein keine weiteren Zyklen vergleichen soll, kann er wieder in den Zustand Idle versetzt werden. Um den Zustandswechsel zu initiieren, muss die Methode SwitchState_Idle() aufgerufen werden. Anschließend muss die Methode UpdateState() aufgerufen werden, bis sich der Funktionsbaustein im Zustand Idle befindet.

Zustandsdiagramm für den Lesevorgang der Daten:

FB_ALY_CorrelationFunctionReference 4:

Beispiel

VAR
    fbCorrFctRef : FB_ALY_CorrelationFunctionReference(
        nNumChannels := 1,
        nMinLag := 0,
        nMaxLag := 10,
        nStepSize := 1,
        eWindowMode := E_ALY_WindowMode.FixWindow,
        eCorrelationMode := E_ALY_CorrelationMode.Normed,
        nWindowSize := 120,
        nSegmentSize := 400,
        tTimeout := TIME#5S,
        sFilePath := 'C:\TwinCAT\3.1\Boot\UnitTest_CorrelationFunction.tas');

    // State
    eState : E_ALY_ReadState := E_ALY_ReadState.Idle;
    bRead : BOOL;

    // Inputs
    fInputCh1 : LREAL;

    // Results
    fMinCoef : LREAL;
    fMaxCoef : LREAL;
    nMinimizingLag : DINT;
    nMaximizingLag : DINT;
    aCoefficients : ARRAY[-10..10] OF LREAL;
END_VAR
// Configure algorithm
IF bConfigure THEN
    bConfigure := FALSE;

    fbCorrFctRef.Configure(eCorrelationMode := eCorrelationMode, sFilePath := sFilePath );
END_IF

// Call algorithm
eState := fbCorrFctRef.eState;
CASE eState OF
E_ALY_ReadState.Idle:
    IF bRead THEN
        fbCorrFctRef.SwitchState_Read();
        fbCorrFctRef.UpdateState();
    END_IF
E_ALY_ReadState.Read:
    fbCorrFctRef.SetChannelValue(1, fInputCh1);
    fbCorrFctRef.Call();
    fbCorrFctRef.GetChannelOutputArray(1, ADR(aCoefficients), SIZEOF(aCoefficients));
    fbCorrFctRef.GetChannelOutputValues(1, fMinCoef, fMaxCoef, nMinimizingLag, nMaximizingLag);
    IF NOT bRead THEN
        fbCorrFctRef.SwitchState_Idle();
        fbCorrFctRef.UpdateState();
    END_IF    
E_ALY_ReadState.Pending,
E_ALY_ReadState.PendingIdle,
E_ALY_ReadState.PendingRead:
    fbCorrFctRef.UpdateState();
    eState := fbCorrFctRef.eState;
END_CASE

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken

TwinCAT v3.1.4024.0

PC oder CX (x64, x86)

Tc3_Analytics