# Fragen zu RETAIN und PERSISTENT (TwinCAT)



## suud (9 Oktober 2008)

Hallo,
verstehe ich das richtig, dass nur die PERSISTENT Variablen ihren Wert auch über einen Neustart des PCs hinaus behalten?
Welchen Sinn hat dann "VAR RETAIN PERSISTENT"?
Und warum muss bei RETAIN die komplette FB-Instanz im Retain-Bereich gespeichert werden, bei PERSISTENT aber nicht?! Bzw. wenn ich einen kleinen FB mit einer einzigen RETAIN Variablen als Baustein in einem sehr viel größeren FB benutze, dann wird praktisch mein komplettes SPS-Programm im Retain-Bereich gespeichert. Ist zwar kein Problem den Bereich zu vergrößern, aber hat das nicht auch negative Auswirkungen z.B. auf die Performanz?
Also was deklariert man am besten RETAIN, was PERSISTENT und was "RETAIN PERSISTENT"?
:s17:


----------



## Bührer (9 Oktober 2008)

Hallo suud

Ich kenne mich da auch nicht gerade gut aus. Die RETAIN daten werden bei "PLC RESET","Alles bereinigen" und "Urlöschen". Die PERSITENT daten nur beim "Urlöschen"

Damit RETAIN und PERSITENTgespeichert werden, muss das Windows heruntergefahren werden (Einfach den Hauptschalter ausschalten ist nicht gerade gut). Es gibt auch einen Funktionsblock um die Persitenten Daten zu schreiben. Ich rate dir aber ab, Daten die viel ändern mit diesem Funktionsblock immer wieder zu schreiben. Beim Schreiben wird immer wieder eine neue Datei auf dem Flash erzeugt (In dieser Zeit sollte die Anlage nicht abgeschaltet werden).

Ich verwende darum das NVRAM zur Datensicherung(Aktueller job) . Du kannst Variablen über den Systemmanager mit dem NVRAM verbinden. Das geht gut bei einem CX1010 (Grosse rechenleistung). Bei einem CX9000(kleine Rechenleistung) ist es aber besser du schreibst die Daten selbst mit einem Funktionsblock. Da du sonst zu viel Rechenleistung verlierst.

Die Persitenten Daten verwende ich um verschiedene Jobs zu speichern. Also Daten die im laufenden Betrieb nicht gebraucht werden. Bei einem CX9000 würde ich das aber nicht machen. Das Flash ist dort in der SPS eingebaut (kein compactflash) und nicht sehr schnell. Der CX9000 hat ja dafür sehr viel NVRAM. Da hat es genug Platz für die verschiedenen Jobs.

Falls du die Persitenten Daten verwendest und du die SPS mit dem Powerschalter abschalten willst, musst du die Persitenten Daten gleich nach dem Start der SPS einmal schreiben. Den die SPS kopiert sie in ein old um.

Gruss

Thomas


----------



## suud (9 Oktober 2008)

Das mit dem Urlöschen kann aber doch nicht der einzige Unterscheid sein?
Was bewirkt denn folgende Deklaration?:

```
VAR RETAIN PERSISTENT
     MaxValue: INT;
END_VAR
```


----------



## Bührer (10 Oktober 2008)

VAR RETAIN PERSISTENT
     MaxValue: INT;
END_VAR
Das kann man ja wirlich übersetzten.

Ich habe "gegoogelt" und folgendes gefunden:

http://www.ipsta.de/download/automationstechnik/Kap4_CoDeSys.pdf

Auf den Seiten 4-8 und 4-9 ist es noch gut beschrieben.

Gruss

Thomas


----------



## suud (10 Oktober 2008)

Danke. Allerdings kann die Tabelle auf Seite 4-9 oben eigentlich nicht ganz richtig sein, denn PRESISTENT Variablen werden bei einem Reset ja nicht neu 
initialisiert, RETAIN Variablen allerdings schon (jedenfalls bei TwinCAT). In der Tabelle ist es aber genau umgekehrt?!
Und wenn beides nur beim geregeleten Neustart gespeichert wird, warum müssen dann RETAIN Variablen zusammen mit den kompletten Instanzen aller übergeordneter FBs gespeichert werden, PERSISTENT Daten aber nicht? Könnte mir nur vorstellen, dass das was damit zu tun hat, dass PERSISTENT Daten mit Instanzpfad und Symbolnamen abgelegt werden...

Ich habe nun noch an anderer Stelle gelesen, dass bei Controllern mit NVRAM die RETAIN Daten eben einmal pro Zyklus dort abgespeichert werden und PERSISTENT nur beim geregelten Neustart/Ausschalten und nicht im NVRAM. Hier wären also auch die RETAIN-Daten Nullspannungssicher.

