SA0170: Adresse einer Ausgabevariablen sollte nicht verwendet werden

Funktion

Ermittelt Codestellen, an denen die Adresse einer Ausgabevariablen (VAR_OUTPUT, VAR_IN_OUT) eines Funktionsbausteins verwendet wird.

Begründung

Es ist nicht erlaubt, in folgender Weise die Adresse eines Funktionsbausteinausgangs zu verwenden:

  • Via ADR-Operator
  • Via REF=

Ausnahme

Es wird kein Fehler gemeldet, wenn die Ausgabevariable innerhalb desselben Funktionsbausteins verwendet wird.

Wichtigkeit

Mittel

Beispiel:

Funktionsbaustein FB_Sample:

FUNCTION_BLOCK FB_Sample
VAR_INPUT
    nIn          : INT;
END_VAR
VAR_OUTPUT
    nOut         : INT;
END_VAR
VAR
    pFB          : POINTER TO FB_Sample;
    pINT         : POINTER TO INT;
END_VAR
IF pFB <> 0 THEN
    pINT := ADR(pFB^.nOut);                    // => SA0170
END_IF
 
nOut := nIn;
pINT := ADR(THIS^.nOut);                       // no error due to internal usage
pINT := ADR(nOut);                             // no error due to internal usage

Zugriffe innerhalb eines anderen Bausteins, in diesem Fall im Programm MAIN:

PROGRAM MAIN
VAR
    fbSample     : FB_Sample;
    pExternal    : POINTER TO INT;
    refExternal  : REFERENCE TO INT;
END_VAR
pExternal   := ADR(fbSample.nOut);             // => SA0170
refExternal REF= fbSample.nOut;                // => SA0170