Funktionsbausteine

Grundstruktur der Funktionsbausteine

Alle Funktionsbausteine der Bibliothek Tc3_Filter basieren auf derselben Grundstruktur. Dies erleichtert das Engineering, wenn von einem Filtertyp zu einem anderen gewechselt wird.

Syntax

FUNCTION_BLOCK FB_FTR_<type>
VAR_INPUT
    stConfig        : ST_FTR_<type>;
END_VAR
VAR_OUTPUT
    bError          : BOOL;
    bConfigured     : BOOL;
    ipResultMessage : I_TCMessage;
END_VAR

Funktionsbausteine 1: Eingänge

Zur Konfiguration des Filters wird den Funktionsbausteinen bei der Instanziierung eine Konfigurationsstruktur vom Typ ST_FTR_<type> übergeben. Die Konfigurationsstruktur kann in der Deklaration oder über die Methode Configure() zur Laufzeit zugewiesen werden.

Siehe auch: Datentypen > Konfigurationsstrukturen

Beispiel zur Konfiguration in der Deklaration:

(* define configure structure – exemplary for IIRSpec *)
stParams : ST_FTR_IIRSpec := (
    eFilterName    := E_FTR_Name.eButterworth,
    eFilterType    := E_FTR_Type.eLowPass,
    nFilterOrder   := nFilterOrder,
    fSamplingRate  := fSampleRate,
    fCutoff        := fCutoff,
    nOversamples   := cOversamples,
    nChannels      := cChannels);
(* create filter instance with configure structure *)
fbFilter : FB_FTR_IIRSpec := (stConfig := stParams);

Funktionsbausteine 2: Ausgänge

Alle Funktionsbausteine haben als Ausgangsparameter ein Error-Flag bError und ein Flag bConfigured vom Typ BOOL. Diese zeigen an, ob ein Fehler vorliegt und ob die zugehörige Funktionsbausteininstanz erfolgreich konfiguriert wurde. Der Ausgang ipResultMessage vom Typ I_TcMessage bietet verschiedene Eigenschaften zur Erläuterung einer Event-Ursache sowie Methoden zur Verarbeitung der Message (Event-Liste).

Siehe auch: I_TcEventBase und I_TcMessage

Funktionsbausteine 3: Methoden

Alle Funktionsbausteine der Bibliothek Tc3_Filter verfügen über drei Methoden. Diese liefern einen positiven Rückgabewert, wenn sie fehlerfrei ausgeführt wurden.

Configure()

Die Methode kann zur Laufzeit verwendet werden, um die Instanz eines Filterbausteins initial zu konfigurieren (wenn nicht schon in der Deklaration geschehen) oder zu rekonfigurieren.

METHOD Configure : BOOL
VAR_INPUT
     stConfig : ST_FTR_<type>;
END_VAR

Call()

Die Methode berechnet aus einem Eingangssignal, das in Form eines Pointers übergeben wird, ein manipuliertes Ausgangssignal.

METHOD Call : BOOL
VAR_INPUT
     pIn        : POINTER TO LREAL; (*address of input array*)
     nSizeIn    : UDINT;            (*size of input array*)
     pOut       : POINTER TO LREAL; (*address of output array*)
     nSizeOut   : UDINT;            (*size of output array*)
END_VAR

Reset()

Die Methode setzt den internen Status eines Filters zurück. Der Einfluss der vergangenen Werte auf den aktuellen Ausgangswert wird eliminiert.

METHOD Reset : BOOL

Funktionsbausteine 4: Eigenschaften

Die Bibliothek Tc3_Filter referenziert auf den TwinCAT 3 EventLogger und stellt somit sicher, dass Informationen (Ereignisse) über die standardisierte Schnittstelle I_TcMessage bereitgestellt werden.

Jeder Funktionsbaustein verfügt über die Eigenschaften eTraceLevel vom Typ TcEventSeverity und eTraceLevelDefault vom Typ BOOL.

