FB_ALY_DynamicTimeWarping

Der Algorithmus Dynamic Time Warping vergleicht Eingangsdaten mit zuvor aufgenommenen Templates. Das Besondere an dem Algorithmus ist, dass auch Signale mit unterschiedlicher Geschwindigkeit oder aber auch verschobene Signale verglichen werden können. Als Ergebnis wird die Distanz zwischen dem Eingangssignal und dem jeweiligen Template ausgegeben. Je geringer die Distanz, desto gleicher sind die verglichenen Signale. Ist die Distanz 0, so sind beide Signale identisch. Die Höhe der Distanz ist abhängig von der Gleichheit aber auch von der Länge der Signale.

Der Vergleich beginnt, wenn das Signal des Flags Start Period TRUE ist. Ein Ergebnis wird ausgegeben, wenn das Signal des Flags Stop Period TRUE oder das Flag Start Period erneut TRUE ist.

Es wird empfohlen, Dynamic time Warping aufgrund des konkurrierenden Dateizugriffs nicht gleichzeitig mit Time Based Teach Path 1Ch zu verwenden. Stattdessen sollte zunächst ein Referenzsignal mit dem Time Based Teach Path 1Ch eingelernt werden und erst im Anschluss die Auswertung mithilfe des Dynamic time Warping erfolgen. Die Templates enthalten Referenzsignale, die zuvor mit dem Time Based Teach Path 1Ch aufgenommen wurden. In der Regel handelt es sich bei den Templates um wenige Hundert Stützpunkte. Daher ist eine Reduktion der Daten mit dem Baustein Downsampling 1Ch oft sinnvoll.

Syntax

Definition:

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

FB_ALY_DynamicTimeWarping 1: 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 eines Dateizugriffs aktiv ist.

eState

E_ALY_ReadState

Aktueller Status des FB aufgrund von asynchronen Dateizugriffen.

bExecutingCompare

BOOL

TRUE, wenn der Algorithmus die Hüllkurve verarbeitet, ansonsten FALSE. Der Hüllkurvenprozess beginnt, wenn das Flag bStartPeriod=TRUE ist.

nBestMatchIdx

UDINT

Gibt den Index des Templates mit der geringsten Distanz zum Eingangskanal aus.

stFileHeader

ST_ALY_FileHeader

Header-Informationen der zuletzt gelesenen Datei.

FB_ALY_DynamicTimeWarping 2: 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.

ConfigureChannel()

Local

Konfiguriert die Dateipfade der Templates.

FB_init()

Local

Initialisieren der Anzahl der Templates.

GetBusyState()

Local

Diese Methode liefert den Zustand Busy des Funktionsbausteins.

GetChannelOutputVaue()

Local

Methode für das Abholen von einzelnen Ausgangswerten aus dem Ausgangs-Array

GetChannelOutputArray()

Local

Methode für das Abholen des gesamten Ausgangs-Arrays.

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.

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.

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 eingehenden Daten mit den Daten aus der Datei zu vergleichen, 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 können ein oder mehrere Vergleichszyklen durchlaufen werden. 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_DynamicTimeWarping 3:

Beispiel

VAR
    fbDynamicTimeWarping : FB_ALY_DynamicTimeWarping(nNumChannels := 3);
    tTimeout : TIME := T#5S;
    sFilePath1 : STRING := 'C:\TwinCAT\3.1\Boot\Template1.tas';
    sFilePath2 : STRING := 'C:\TwinCAT\3.1\Boot\Template2.tas';
    sFilePath3 : STRING := 'C:\TwinCAT\3.1\Boot\Template3.tas';
    
    bConfigure : BOOL := TRUE;
    eState : E_ALY_ReadState := E_ALY_ReadState.Idle;    
    bRead : BOOL;
    fInput : LREAL;
    bStartPeriod : BOOL;
    bStopPeriod : BOOL;
    
    aDistances : ARRAY[1..3] OF LREAL;
END_VAR
// Configure algorithm
IF bConfigure THEN
    bConfigure := FALSE;
    fbDynamicTimeWarping.ConfigureChannel(1, sFilePath1);
    fbDynamicTimeWarping.ConfigureChannel(2, sFilePath2);
    fbDynamicTimeWarping.ConfigureChannel(3, sFilePath3);
    fbDynamicTimeWarping.Configure(tTimeout);    
END_IF

// Call algorithm
eState := fbDynamicTimeWarping.eState;
CASE eState OF
E_ALY_ReadState.Idle:
    IF bRead THEN
        fbDynamicTimeWarping.SwitchState_Read();
        fbDynamicTimeWarping.UpdateState();
    END_IF
E_ALY_ReadState.Read:
    fbDynamicTimeWarping.SetChannelValue(fInput);
    fbDynamicTimeWarping.Call(bStartPeriod:=bStartPeriod, bStopPeriod:=bStopPeriod);
    
    IF NOT bRead THEN
        fbDynamicTimeWarping.SwitchState_Idle();
        fbDynamicTimeWarping.UpdateState();
    END_IF    
E_ALY_ReadState.Pending,
E_ALY_ReadState.PendingIdle,
E_ALY_ReadState.PendingRead:
    fbDynamicTimeWarping.UpdateState();
    eState := fbDynamicTimeWarping.eState;
END_CASE

// Get results
fbDynamicTimeWarping.GetOutputArray(pArrayOut:=ADR(aDistances), nArrayOutSize:=SIZEOF(aDistances));

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken

TwinCAT v3.1.4024.0

PC oder CX (x64, x86)

Tc3_Analytics