Verwendung von Funktionen und Methoden

Themenpunkte:

  1. Zurückgelieferte Fehlerinformationen einer POU auswerten [++]
  2. Rückgabewert einer Funktion/Methode verwenden [+]
  3. Funktionen/Methoden nicht in sich selbst aufrufen [+]

Zurückgelieferte Fehlerinformationen einer POU auswerten

Wenn eine Funktion, eine Methode oder ein Funktionsbaustein Fehlerinformationen liefert, werten Sie diese immer aus.

Static Analysis:

Thematisch empfohlene Static Analysis Regeln:

Negatives Beispiel:

PROGRAM Sample_neg 
VAR
    fbFileOpen    : FB_FileOpen;      // FileOpen-FB for logger
    bFileOpenExec : BOOL;             // Execute FileOpen-FB
END_VAR
// NON COMPLIANT: error information of fbFileOpen will not be used
fbFileOpen(
    sPathName := 'C:\TestFile.txt',
    nMode     := FOPEN_MODEWRITE OR FOPEN_MODETEXT,
    ePath     := PATH_GENERIC,
    bExecute  := bFileOpenExec,
    tTimeout  := T#3S);

Positives Beispiel:

PROGRAM Sample_pos 
VAR
    fbFileOpen        : FB_FileOpen;  // FileOpen-FB for logger
    bFileOpenExec     : BOOL;         // Execute FileOpen-FB
    bFileOpenError    : BOOL;         // Error flag of FileOpen-FB
    nFileOpenErrorID  : UDINT;        // Error code of FileOpen-FB
END_VAR
// COMPLIANT: error information will be handled
fbFileOpen(
    sPathName := 'C:\TestFile.txt',
    nMode     := FOPEN_MODEWRITE OR FOPEN_MODETEXT,
    ePath     := PATH_GENERIC,
    bExecute  := bFileOpenExec,
    tTimeout  := T#3S,
    bError    => bFileOpenError,
    nErrId    => nFileOpenErrorID);
 
IF bFileOpenError THEN
    F_DoSomethingUsefulHere();        // Handle error here
END_IF

Rückgabewert einer Funktion/Methode verwenden

Der Rückgabewert einer Funktion/Methode sollte an der Aufrufstelle der Funktion/Methode verwendet, d.h. abgefragt und ausgewertet, werden. Dies ist insbesondere sinnvoll, wenn auf diese Weise ein Fehlerwert zurückgegeben wird. Allerdings sind auch Ausnahmen möglich, bei denen der Rückgabewert nicht bei jedem Aufruf der Funktion/Methode verwendet werden muss.

Static Analysis:

Überprüfen mit Hilfe von Static Analysis Regel:

Allgemeine Programmelemente für diese Regel:

(* Function for all samples in this rule: Adds a message to logger system.
   Returns TRUE if successful, FALSE on Error. *)
FUNCTION F_AddLogMessage : BOOL 
VAR_INPUT
    sMessage        : WSTRING;        // Message to be logged 
    dtTimestamp     : DATE_AND_TIME;  // Timestamp of the message
END_VAR

Negatives Beispiel:

PROGRAM Sample_neg
VAR
    dtNow           : DATE_AND_TIME;  // Actual system time
END_VAR
// NON COMPLIANT: return value of function will not be used
F_AddLogMessage(sMessage := "Test Message", dtTimestamp := dtNow);

Positives Beispiel:

PROGRAM Sample_pos
VAR
    dtNow           : DATE_AND_TIME;  // Actual system time
    bSendMessageOk  : BOOL;           // Used to check if sending of message was successful
END_VAR
// COMPLIANT: return value of function will be used
bSendMessageOk := F_AddLogMessage(sMessage := "Test Message", dtTimestamp := dtNow);
 
IF NOT bSendMessageOk THEN 
    F_DoSomethingUsefulHere();        // Handle error here
END_IF

Funktionen/Methoden nicht in sich selbst aufrufen

Funktionen/Methoden sollten sich nicht direkt oder indirekt selbst aufrufen, um Rekursionen zu vermeiden. Auch in anderen Programmiersprachen als der IEC61131 sollten Sie Rekursionen nur mit Bedacht einsetzen.

Static Analysis:

Überprüfen mit Hilfe von Static Analysis Regel:

Negatives Beispiel:

FUNCTION F_Sample_neg : DWORD
VAR_INPUT
    nFac : DWORD;     // The faculty of this value will be calculated
END_VAR
--------------------------------------------------------------------
IF nFac = 0 THEN 
    F_Sample_neg := 1;
ELSE
    // NON COMPLIANT: implicit recursion. F_Sample_neg_IndirectFac calls F_Sample_neg
    F_Sample_neg := nFac * F_Sample_neg_IndirectFac(nFac := (nFac - 1));
END_IF
--------------------------------------------------------------------
--------------------------------------------------------------------
FUNCTION F_Sample_neg_IndirectFac : DWORD
VAR_INPUT
    nFac : DWORD;     // The faculty of this value will be calculated
END_VAR
--------------------------------------------------------------------
F_Sample_neg_IndirectFac := F_Sample_neg(nFac := nFac);

Positives Beispiel:

FUNCTION F_Sample_pos : DWORD
VAR_INPUT
    nFac : DWORD;     // The faculty of this value will be calculated
END_VAR
VAR
    nTemp   : DWORD;  // Temporary variable used to calculate faculty
    nCount  : DWORD;  // Counter variable used to calculate faculty
END_VAR
--------------------------------------------------------------------
nTemp := 1;
 
IF nFac > 0 THEN 
    FOR nCount := 1 TO nFac DO
        nTemp := nTemp * nCount; 
    END_FOR 
END_IF 
 
F_Sample_pos := nTemp;

 

Siehe auch: