Verwendung von Funktionen und Methoden
Themenpunkte:
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: