Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Remanente Werte

johi
2011-03-29
2012-02-22
  • johi - 2011-03-29

    Hallo,

    ich habe als newbie das Problem, dass die als retain deklarierten Variablen doch nicht remanent sind.
    Als Steuerung habe ich einen IFM Controller AC1353 und ein Exor Touchpanel Etop306.

    Die Werte der Variablen als TIME und retain deklariert sollen über das Panel verändert werden können, das klappt auch wunderbar. Nur nach einem Neustart der Steuerung sind die Werte wieder auf 0.

    Was mache ich falsch?

    Gruss
    Jörg

     
  • KlOis - 2011-03-29

    Moin,

    ich kenne zwar deine Steuerung nicht, aber vielleich that sie kein Flashspeicher, sprich kein remanenten Speicher.
    Doch sollte dann in deinem Target das eingestellt sein (0 kByte remanenter Speicher) und der Compiler beim übersetzen meckern.
    Wo hast du denn die Variable deklariert, global oder im FB/prg ?
    In einer Funktion sollte es nicht funktionieren!

    Gruß
    KlOis

     
  • Matze001 - 2011-03-29

    sind die als retain persistant deklariert? Dann sollte es klappen!

    Grüße

    Marcel

     
  • johi - 2011-03-29

    Hallo,

    einen Flashspeicher sollte die Steuerung haben, da der Compiler nicht meckert.
    Ich kann die Variablen allerdings nur als retain deklerieren, wenn ich es mit persitent versuche meckert der Compiler, weil die Steuerung es nicht unterstützt.
    Deklariert habe ich die Variablen momentan im FB, habs aber vorher auch schon global versucht, alles ohne Erfolg.
    Ich möchte einfach nur Timerwerte am Panel ändern, die dann auch erhalten bleiben.
    Für siemensgeschädigte scheinbar gar nicht so einfach.

    Gibt es noch andere Möglichkeiten?

     
  • KlOis - 2011-03-29

    johi hat geschrieben:
    einen Flashspeicher sollte die Steuerung haben, da der Compiler nicht meckert.

    Der Compiler meckert nur, wenn es im Target beschrieben ist, steht da das die Steuerung angeblich re. Speicher hat, interessiert den Compiler die Wahrheit wenig

    johi hat geschrieben:
    Gibt es noch andere Möglichkeiten?

    Du könntest den Wert Notfalls in einer Datei Speichern (siehe SysLibFile con 3S)

    Gruß
    KlOis

     
  • johi - 2011-03-29

    Ok, hab mit dem IFM Support telefoniert. Dieser hat mich auf die CoDeSys Hilfe verwiesen.
    In der Hilfe hab ich folgendes gefunden:


    INI Operator
    Mit dem INI Operator können Retain-Variablen einer im Baustein verwendeten Funktionsblock-Instanz initialisiert werden.

    Der Operator muss einer boolschen Variable zugewiesen werden.

    Syntax: <bool-variable> := INI(<FB-Instanz, TRUE|FALSE)</bool-variable>

    Wenn der zweite Parameter des Operators auf TRUE gesetzt ist, werden alle im Funktionsblock FB definierten Retain-Variablen initialisiert.

    Beispiel in ST: fbinst ist die Instanz desFunktionsblocks fb, in dem eine Retain-Variable retvar definiert ist.

    Deklaration im Baustein:

    fbinst:fb;

    b:bool;

    Programmteil:

    b := INI(fbinst, TRUE);

    ivar:=fbinst.retvar ( => retvar wird initialisiert )

    Leider versteh ich das ganze nicht so ganz.
    Die Deklaration der Instanz wurde automatisch in VAR_GLOBAL geschrieben. Wird b auch in VAR_GLOBAL deklariert?
    Ich nehme an, die Variable b ist nur eine Art Kontrollvariable, um zu schauen, ob die Retain Variablen initialisiert wurden. ??

    ivar:=fbinst.retvar ( => retvar wird initialisiert ) -> warum muss ich den Wert der Retain Variablen einer weiteren Variablen zuweisen??

    Welche Variable (ivar oder retvar) verarbeite ich weiter im Programm?

    Wie läuft die Sache, wenn ich die Retain Variable global deklariere und keinen Instanzbaustein habe?

    Ich komm mir gerade echt blöd vor.

    Gruss
    Jörg

     
  • KlOis - 2011-03-29

    Zitat:
    Die Deklaration der Instanz wurde automatisch in VAR_GLOBAL geschrieben. Wird b auch in VAR_GLOBAL deklariert?
    Ich nehme an, die Variable b ist nur eine Art Kontrollvariable, um zu schauen, ob die Retain Variablen initialisiert wurden. ??

    Richtig, wenn initialisiert wurde, dann TRUE, also kannst du sie auch lokal deklarieren.

    Zitat:
    Welche Variable (ivar oder retvar) verarbeite ich weiter im Programm?

    die ivar ist nur zur kontrolle, also weiter mit retvar arbeiten.

    Zitat:
    Wie läuft die Sache, wenn ich die Retain Variable global deklariere und keinen Instanzbaustein habe?

    Dann funzt die INI Funktion nicht, kA was dann machen musst
    Bei mir funzte das bisher auch ohne INI...

     
  • johi - 2011-03-29

    Oh man, das war ne schwere Geburt.
    Totales Missverständnis mit dem IFM support. In der CoDeSys Hilfe steht natürlich nicht, wie es bei dem IFM Controller funktioniert. Es gibt eine Ergänzung von IFM zum CoDeSys Handbuch, welches ich natürlich bis vor einigen Minuten, nicht hatte.
    Hätte der Support mir auch sagen können.

    Zum Speichern der, als Retain deklarierten Variablen muss beim IFM Controller einfach nur ein FB namens "Store_Retain"
    aufgerufen werden.

    Jetzt klappt es auch.

    Vielen Dank für die schnellen Antworten.

    Gruss
    Jörg

     
  • Erik Böhm - 2011-03-29

    Servus

    Also das macht mir doch einen sehr halbfertigen Eindruck.
    Was passiert denn wenn jemand an deinem Controller den Strom wegnimmt, also z.B. den Hauptschalter ausschaltet ?
    Rufst du dann noch Store_Retain auf ???
    Und wenn du schnell ändernde Werte hast, wie oft wird dann geschrieben ?
    Flash-Speicher haben eine begrenzte Anzahl von Schreibzyklen !

    Mit der Antwort vom Support würde ich mich nicht zufrieden geben.

    Gruß Erik

     
  • Erik Böhm - 2011-03-29

    Hallo nochmal

    Übrigens steht in der CoDeSys Hilfe folgendes:

    Retain-Variablen behalten ihre Werte nach einem unkontrollierten Beenden des Laufzeitsystems (Aus/Ein) bzw. einem 'Online' 'Reset' in CoDeSys erhalten.

    Gruß
    Erik

     
  • johi - 2011-03-29

    Also mit dem Store_Retain werden nur die von mir deklarierten Retain Variablen gespeichert.
    Es ist richtig, dass der Store_Retain nicht zyklisch aufgerufen werden darf.
    Das stört mich aber nicht weiter, da ich nur Parameter, die über das Touchpanel vom Operator verändert werden, auf diese Art speichern möchte.
    Für Daten, die bei einem Systemausfall gespeichert bleiben sollen stehen remanente Merkerbereiche zur Verfügung.

    Also nicht ganz so schlimm wie der erste Eindruck.

    Gruss
    Jörg

     
  • hwesbe - 2012-02-22

    Hallo,

    Zitat:
    Retain-Variablen behalten ihre Werte nach einem unkontrollierten Beenden des Laufzeitsystems (Aus/Ein) bzw. einem 'Online' 'Reset' in CoDeSys erhalten.

    mit dieser Aussage bzw. mit der Hilfe von CoDeSys komm ich nicht so ganz klar.
    Ich habe eine WAGO 750-841 und nutze einen Aufwärtszähler (CTU). Der Zählwert
    des CTU Ausgangs (WORD) soll erhalten bleiben bei z.B. Spannungsausfall und nach
    Wiederkehr vorhanden sein.
    Den Ausgang hab ich als
    VAR RETAIN
    ZAEHL_WERT : WORD;
    END_VAR
    deklariert.
    Aber gespeichert wird da gar nix. Der ist immer wieder auf null. Wo verstehe ich die Aussage der Hilfe
    nicht?

    Gruß Henning

     
  • KlOis - 2012-02-22

    Beim Neustart der Steuerung überschreibt doch der Ausgang des CTU deine remanente Variable wieder mit 0 oder hab ich was falsch verstanden?
    Ich weiß nicht ob das geht, aber du müsstest den CTU remanent deklarieren.
    Oder du nimmst den Ausgang des CTU und addierst die Differenz zum vorherigen Wert immer auf deine remanente Variable drauf.

    VAR_GLOBAL RETAIN
       diRetain: DINT;
    END_VAR
    ---------------
    //im Baustein Deklaration
    VAR
       fbCTU : CTU;
       diOld : DINT;
       diDiff : DINT;
    END_VAR
    ---------------
    diDIff=fbCTU.CV-diOld;
    diOld=fbCTU.CV;
    diRetain=dieRetain+diDiff;
    
     
  • hwesbe - 2012-02-22

    Hallo,

    ganzer Baustein CPU als Retain gemacht. Jetzt gehts. Denke aber es ist einfacher über einen
    Trigger eine Variable hochzuzählen. Dann wird die nicht überschrieben.

    Danke

     
  • KlOis - 2012-02-22

    Das Problem dabei ist, wenn du den Baustein (oder auch eine Variable) in einerm FB RETAIN deklarierst, wird der ganze FB RETAIN .
    Also aufpassen
    Lieber eine Variable in den globalen Variablen als RETAIN deklarieren!

     

Log in to post a comment.