Benannte Konstanten

Benannte Konstanten

Für Eingänge an Funktionsbausteinen vom Typ MC_LREAL können spezielle Eingangswerte verwendet werden (siehe Kapitel MC_LREAL/Spezielle Eingangswerte). Die MC3 nutzt ausschließlich den Standard-Datentyp LREAL anstatt MC_LREAL und unterstützt die Verwendung der so genannten Benannten Konstanten.

Benannte Konstanten sind stille NaN-Werte nach IEEE 754, um nicht initialisierte oder ungültige Daten zu signalisieren. Die Mantisse ist in einem Beckhoff-spezifischen Bit-Pattern kodiert. Der Vorteil ist eine erhöhte Lesbarkeit z. B. in der Online-Ansicht. So kann z. B. der bisherige Default-Wert 0 als Platzhalter für die Default-Dynamiken oder den realen Wert 0 interpretiert werden. In diesem Fall sind Fehlinterpretationen oder falsche mathematische Operationen möglich.

Zu den wesentlichen Eigenschaften von NaN-Werten zählen die folgenden Punkte:

  • Alle arithmetischen Operationen, die NaN als Eingangsdaten verwenden, liefern wiederum NaN als Ergebnis.
  • Alle relationalen Operatoren =, !=, > < >= <= liefern stets den Wert False, wenn mindestens einer der Operanden NaN ist.
  • Die Standard-C-Funktionen isnan() bzw. _isnan() oder die SPS-Funktionen LrealIsNaN() und RealIsNaN() (Tc2_Utilities Bibliothek) liefern den Wert True, wenn das Argument den Wert NaN hat.
  • Der Ausdruck isnan(a) ist äquivalent dem Ausdruck !(a == a) bzw. NOT(a = a).

Die Tatsache, dass NaN-Werte sich bei der Verwendung in weiteren Berechnungen fortpflanzen, hat den Vorteil, dass ungültige Werte nicht übersehen werden können.

VORSICHT

Fehlfunktionen der Software

NaN-Werte führen zu potenziell gefährlichen Fehlfunktionen der betreffenden Software!

  • Verwenden Sie nur ausdrücklich zugelassene NaN-Werte insbesondere als Stellwerte in Funktionen für Motion Control und zur Antriebssteuerung.

Weitere Erläuterungen finden Sie im Kapitel NaN-Werte.

Die Syntax zur Verwendung in der PLC ist STRING_TO_LREAL('[Wert]') oder die Kurzform TO_LREAL('[Wert]'). Für die MC3 können die folgenden Konstanten verwendet werden:

Wert

Bedeutung

Beispiel

#Invalid

Ungültiger Wert

Default Eingangswert bei MC_MoveVelocity.Velocity, da dieser Eingang bei der Verwendung des Bausteins beschrieben werden muss.

#Default

Kann verwendet werden, um z. B. die Default-Dynamik der Achse als Eingabe für Funktionsbausteine zu verwenden.

MC_MoveAbsolute.Velocity := TO_LREAL(#Default);

#Ignore

Kann verwendet werden, um Eingänge oder Randbedingungen zu deaktivieren.

Einseitiges deaktivieren der Softwareendlagen.

Ableitungen der Position als Eingabe bzw. Randbedingung für die MotionFunctionPoints (Camming) als zu ignorieren zu definieren.

#Maximum

Kann verwendet werden, um z. B. die maximalen Dynamiken der Achse als Eingabe für Funktionsbausteine zu verwenden.

MC_MoveVelocity.Velocity := TO_LREAL(#Maximum);

#MaximumNegative

Kann verwendet werden, um z. B. die invertierten maximalen Dynamiken der Achse als Eingabe für Funktionsbausteine zu verwenden.

MC_MoveVelocity.Velocity := TO_LREAL(#MaximumNegative);

#DefaultNegative

Kann verwendet werden, um z. B. die invertierten Default-Dynamiken der Achse als Eingabe für Funktionsbausteine zu verwenden.

MC_MoveVelocity.Velocity := TO_LREAL(#DefaultNegative);

Die Syntax und Verwendung benannter Konstanten sind mit TwinCAT 3.1 Build 4026.25 optimiert und nachfolgend beschrieben.

Benannte Konstanten 1:

Verfügbar ab TwinCAT 3.1 Build 4026.25

Sonderwerte wie z. B. NaN (Not a Number) werden nun als typsichere Konstante bereitgestellt. Über den Namensraum LREAL_CONST erhält man Zugriff auf folgende Variablen:

Konstante

Bedeutung

DEFAULT

Anwendungsspezifischer Standardwert (positiv)

IGNORE

Markerwert „nicht auswerten"

INVALID

Markerwert für ungültige Größe

MAXIMUM

Größter endlicher positiver Wert 

DEFAULT_NEGATIVE

Anwendungsspezifischer Standardwert (negativ)

MAXIMUM_NEGATIVE

Größter endlicher negativer Wert 

NAN

Not a Number

INFINITY

Positiv unendlich

INFINITY_NEGATIVE

Negativ unendlich

Beispiel: Verwendung

VAR
    fNumerator : LREAL;
    fDenominator : LREAL;
    fResult : LREAL
END_VAR
IF fDenominator = 0 THEN
    fDenominator := LREAL_CONST.NAN;// invalid: division by zero
END_IF
    fResult := fNumerator / fDenominator;