# Verständnis Retain Persistent



## vollmi (15 März 2012)

Hallo zusammen. Ich habe eine frage wegen der Variablendeklaration in Codesys.

Man kann ja Variablen in VAR RETAIN PERSISTENT deklarieren das sie erhalten bleiben (in der Anleitung alles gut beschrieben).

Dasselbe auch in der Schnittstelle eines  FBs.
Aber was muss mit der Deklaration des FBs selber passieren? 

```
FUNCTION_BLOCK FB_PRISM
VAR RETAIN PERSISTENT
    wlastCMDH    : WORD; (* Datenpunkt letzter Schaltbefehl Hand Signal *)
    wlastCMDA    : WORD;  (* Datenpunkt letzter Schaltbefehl Automatik Signal *)
END_VAR
```


Muss ich die Instanz selber auch in VAR RETAIN PERSISTENT deklarieren wenn ich im FB selber RETAIN PERSISTENT nutze?

```
VAR RETAIN PERSISTENT
    VOR01_Q16280_GR_N1    : FB_PRISM;
    VOR01_Q16280_GR_N2    : FB_PRISM;
    VOR02_Q16280_GR_N1    : FB_PRISM;
    VOR02_Q16280_GR_N2    : FB_PRISM;
    VOR_Q16280_GR_G1    : FB_PRISM;
END_VAR
```

Oder kann ich die Deklaration im normale VAR machen?

```
VAR 
    VOR01_Q16280_GR_N1    : FB_PRISM;
    VOR01_Q16280_GR_N2    : FB_PRISM;
    VOR02_Q16280_GR_N1    : FB_PRISM;
    VOR02_Q16280_GR_N2    : FB_PRISM;
    VOR_Q16280_GR_G1    : FB_PRISM;
END_VAR
```


mfG René


----------



## RobiHerb (15 März 2012)

Bei der SPS, die ich bevorzugt benutze (Intercontrol) wird durch das REATAIN nur festgelegt, dass die Variablen in einem Bereich liegen, der persistent gemacht werden kann.

Man kann nach Beschreiben der Variablen einen Funktion starten, die einen SAVE im EEProm auslöst oder aber auch beim Runterfahren (Spannungsabschalten) im letzten Zyklus diese Funktion aufrufen. Die SPS hat eine kleine Hardware Pufferung des SPS Kerns, damit der letzte Zyklus erkannt und sicher durchgeführt werden kann und auch alle Ausgänge in eine sichere Lage geschaltet werden.

Das ganze dürfte aber bei jeder Hardware der verschiedenen Hersteller proprietär gelöst sein.


----------



## Simatiker (15 März 2012)

Hallo,


			
				vollmi schrieb:
			
		

> Aber was muss mit der Deklaration des FBs selber passieren?


Laut CoDeSys OnlineHelp wird die ganze POU als _Retain Persistant_ behandelt sobald auch nur eine variable der POU diese Eigenschaft hat. Egal wie die Instance deklariert wird.
Das trifft aber nicht unbedingt auf alle Hersteller/Anbieter zu, die auf CoDeSys basieren. Bei Schneider Electric (SoMachine) z.Bsp. hat das Keyword _Persistent_ keine Bedeutung, für Persitente variablen muss eine extra Variblen-Liste (Persistent_Table) angelegt werden. Und es werden nur Variablen als Retain behandelt, welche auch unter VAR_RETAIN deklariert wurden.



			
				vollmi schrieb:
			
		

> Muss ich die Instanz selber auch in VAR RETAIN PERSISTENT deklarieren wenn ich im FB selber RETAIN PERSISTENT nutze?


Bei CoDeSys nicht.



			
				vollmi schrieb:
			
		

> Oder kann ich die Deklaration im normale VAR machen?


Bei CoDeSys ja.


----------



## Simatiker (15 März 2012)

Hallo,
also irgendwie stimmt das doch nicht so ganz wie oben beschrieben.
Wenn du in einem *FB* eine Variable als _Retain_ deklarierst wird die komplette Instance des *FB*s im seperaten Speicher für _Retain_ Variablen gespeichert, aber nur die Variablen als _Retain_ behandelt welche auch als _Retain_ deklariert sind. Bei einem *Programm* werden nur die als _Retain_ deklarierten Variablen im Speicher für _Retain_ Variablen abgelegt.
Zu _Persistent_ Variablen steht, das diese nur in einer speziellen GVL deklariert *"Persistent Variables"* werden können. Dazu muss das Zielsystem natürlich über einen Speicherbereich verfügen der das Verhalten der _Persistent_ Variablen unterstützt.

Das würde jetzt in Deinem Fall bedeuten, die entsprechenden Variablen deines Bausteines sind nur _Retained_. Vorrausgesetzt Du hast die Instance zwischen VAR...END_VAR deklarierst. Wenn Du Instance des FBs zwischen VAR_RETAIN...END_VAR deklarierst ist der komplette FB _Retained_. Und wenn Du die Instance des FBs in einer speziellen GVL "Persistent Variables" deklarierst ist der komplette Baustein _Persistent_.

Ich glaube nun ist die Verwirrung perfekt.

Ich beziehe mich hier auf CoDeSys V3!


----------



## vollmi (16 März 2012)

Simatiker schrieb:


> Hallo,
> Ich glaube nun ist die Verwirrung perfekt.



Nö garnicht. Ich benutze zwar V2.3 auf Wago. Aber demzufolge ist es ausreichend wenn ich im FB die Variablen die ich brauche auf Retain Persistent setze. Die Instanz des Bausteins muss ich nicht nochmal retain persistent deklarieren.

mfG René


----------



## Gerri (26 März 2012)

Retain . Speicerung erfolgt über Adressen, Persistent über den Symbolischen Namen, ist also sicherer. Wie gespeichert wird hängt von der STeuerung ab. Manche haben einen NovRAM, dazu gibt es FB´s. Manche haben das On-Board mittels USV oder integriert mittels modul. Da muss man dann nix machen. Mache haben gar nix und es muss auf den Flash geschrieben werden. Hier muss man vorsichtig sein um den Flash nicht durch zu häufiges schreiben zu zerstören


----------