Also eine eindeutige Definition was wann wie wo gepeichert wird scheint es wohl nicht zu geben? Ich glaube ich entscheide mich einfach für eine Variante und denke dann nicht weiter drüber nach...


----------



## Bührer (10 Oktober 2008)

"Ich habe nun noch an anderer Stelle gelesen, dass bei Controllern mit NVRAM die RETAIN Daten eben einmal pro Zyklus dort abgespeichert werden und PERSISTENT nur beim geregelten Neustart/Ausschalten und nicht im NVRAM. Hier wären also auch die RETAIN-Daten Nullspannungssicher."

Das gilt bei Beckhoff CX9000-CX1030 aber nicht. Mit Persistent und retain werden die Daten nicht ins NVRAM gespeichert sondern ins Flash. 

Was hast du für eine SPS?

Das Pdf dokument beschreibt codesys nicht die Umsetztung von Beckhoff. Was verstehst du unter Reset? Menu Online->Reset

Gruss

Thomas


----------



## Eliza (10 Oktober 2008)

Schließe mich dem an: guck ins Handbuch der Steuerung. Kenne die Thematik nur von WAGO und da ist es z. T. auch steuerungsabhängig, so dass man teilweise keine RETAIN PERSISTENT anlegen kann.
Also zumindest das Handbuch für den 750-841 erklärt den Zusammenhang (auch mit den Speicherbereichen) ganz gut, auch die Reaktionen auf die einzelnen Resets. Aber: nicht einfach auf Beckhoff übertragen sondern da mal das entsprechende Handbuch durchwälzen.


----------



## suud (10 Oktober 2008)

Ich benutze hier TwinCAT PLC auf einem "normalen" PC.
Mit Reset meine ich den Online-Reset in der PLC.
Und in der Online-Hilfe werden meine Fragen leider auch nicht so wirklich beantwortet. 
Ich bin halt davon ausgegangen, dass die Spezifikation das Verhalten relativ klar vorgibt und nicht, dass da jeder Hersteller sein eigenes Süppchen kochen kann.

Worum es mir ja eigentlich geht ist, ob es negative Auswirkungen hat, wenn mein Retain-Bereich ca. 1MB oder noch größer wird. Und das nur weil es mehrere sehr grosse FBs gibt, die alle irgendwo einen ganz kleinen FB mit einer Retain-Variablen verwenden (z.B. gibt es in der Oscat-Lib ein paar FBs mit RETAIN-Variablen).
Im Prinzip kann ich mir das ja sparen und die entsprechenden Variablen auch einfach persistent machen.


----------



## Bührer (10 Oktober 2008)

"dass die Spezifikation das Verhalten relativ klar vorgibt und nicht, dass da jeder Hersteller sein eigenes Süppchen kochen kann" 

ja das wäre schön ....


" auf einem "normalen" PC "

Dann hast du aber auch kein NVRAM


----------



## suud (10 Oktober 2008)

Bührer schrieb:


> " auf einem "normalen" PC "
> 
> Dann hast du aber auch kein NVRAM


TwinCAT könnte aber so tun als gäbe es eins.
In der Online-Hilfe steht z.B. 
"_Ein Anwendungsbeispiel für Retain Variablen wäre ein Stückzähler in einer  Fertigungsanlage, der nach einem Stromausfall weiterzählen soll_"
Das dürfte sich dann wohl auf die Bus-Controller mit NOVRAM beziehen.
Denn wenn beim PC nur bei geregletem Neustart/Runterfahren gespeichert wird, würde das nichts bringen.
Aber wenn auch beim PC pro Zyklus gespeichert wird, würde das das System extrem ausbremsen.


----------



## Bührer (10 Oktober 2008)

_"Worum es mir ja eigentlich geht ist, ob es negative Auswirkungen hat, wenn mein Retain-Bereich ca. 1MB oder noch größer wird. Und das nur weil es mehrere sehr grosse FBs gibt, die alle irgendwo einen ganz kleinen FB mit einer Retain-Variablen verwenden (z.B. gibt es in der Oscat-Lib ein paar FBs mit RETAIN-Variablen).
Im Prinzip kann ich mir das ja sparen und die entsprechenden Variablen auch einfach persistent machen"_

Vom timing her sollte es keine Auswirkung haben. Da in deinem Fall die Retain-Daten am anfang einmal gelesen werden um beim beenden einmal geschrieben werden. 

Wenn du aber etwas im FB veränderst, verlierst du die Retain-Daten.

Für mich ist es sauber wenn retain und Persitente Daten auch gleichzeitig Globale daten sind.


----------



