SA0161: Ungepackte Struktur in gepackter Struktur

Funktion

Ermittelt ungepackte Strukturen, die in gepackten Strukturen verwendet werden.

Begründung

Eine ungepackte Struktur legt der Compiler normalerweise auf eine Adresse, die einen ausgerichteten (alignten) Zugriff auf alle Elemente innerhalb der Struktur erlaubt. Wenn Sie diese Struktur in einer gepackten Struktur anlegen, dann ist ein alignter Zugriff nicht mehr möglich, und ein Zugriff auf ein Element in der ungepackten Struktur kann zur Laufzeit zu einer “Misalignment Exception” führen.

Wichtigkeit

Hoch

Beispiel:

Die Struktur ST_SingleDataRecord ist gepackt, enthält jedoch Instanzen der ungepackten Strukturen ST_4Byte und ST_9Byte. Dies resultiert jeweils in einer Fehlermeldung SA0161.

{attribute 'pack_mode' := '1'}
TYPE ST_SingleDataRecord :
STRUCT
    st9Byte          : ST_9Byte; // => SA0161
    st4Byte          : ST_4Byte; // => SA0161
    n1               : UDINT;
    n2               : UDINT;
    n3               : UDINT;
    n4               : UDINT;
END_STRUCT
END_TYPE

Struktur ST_9Byte:

TYPE ST_9Byte :
STRUCT
    nRotorSlots      : USINT;
    nMaxCurrent      : UINT;
    nVelocity        : USINT;
    nAcceleration    : UINT;
    nDeceleration    : UINT;
    nDirectionChange : USINT;
END_STRUCT
END_TYPE

Struktur ST_4Byte:

TYPE ST_4Byte :
STRUCT
    fDummy           : REAL;
END_STRUCT
END_TYPE