Das Trace-Level bestimmt die Severity eines Events (Verbose, Info, Warning, Error, Critical) und wird über die Eigenschaft eTraceLevel gesetzt.

(* Sample of setting fbFilter to trace level info *)
fbFilter.eTraceLevel := TcEventSeverity.Info;

Über die Eigenschaft eTraceLevelDefault kann das Trace-Level wieder auf den Standardwert (TcEventSeverity.Critical) gesetzt werden. Auf die Eigenschaft kann lesend und schreibend zugegriffen werden, d. h. über die Eigenschaft eTraceLevelDefault kann abgefragt werden, ob der Standardwert gesetzt ist.

Die Eigenschaften können auch im Online View gesetzt werden.

Funktionsbausteine 5:

Umgang mit Oversampling und mehreren Kanälen

Alle Funktionsbausteine sind Oversampling- und Multi-Channel-fähig, wobei unterschiedliche Arten der Nutzung möglich sind. Die Deklaration der Filter-Funktionsbausteininstanz fbFilter ist hier immer gleich.

Multi-Channel mit 2-dimensionalen Signal-Arrays

Die Definition eines 2-dimensionalen Arrays hat den Vorteil, dass die Definition allgemeingültig ist und der Parameter cChannels in anderen Projekten auch auf 1 gesetzt werden kann. Ebenso lassen sich die Kanäle im TwinCAT 3 Scope einzeln selektieren, sodass alle Kanäle unabhängig voneinander betrachtet werden können.

Darstellung des mehrdimensionalen Arrays im „Target Browser“:

Funktionsbausteine 6:

Beispiel:

VAR CONSTANT
    cChannels    : UINT := 2;
    cOversamples : UINT := 10;
END_VAR
VAR
    aInput : ARRAY [1..cChannels] OF ARRAY [1..cOversamples] OF LREAL;
    aOutput : ARRAY [1..cChannels] OF ARRAY [1..cOversamples] OF LREAL;
END_VAR
bSucceed := fbFilter.Call(ADR(aInput), SIZEOF(aInput), ADR(aOutput), SIZEOF(aOutput));

Multi-Channel mit 1-dimensionalen Signal-Arrays

Alternativ können die Abtastwerte der verschiedenen Kanäle auch in einem eindimensionalen Array liegen. Die Aufnahme der einzelnen Kanäle mit dem TwinCAT 3 Scope ist dann jedoch nicht so einfach möglich.

Beispiel:

VAR CONSTANT
     cChannels    : UINT := 2;
     cOversamples : UINT := 10;
END_VAR
VAR
     aInput  : ARRAY [1..cChannels*cOversamples] OF LREAL;
     aOutput : ARRAY [1..cChannels*cOversamples] OF LREAL;
END_VAR
bSucceed := fbFilter.Call(ADR(aInput), SIZEOF(aInput), ADR(aOutput), SIZEOF(aOutput));

Einkanalige Anwendung mit Oversamples

Wenn nur ein einzelner Kanal betrachtet wird, können die Ein- und Ausgangsarrays als eindimensionale Größen deklariert werden.

VAR CONSTANT
     cChannels    : UINT := 1;
     cOversamples : UINT := 10;
END_VAR
VAR
     aInput  : ARRAY [1..cOversamples] OF LREAL;
     aOutput : ARRAY [1..cOversamples] OF LREAL;
END_VAR
bSucceed := fbFilter.Call(ADR(aInput), SIZEOF(aInput), ADR(aOutput), SIZEOF(aOutput));

Einkanalige Anwendung ohne Oversamples

Wenn nur ein einzelner Kanal betrachtet und auch kein Oversampling angewendet wird, können die Ein- und Ausgangsgrößen auch als LREAL deklariert werden.

VAR CONSTANT
     cChannels    : UINT := 1;
     cOversamples : UINT := 1;
END_VAR
VAR
     fInput  : LREAL;
     fOutput : LREAL;
END_VAR
bSucceed := fbFilter.Call(ADR(fInput), SIZEOF(fInput), ADR(fOutput), SIZEOF(fOutput));