Division Checks (POUs CheckDivDInt, CheckDivLInt, CheckDivReal, CheckDivLReal)

Funktionen zur Vermeidung des Divisor-Werts „0“: CheckDivDInt, CheckDivLInt, CheckDivReal und CheckDivLReal

Um ein Teilen durch 0 zu vermeiden, können Sie die Funktionen CheckDivDInt, CheckDivLInt, CheckDivReal und CheckDivLReal verwenden. Wenn Sie diese Funktionen in das SPS-Projekt einbinden, werden sie vor jeder im Code auftretenden Division aufgerufen.

Division Checks (POUs CheckDivDInt, CheckDivLInt, CheckDivReal, CheckDivLReal) 1:

Deklarationsteil nicht verändern

Um die Funktionalität der Überwachungsfunktionen zu erhalten, dürfen Sie den Deklarationsteil nicht verändern. Als einzige Ausnahme dürfen Sie lokale Variablen hinzufügen.

Standardimplementierung der Funktion CheckDivReal

Deklarationsteil:

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckDivReal : REAL
VAR_INPUT
    divisor : REAL;
END_VAR

Implementierungsteil:

// Implicitly generated code : Only an Implementation suggestion
{noflow}
IF divisor = 0 THEN
    CheckDivReal := 1;
ELSE
    CheckDivReal := divisor;
END_IF
{flow}

Der Operator DIV verwendet die Ausgabe der Funktion CheckDivReal als Divisor. Im unten stehenden Beispielprogramm verhindert diese Funktion eine Division durch 0 dadurch, dass der implizit mit „0“ initiierte Wert des Divisors fDivisor vor Ausführung der Teilung von der Funktion CheckDivReal in 1 geändert wird. Somit lautet das Ergebnis der Division 799.

PROGRAM MAIN
VAR
    fResult   : REAL;
    fDivident : REAL := 799;
    fDivisor  : REAL := 0;
END_VAR
fResult := fDivident / fDivisor;

Beispiel: Erzeugung eines Core Dumps zur Laufzeit in CheckBounds()

Im Folgenden finden Sie ein Beispiel, bei dem die Funktion CreateCallstackCoreDump() in der Funktion Bound Checks (POU CheckBounds) für implizite Prüfungen aufgerufen wird.

Dadurch können Sie herausfinden, in welcher Codezeile ein möglicher Zugriff außerhalb der gültigen Arraygrenzen stattfindet, ohne die Laufzeit mittels Haltepunktes anzuhalten.

Durch den Aufruf von CreateCallstackCoreDump() innerhalb der entsprechenden IF-Zweige von CheckBounds() wird die Aufrufliste (Call Stack) mit der Position des fehlerhaften Arrayzugriffs während der Laufzeit in einem Core Dump gespeichert und kann für Analysezwecke zu einem passenden Zeitpunkt geladen werden.

Funktion CheckBounds:

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
// Implicitly generated code: Only an implementation suggestion
{noflow}
IF index < lower THEN
CreateCallstackCoreDump('CheckBounds_IdxTooLow');
CheckBounds := lower;
ELSIF index > upper THEN
CreateCallstackCoreDump('CheckBounds_ IdxTooHigh');
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF

Dabei wird beispielsweise ein Core Dump mit dem folgenden Namen erstellt:

Port_851_CallStackDump_CheckBounds_IdxTooLow.2322085807.core

Siehe auch: