Problem PersistentVars

andrax
2023-06-08
2023-06-13
  • andrax

    andrax - 2023-06-08

    Hallo zusammen,

    ich habe nach einem Tutorial aus dem Automtisierungskanal,
    https://www.youtube.com/watch?v=W-SGX49QNH4
    mir folgen Code im Projekt angelegt um wichtige Parameter zu speichern und bei einem Neustart vom Raspi wiederherzu stellen.

    AppGetCurrent(pResult := ADR(stResult), AppGetCurrent => stApplication);

    IF GVL_VisuData.xSaveSettings THEN
    AppStoreRetainsInFile(pApp := stApplication, pszFilname := strFilename);
    GVL_VisuData.xSaveSettings := FALSE;

    END_IF

    IF GVL_VisuData.xRestoreSettings THEN
    AppStoreRetainsInFile(pApp := stApplication, pszFilname := strFilename);
    GVL_VisuData.xRestoreSettings := FALSE;

    END_IF

    Prinzipiell funktioniert der Code, die Parameter werden im File gespeichert und stehen beim Neustart zur Verfügung.
    Aber, xRestoreSettings funktioniert nicht. Zum einem werden keine Daten beim ausführen der Funktion zurückgeladen und zusätzlich wenn ich die Funktion aus meinen Code entferne, werden Die Daten aus dem File dennoch wieder hergestellt.
    Wäre alles kein Problem, wenn nicht folgendes Phänomen wäre:
    1. Ich kann das File nur einmal mit daten beschreiben. Wenn ich das File mit neuen Daten beschreibe, werden nur alte Daten wiederhergestellt.
    2. Im PersistentVars, sind unter anderem Daten für einen Timer enthalten, "Logzeit : INT;. Jetzt läuft mein TON nicht mehr. Ich musste die Logzeit aus PersistentVars rausnehmen und und der Timer läuft wieder.

    Meine Frage: ist die Funktion Fehlerhaft?
    Und gibt es ein funktionierendes Sample?

    Vielen Dank im Voraus.

    Gruß

    Andre

     
  • eschwellinger

    eschwellinger - 2023-06-12

    Hallo Andre,
    das ist halt alles nicht so einfach, ich versuchs mal zu erklären.
    So generell funktioniert dieser Retain Mechanismus eigentlich nur wenn man auch ne USV hat also die Runtime und das OS korrekt herunterfährt! So ist das ganze designed. (die Runtime selber schreibt das Retain file beim beenden und läd das Retain File beim starten)
    Das was ihr/Tutorial da tut ist eigentlich ein Workaround um das verwenden einer USV zu umgehen. (also manuell das File schreiben und auch wieder herstellen)

    Aber prüf doch bitte mal den Filenamen den du da als Retain schreibst. ( ich denke es muss ein anderer sein - also nicht Application.ret sonst kommen die beiden Mechanismen sich ja in die Quere. (dein Manueller und der der ja auch von der runtime aus dasselbe ohne dein Zutun das tut oder zumindest versucht)
    Alternativ könntest du den Persistence Manager verwenden - falls das nicht geht.
    https://content.helpme-codesys.com/en/CODESYS%20Application%20Composer/ac_pm_overview.html

    Grüße
    Edwin

     

    Last edit: eschwellinger 2023-06-12
  • andrax

    andrax - 2023-06-13

    Hi,
    also das File wird genauso im Zielpfad angelegt wie angegeben. Passt also.
    Problem Timer: Da stand auf einmal eine 180 (sek) drin, möglicherweise kam TON damit nicht klar. Jetzt die gretchenfrage: Im welchen Pfad wird per default die PersistentVars Liste geschrieben?
    Ich glaube, ich muss genau dahin schreiben, damit es funktioniert.

     

Log in to post a comment.