## Bührer (10 Oktober 2008)

Beckhoff geht davon aus, dass eine USV verwendet wird, welche das Windows korrekt beendet.

Bei den PC- und ARM-Basierten SPS werden die Daten nicht mit den ausdrücken persitent und retain automatisch ins NVRAM gespeichert. Das muss man selbst machen (Im System Manager mit NVRAM verlinken oder über FB).


----------



## trinitaucher (10 Oktober 2008)

Ich habe bisher immer nur PERSISTENT genutzt, weil ich von der Beckhoff-Schulung noch im Kopf habe, dass PERSISTENT wirkliches "speichern" ist. Also Der letzte Wert vor dem PC-Reset bleibt erhalten. 
Die Variablen werden nicht mit ihren Initialwerten überschrieben. Nur ein "Urlöschen" löscht diese Variablen wieder ab.


----------



## MarkusP (12 Oktober 2008)

trinitaucher schrieb:


> Ich habe bisher immer nur PERSISTENT genutzt, weil ich von der Beckhoff-Schulung noch im Kopf habe, dass PERSISTENT wirkliches "speichern" ist. Also Der letzte Wert vor dem PC-Reset bleibt erhalten.
> Die Variablen werden nicht mit ihren Initialwerten überschrieben. Nur ein "Urlöschen" löscht diese Variablen wieder ab.



Zudem kann man die Dateien super über FTP wegsichern. Weiters wird wirklich *alles* gesichert, man kann nichts vergessen. Zudem kommt eine Änderung mit notwendigen Neustart des Systems bei meinen Anlagen nicht besonders gut.
Daher schließe mich Dir vollinhaltlich an.


----------



## Fx64 (12 Oktober 2008)

Persistente Vars sind deutlich robuster, da diese mit Name, Typ und Daten gespeichert werden. Retain ist nur ein Block, passt der nicht mehr durch Änderungen zueinander wird es schwierig für die Daten.

Viele Grüße


----------



## Bührer (13 Oktober 2008)

Fx64 schrieb:


> Persistente Vars sind deutlich robuster, da diese mit Name, Typ und Daten gespeichert werden. Retain ist nur ein Block, passt der nicht mehr durch Änderungen zueinander wird es schwierig für die Daten.




Werden Persitente daten wirklich anders gespeichert als retain?

Falls die Persitenten Daten wirklich anders gespeichert werden, wie kann ich es einstellen, dass wenn ich die Daten erweitert habe ich nicht die einstellungen der anderen Daten verliere?

Was passiert mit einem struct ?


----------



## Fx64 (13 Oktober 2008)

Hallo,

wenn Du das Speicherformat von beiden meinst ja, beide Daten werden aber letztlich in einer Datei gespeichert. Retain als fester Block, Resistent als einzelne Items. Änderst Du aber auch da einzelne Structs, wie willst dann die "alten" Persistent Daten noch laden? 

Viele Grüße


----------



## Bührer (13 Oktober 2008)

Fx64 schrieb:


> Änderst Du aber auch da einzelne Structs, wie willst dann die "alten" Persistent Daten noch laden?



Beim Starten werden die Daten initialisiert mit dem init Wert. Beim Öffnen der persitenten Daten werden die bekannten Variablen mit den Persitenten Daten gesetzt.  

So hätte man in den alten Variablen den gespeicherten Wert und in den neuen Wert den init Wert. Das sollte machbar sein wenn der Variablen Name mit dem Variablen Wert gespeichert wurde und nicht nur ein Speicher abbild.

Das wäre doch eine gute Lösung oder?  Kann das Twincat schon so etwas?

Gruss

Thomas


----------



## Fx64 (13 November 2008)

richtig Bührer, bei "PERSISTENT" werden die Daten per Variable gesichert und wieder geladen. Im Übrigen "belastet" NOVRAM sehr wohl das System, je nach System mehr oder weniger. Bei Verlinkung im System Manager wird im jedem Zyklus gesichert und NOVRAM ist auch nicht das Schnellste. Man kann aber auch SPS Bausteine nutzen, um Optimierungen zu machen - da muß man es selbst programmieren.

Viele Grüße


----------



## Bührer (13 November 2008)

Bei einem CX9000 kann man nur mit dem SPS-Baustein arbeiten. 128K verlinken mit einem 255 MHz Arm Prozessor ist nicht möglich. Bei einem CX1010 / CX1020 kann verlinkt werden. Da gibt es auch nur 8k Nvram.

Gruss

Thomas


----------



## Fx64 (13 November 2008)

Hallo Thomas,

CX9000 geht schon auch, kommt immer auf die Menge und die Zykluszeiten an ;-).

Viele Grüße


----------

