CoDeSys 3.5 Methode mit VAR_RETAIN

Rici

Level-2
Beiträge
128
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe eine Verständnisschwirigkeit und hoffe jemand kann mir dies erklären.

Im Programm CoDeSys 3.5 hat man die möglichkeit Methoden zu verwenden. Diese Methode die in einem Funktionsbaustein existiert kann mehrfach aufgerufen werden. Durch unterschiedlihe Wete an den Eingängen, entstehen unterschiedliche Ergäbnisse.

Soweit klar. Nun hat man die Möglichkeit in einem Methode Baustein eine VAR_RETAIN anzulegen. In meinem Fall ist es ein TON. Was passiert wenn ich die Methode nun mehrfach aufrufe?

Ich gehe davon aus, dass die Zeit nicht parallel laufen kann. Ich hatte versucht der Methote einen Speicherberei in dem FB zu geben, habe es jedoch nicht geschafft.


Ich hoffe jemand kann mir erklären wie dies grundsätzlich funktioniert.

MfG
Rici

PS. Diesen Thread habe ich eventuell 2 mal erstellt
 
Ich glaube Du verwechselst da was. VAR_RETAIN sind Variablen deren Inhalt, unter anderem, auch nach dem Ausschalten der SPS erhalten bleiben, ansonsten verhalten sie sich aber "normal", was in Deinem Fall heißt, dass nach Beenden/Verlassen der Methode alles wieder zurück auf Anfang geht. Was Du vermutlich suchst ist VAR_STAT, aber Achtung, da gibt es Einschränkungen.
Mit VAR_STAT würde der Zustand des TON auch nach dem Ende der Methode erhalten bleiben, das Selbe würdest Du aber auch erreichen, wenn Du den TON im FB deklarierst und die Instanz dann in der Methode nutzt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Richtig ich meine Statische Variablen.

Aber auch mit VAR_RETAIN würde diese Frage funktionieren. Kann ich denn eine Methode mehrmals aufrufen?

Im Moment habe ich das ganze umgesetzt indem ich den Code in einen FB erzeugt habe und diesen Mehrfach instanziere.

Daher suche icht nicht nach einer anderen Lösung für das Problem sondern um erklärung, da ich anscheinend den Zusammenhang nicht verstehe.
 
Aber auch mit VAR_RETAIN würde diese Frage funktionieren. Kann ich denn eine Methode mehrmals aufrufen?
...
Daher suche icht nicht nach einer anderen Lösung für das Problem sondern um erklärung, da ich anscheinend den Zusammenhang nicht verstehe.
Nein, würde sie nicht, wie ich bereits erläutert hatte. Bei Methoden bleiben die Inhalte von deren Variablen nicht über deren Ende erhalten, das Selbe gilt auch für in Methoden instanziierten FBs. In Deinem Fall würde der TON sich bei jedem Aufruf der Methode so verhalten als wäre er zum ersten Mal aufgerufen, was Dir nicht weiter hilft. Natürlich kannst Du eine Methode mehrfach aufrufen, aber da Du nur eine Instanz des FBs hast ist die Methode und damit der darin enthaltene TON immer der Selbe. Um mehrere TONs zu haben musst Du mehrere Instanzen eines TONs anlegen die Du dann aufrufst. Übrigens sollten Methoden eher nicht für Dinge genutzt werden die mehrere Zyklen benötigen, was bei Timern ja der Fall wäre. Man könnte in einer Methode ein Flag des FBs setzen und im FB selber dann den Timer ausführen.
 
Vielleicht auch noch ein paar Worte zu Timern. Beim TON wird sobald IN TRUE wurde die Startzeit gespeichert. Bei jedem erneuten Aufruf der Instanz von TON wird, soweit IN immer noch TRUE ist, verglichen, ob die verstrichene Zeit größer gleich der Zeitspanne an PT ist. Ist dies der Fall geht der Ausgang Q so lange auf TRUE bis IN wieder FALSE wird. Dieser Ablauf ist auch der Grund warum Du eine Instanz eines Timers nicht gleichzeitig mehrfach verwenden kannst.
 
Mal ne Frage in dem Zusammenhang:
Bei den Methoden kann ich Variablen im VAR-Bereich und im VAR_INST-Bereich deklarieren.
Das Problem von Rici müsste sich doch mit VAR_INST lösen lassen?
Habe mal wieder übersehen das es um Codesys und nicht TwinCAT geht. Mit VAR_INST würden die Probleme von VAR_STAT umgangen, ja, aber auch dadurch kann er eine Instanz eines TON nicht gleichzeitig nutzen, was er ja wohl vorhatte.
 
Habe mal wieder übersehen das es um Codesys und nicht TwinCAT geht. Mit VAR_INST würden die Probleme von VAR_STAT umgangen, ja, aber auch dadurch kann er eine Instanz eines TON nicht gleichzeitig nutzen, was er ja wohl vorhatte.

TON in VAR_INST deklarieren?
Verstößt zwar dagegen Methoden in einem Zyklus abzuarbeiten, müsste aber dennoch funktionieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke an alle. Ich denke ich habe es.

Will ich eine Funktion innerhalb eines FB mehrfach ablaufen lassen, kann ich die Methode mehrmal aufrufen muss aber dafür sorgen, dass der Speicherbereich sich nicht in der Methode befindet.
Bzw. nur der Speicher der innerhalb eines Zykluses notwendig ist.
Daher, die TON's werden in dem FB angelegt und jede neu aufgerufene Methode benutzt den, ihr zugewiesenen Speicher.

Bitte um Korrektur wenn es so nicht stimmt.
 
Wenn ich Dich jetzt nicht missverstanden habe stimmt das leider nicht.
Jede Instanz eines FBs hat ihren eigenen Speicherbereich (Von VAR_STAT mal abgesehen), dessen Inhalt auch nach Ausführung des FBs erhalten bleibt. Jede Methode innerhalb eines FBs hat Ihren eigenen Speicherbereich, allerdings wird dieser (Außer bei VAR_STAT oder VAR_INST) bei jedem Aufruf der Methode neu initialisiert, ist also "leer", aber immer der selbe Bereich.
Eine Instanz eines TON der im FB-Teil deklariert ist kannst Du natürlich in einer Methode aufrufen und diese Methode wiederum an mehreren Stellen aufrufen, Du kannst diese Instanz aber auch in mehreren Methoden aufrufen, dennoch kann diese Instanz durch TRUE an IN nur einmal mit einer Zeit gestartet werden. Du kannst eine Instanz nicht gleichzeitig mit verschiedenen Zeiten starten.
 
Zurück
Oben