Skip to main content

Definition persistenter Variablen

Einzelne Variablen sowie Strukturinstanzen und Instanzen von Funktionsbausteinen können über Attribute als "persistent“ gekennzeichnet werden. Bei Kennzeichnung einer Instanz werden alle Mitglieder von VAR, VAR_INPUT und VAR_OUTPUT persistent gespeichert. Wenn Variablen in einem VAR PERSISTENT-Abschnitt mit einem Attribut als "persistent“ gekennzeichnet werden, wird eine Warnung ausgegeben.

Außerdem gibt es Attribute zur Definition einer Default-Speichergruppe, sowie zum gezielten Ausschließen von Variablen aus der persistenten Speicherung von Strukturen oder Funktionsbaustein-Instanzen.

Wenn die Deklarationen persistenter Variablen geändert wurden (Hinzufügen, Löschen, Umbenennen, anderer Datentyp), muss kein erneuter Composer Generierungslauf (Befehl Erzeugen) ausgeführt werden. Diese Änderungen werden in der Persistence Manager Instanz während des Übersetzens automatisch aktualisiert.

Zu den möglichen impliziten Konvertierungen im Falle einer Datentypänderung siehe: Parameter

Unterstützte Datentypen

Instanzen der folgenden Datentypen können nicht persistent gespeichert werden:

  • BIT

  • Pointer

  • Interfaces

  • Konstanten

  • Arrays von nicht persistent gespeicherten Datentypen

Alle übrigen Datentypen werden unterstützt. Das schließt z.B. Enumerationen, Unterbereichstypen, Arrays von Arrays und mehrdimensionale Arrays mit ein:

ARRAY[0..9] OF ARRAY[5..6, 7..8, 9..10] OF INT

Datentyp UNION

Damit die Instanz einer Union persistent gespeichert wird, muss zunächst eines ihrer Felder speziell als sogenannter „Repräsentant“ markiert werden. Dafür gibt es folgende drei Möglichkeiten:

  • Genau ein Feld in der Deklaration der Union ist mit dem Attribut ac_persist_union_representant gekennzeichnet (ohne Attributwert). Dieses Feld "repräsentiert“ die Union. Sein Wert wird stellvertretend für die gesamte Union gespeichert und wieder eingelesen.

  • Genau ein Feld der Union ist mit einem ac_persist Attribut gekennzeichnet, dies bestimmt gleichzeitig den Repräsentanten.

  • Die Instanz der Union ist mit dem Attribut ac_persist_union_set_representant gekennzeichnet, mit Attributwert. Der Attributwert ist der Name des Union-Felds, das als Repräsentant verwendet werden soll. Dieses Attribut überschreibt ein eventuell vorhandenes ac_persist_union_representant Attribut in der Deklaration der Union.Arrays von Union können auch gekennzeichnet werden. In diesem Fall wirkt das Attribut auf den Basistyp.

Beispiel 2. Beispiele

'ac_persist_union_representant'

