Retain Persistent werden nicht gespeichert

2017-05-08
2017-05-12
  • ColonelWastl - 2017-05-08

    Ich denke das Problem wurde hier schon 10000x angesprochen.

    Ich habe es auf viele Arten versucht. Was ich noch nicht gemacht habe ist die Werte einfach kommagetrennt in eine Datei zu schreiben und diese beim Hochlauf wieder auszulesen. Aber ich denke das wäre auch die letzte Möglichkeit.
    CodeSys sollte doch hierfür funktionierende Mechanismen mitbringen, oder?

    Mein Favorit:
    Ich habe eine Globale Variablenliste welche ich so definiere:
    VAR_GLOBAL RETAIN PERSISTENT
    daten: BOOL;
    END_VAR

    Bei einem qualifizierten Shutdown vom Raspi sollten diese Daten AUTOMATISCH gespeichert werden. Zumindest bei TwinCat funktioniert das so.

    Aber ok, ist ein Raspi, kein TwinCat.
    Deshalb habe ich es so versucht:

    Die Daten werden geschrieben, dann werden sie mit
    SysSaveRetains(ichbindiedatei.ret);
    gespeichert. Jedesmal wenn sich was ändert.

    Beim Neustart würde ich die Daten dann mit
    SysRestoreRetains(ichbindiedatei.ret);
    wieder herstellen.

    So einfach sollte es gehen. Leider sind die Daten nach Neustart, Shutdown -h now und anschließendem Neustart IMMER weg.
    Was mache ich hier falsch?
    Muss die Globale Variablenliste als Retain noch irgendwo bekannt gemacht werden? Oder muss ich als Namen für die .ret den Namen der Liste angeben?

    Gruß
    Sebastian

     
  • eschwellinger

    eschwellinger - 2017-05-09

    Hi,
    in der Tat, dann halt 10001 mal jetzt...

    Zitat:
    CodeSys sollte doch hierfür funktionierende Mechanismen mitbringen, oder?

    Ja tut es.. aber die Hardware haben wir halt nicht in der Hand.
    Dafür muss der User sorgen. (USV oder NVRAM-> was es aber beim Raspi nicht gibt)
    Wenn man bei den Twincat Steuerungen die Sekunden USV oder auch die normale USV rausbauen würde (oder auch das NVRAM)
    dann wäre man genau gleich weit wie mit dem Raspberry PI
    Also beim PI fehlt ein Stück Hardware das es so klappt wie du erwartest.

    Mal so generell den Mechanismus erklärt:

    Diese Persistent Retain Liste wird dann korrekt gespeichert wenn die Runtime korrekt beendet wird.
    D.h beim Raspberry PI ist ein "Ausschalten durch Spannung wegnehmen" kein korrektes beenden der SPS runtime!

    Also kann das konsequenterweise nur funktionieren wenn du eine USV am Pi verwendest die eben einen geregelten shutdown von Linux triggert.
    Übrigens tut die USV dem Raspberry PI generell sehr gut, weil auch die SD Karte ja korrupt werden kann, wenn man einfach die Versorgungsspannung wegnimmt, ohne einen Linux shutdown zu machen. (Wenn genau dann ein File geschrieben wird wenn man ausschaltet usw oft diskutiert - Google it) - Also so generell funktionieren die am besten wenn man die nie ausschaltet
    Bei jedem Windows PC hat jeder gelernt, das man Windows runterfährt und nicht nur einfach ausschaltet.

    Das Retain speichern selber über die Applikation, ist auch keine Lösung weil du ja nie den letzten Stand der Retains hast, sondern immer den Stand/Snapshot andem du das Speichern getriggert hast.

    Ich hatte hier mal alle Möglichkeiten beschrieben wie man Daten/Variablen auf dem Pi persistent machen könnte:
    l viewtopic.php?t=4924#p15917 l

    Alle diese Möglichkeiten haben so ihren Vorteil/Nachteil Schwächen.
    So wirklich zuverlässig wirds eben nur mit USV (auch wenn du selber deine Variablen in ein File schreibst, was passiert wenn beim Schreiben ein Stromausfall/Spannung weg? - nur mal theoretisch betrachtet)

    Grüße
    Edwin

     
  • ColonelWastl - 2017-05-09

    Hallo Edwin,

    USV ist dran. Das Raspi ist bei mir an der selben Spannungsversorgung wie mein Win7Server. Dieser ist an einer USV von APC. Habe mir hier auch eine Routine geschrieben um das Raspi kontrolliert herunterzufahren. (-> anpingen vom Server (24/7) alle 2 Minuten, wenn nach dem 2ten Versuch keine Antwort kommt wird das Raspi automatisch heruntergefahren).
    Wie ich geschrieben habe werden bei mir die Daten auch bei einem qualifizierten shutdown, also 'sudo shutdown -h now' NICHT gespeichert.

    Habe auch mal nur einen 'sudo reboot' versucht. Selbiges Problem. Im CodeSys habe ich hier die PersistentVar hinzugefügt, und meine Daten die ich hier speichern will alle eingetragen. Bzgl. des Snapshots der Variablen hast du natürlich recht. Die Daten sind im Prinzip beim Abspeichern schon wieder "alt".

    Dein Applikationsbeispiel vom englischen Forum habe ich schon mal geladen und bei mir integriert. Der Test steht noch aus. Aber auch hier werden die Daten ja nur durch einen "Trigger" gespeichert, oder? Wenn ich das auch richtig erkenne dann wird die Datei bei jedem Aufruf des Bausteins gelöscht, neu erzeug und geschrieben, und beim nächsten SPS Zyklus dann geladen.
    Wie kann ich diese dann aber sagen wir mal bei Neustart NUR laden? Gibt das dein Beispiel schon her oder muss ich hier noch was integrieren? (sollte kein Problem sein das zu machen, will nur sicher gehen dass ich deinen Code richtig interpretiere)

    Wenn ich heute zu Hause bin werde ich das alles gleich nochmals testen. Ich denke hier habe ich irgendwo was übersehen. Bzgl. der Hardware und der USV und so weiter sollte ich alles so beisammen haben wie es sein soll. Denn wenn ich das Raspi über den Linux Befehl 'sudo shutdown -h now' herunterfahre, dann sollten die PersistentVar's doch gespeichert werden, oder?

    PS: Danke dass du dich des Themas nochmals annimmst

    Gruß
    Sebastian

     
  • ColonelWastl - 2017-05-09

    Hallo Edwin,

    ich habe das heute nochmals getestet.
    Es funktioniert, WENN:

    Ich eine Globale Variablenliste anlege und hier nur VAR_GLOBAL RETAIN bzw. VAR_GLOBAL RETAIN PERSISTENT mit dran hänge.

    Es funktioniert NICHT, WENN:

    Ich "Persistente Variablen" anfüge und hier meine Deklaration mache.

    Siehe Bilder.

    Aber sei es drum, solange es funktioniert bin ich soweit zufrieden. Nur warum das mit den Persistenten Variablen nicht funktioniert ist eine andere Frage. Kann jedoch sein dass das Raspberry hier einfach die Hardware nicht mitbringt. Oder ich für diese "Funktion" noch mehr hätte machen müssen was ich in der Hilfe einfach überlesen habe.

    Vielen Dank

    Gruß
    Sebastian

    IMG: PersistentVars2.PNG

    IMG: PersistentVars.PNG

     
  • ColonelWastl - 2017-05-12

    Hallo nochmal,

    auch hier möchte ich noch dazu schreiben was ich nun gemacht habe damit alles funktioniert wie es soll.
    Wie in der Codesys Hilfe beschrieben, muss eine Persistene Variablenliste angelegt werden.

    Leider ist das in der Hilfe etwas unglücklich beschrieben, deshalb möchte ich hier noch kurz schreiben wie ich es nun gemacht habe.

    Alle Variablen die Ihr sichern wollt, WELCHE ABER NUR BEI EINEM RICHTIGEN SHUTDOWN DES RAPSI GESPEICHERT WERDEN, müsst Ihr immer als VAR RETAIN, VAR RETAIN PERSISTENT oder VAR PERSISTENT kennzeichen.
    Nun könnt ihr eine Persistent Variablenliste anlegen. Diese bleibt zum Anfang noch leer.

    Erst wenn man jetzt in den Bereich der Variablendeklaration reinklickt, kommt Oben im Befehlsreiter die Auswahl 'Deklarationen' zum Vorschein.
    Hier dann nur noch auf Alle Instanzpfade hinzufügen klicken und das Programm wird automtisch durchsucht, und es werden alle Ergebnisse in dieser Liste aufgeführt.

    Ab jetzt werden die Daten sauber abgespeichert und sind beim Neustart wieder vorhanden.

    IMG: Deklaration.png

     

Log in to post a comment.