TYPE UnionWithRep :
UNION
        di : DINT ;
        {attribute 'ac_persist_union_representant'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist'

TYPE UnionWithPersist :
UNION
        di : DINT ;
        {attribute 'ac_persist' := 'TestUnion'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist_union_set_representant‘

FUNCTION_BLOCK FBTestUnion
VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        u2 : UnionWithoutRep ;
END_VAR

Array of union

VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aElems ARRAY[0..7] OF SomeUnion ;

        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aaElems ARRAY[0..7] OF ARRAY[0..1] OF SomeUnion ;
END_VAR


. Damit ein Repräsentant gültig ist, muss er folgende Regeln erfüllen:
  • Der Repräsentant muss dieselbe Größe wie die gesamte Union haben. Ansonsten würden nicht die kompletten Daten gespeichert. Der Repräsentant darf auch keine Padding-Bereiche enthalten, also leere Datenbereiche, die vom Compiler eingefügt werden um die korrekte Ausrichtung der Daten im Speicher zu erreichen.

  • Die Zerlegung des Repräsentanten in primitive Datentypen darf keine Instanz vom Typ REAL oder LREAL oder Instanzen vom Typ STRING oder WSTRING haben.

  • Der Repräsentant muss einen unterstützten Datentyp haben (siehe oben). Der Repräsentant kann beispielsweise vom Typ Structure sein - die Struktur selber jedoch darf keine Pointer-Typen enthalten.

Attribut: 'ac_persist'

Das Attribut ‚ac_persist‚ kann verwendet werden für

  • Variablen

  • Instanzen von Strukturen

  • Instanzen von Funktionsbausteinen

  • Mitglieder von Strukturen

  • Mitglieder von Funktionsbausteinen

{attribute 'ac_persist' [ := '<PERSISTENCE_GROUP>']}

PERSISTENCE_GROUP ist der Name der Persistenzgruppe, der die Deklaration zugeordnet werden soll. Es muss ein gültiger IEC-Bezeichner sein. Wenn die Gruppenangabe weggelassen wird, dann erfolgt die Gruppenzuordnung über das Attribut 'ac_persist_set_default_group', das in diesem Fall definiert sein muss.

Wenn eine Struktur- oder FB-Instanz als persistent gekennzeichnet ist, dann wird ein Fehler bei der Generierung erzeugt, falls (mindestens) ein Member in der Deklaration der Instanz (oder einer dort verwendeten Deklaration) zusätzlich als persistent gekennzeichnet ist.

Beispiel 3. Beispiel für persistente Instanzen

Die Variable t wird der Persistenzgruppe PROCESS zugewiesen. Alle Member werden persistent gespeichert.

PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist' := 'PROCESS'}
        t : TON;
END_VAR


Beispiel 4. Beispiel für persistente Member eines Funkionsbausteins

Das Member iNumIOs wird der Persistenzgruppe CONFIG zugewiesen. Dieses Member wird für alle Instanzen des FBs persistent gespeichert (sofern nicht unterdrückt durch das Attribut 'ac_persist_exclude').

FUNCTION_BLOCK FB
VAR
        {attribute 'ac_persist' := 'CONFIG'}
        iNumIOs : INT := 0;
END_VAR


Attribut: 'ac_persist_set_default_group'

Wenn beim Attribut 'ac_persist' die Gruppenangabe weggelassen wird, muss bei einer FB- oder Struktur-Instanz, die die jeweilige Variable direkt oder indirekt enthält, eine Default-Gruppe gesetzt werden. Dies ist möglich durch das Attribut 'ac_persist_set_default_group'. Das Attribut kann auch für ein Member eines Funktionsbausteins gesetzt sein. Die innerste gefundene Definition von 'ac_persist_set_default_group' wird als Default-Gruppe für die Variable verwendet.

Das Attribut 'ac_persist_set_default_group' darf für eine Variable nicht gleichzeitig mit 'ac_persist' oder 'ac_persist_exclude' verwendet werden. Sollte dies der Fall sein, wird während des Übersetzens eine Fehlermeldung ausgegeben.

Beispiel 5. Beispiel für eine Default-Gruppe
FUNCTION_BLOCK FB_Util
VAR
        {attribute 'ac_persist'} // keine Gruppe
        i : INT := 0;
END_VAR
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_set_default_group' := 'PROCESS'}
        fbu1 : FB_Util;

        {attribute 'ac_persist_set_default_group'´ := 'CONFIG'}
        fbu2 : FB_Util;
END_VAR


Attribut: 'ac_persist_exclude'

Das Attribut 'ac_persist_exclude' wird verwendet, um eine Variable von der persistenten Speicherung auszuschließen, unabhängig davon ob in der Struktur- oder FB-Deklaration Members als persistent gekennzeichnet sind. Falls die Deklaration der Instanz keine persistenten Member enthält (direkt oder indirekt), wird bei der Generierung eine Warnung ausgegeben, dass das Attribut keine Auswirkung hat.

Beispiel 6. Beispiel für den Ausschluss von Variablen
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_exclude'}
        fb1 : FB;
END_VAR