Funktion mit Speicherfunktion

CodeTipser

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forumsmitglieder,
ich experimentiere gerade mit FCs und FBs im TIA-Portal v13.

Üblicherweise ist es mit einem FC doch nicht möglich, eine speichernde, bibliotheksfähige Funktion zu realisieren, weil ihr einfach die STATIC-Variablen in der Bausteinschnittstelle fehlen.

Ich habe aber mal interessehalber einfach eine INPUT-Variable mit einem SR-Baustein verknüpft und lasse diese INPUT-Variable damit speichernd setzen. Eigentlich hatte ich erwartet, einen Fehler beim Übersetzten zu bekommen und dass das Programm so gar nicht lauffähig sei. Doch siehe da ... wenn man es auf PLCSim überträgt, dann läuft es. Meine Frage ist: warum läuft es?

Im Screenshot sieht man links oben die globale Variablentabelle, darunter den Aufruf des FC im MAIN [OB1] mit den zugehörigen Aktualparametern. Und darunter findet sich PLCSim, an dem man sieht, dass der Ausgang P10 tatsächlich noch gesetzt ist, obwohl alle Eingänge ein FALSE liefern.
In der rechten Hälfte erkennt man den FC mit der deklarierten Bausteinschnittstelle und darunter der Code mit den SR-Bausteinen.

Screenshot.jpg

Es wäre toll, wenn mir jemand auf die Sprünge helfen könnte, warum diese Speicherfunktion so tatsächlich funktioniert ...

Schon mal vielen Dank im Voraus!
 
Es wäre toll, wenn mir jemand auf die Sprünge helfen könnte, warum diese Speicherfunktion so tatsächlich funktioniert ...
Das funktioniert, weil Du zufällig in Deinem gesamten Programm kaum temporären Speicher benötigst und dieser bei der S7-300 auch nicht initialisiert wird.
Und noch zufälliger bekommt Dein FC beim jedem Aufruf hier genau den gleichen temporären Speicher wie beim letzten Aufruf, der zwischendurch auch nicht anderweitig verwendet wurde und so noch den Zustand von der letzten Verwendung besitzt.

Aber verlassen solltest Du Dich auf diesen Zufall nicht.
;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Versuch mal statt nen Ausgang ein Datenbaustein-Bit an die Ausgänge zu machen. Dann sollte das schon nicht mehr gehen.

EDIT: Wie hucki schon schreibt dürfte auch das noch gehen da du kaum Programm in der CPU hast und damit der Lokaldatenstack im einem Durchlauf nicht überschrieben wird.
Der FC-Output arbeitet mit einem Temp-Bit (Zumindest bei FUP, da gibts dann auch noch einen Unterschied wenn du deinen Baustein in AWL aufrufst) auf das per Pointer zugegriffen wird.
Solange der Temp-Speicher bei einem Durchlauf nicht überschieben wurde, bekommt man noch den Wert vom letzten Durchlauf.
Aber eben nur solange bis genug Temp-Daten-Zugriffe im Programm sind und der Temp-Stack voll ist und dann überschrieben wird.

@hucki: Solange er E/A/M hinten am Ausgang hat müsste es aber immer gehen, da ja dort nicht über Temp, sondern direkt per Pointer der E/A/M gelesen wird.
Ist aber eben trotzdem nur etwas was unter bestimmten Umständen funktioniert und daher nicht gemacht werden sollte.
 
Zuletzt bearbeitet:
RONIN hat recht. Es ist der Spezialfall, wenn E/A/M/P außen angeschaltet werden, dann wird eine Referenz auf den Aktualoperand übergeben und der FC arbeitet direkt auf die angeschaltete Speichervariable. Der FC kann aber nicht wissen, mit welchen Aktualoperanden er aufgerufen wird, deshalb sollte man diesen Spezialfall auch nicht ausnutzen - besonders bei Bibliotheksbausteinen, wo man sich nach dem Testen kaum noch Gedanken darüber macht, ob der Baustein womöglich nur unter ganz bestimmten eingeschränkten Einsatzbedingungen funktioniert.

Ein FC kann allerdings ganz offiziell eine Speicherfunktion haben, indem man den Speicheroperanden per IN_OUT an den FC übergibt.

Der Out des FC funktioniert und bleibt gesetzt, weil "außen" beim Bausteinaufruf als Aktualoperand ein Ausgang (A100.0) angeschaltet ist.
Hilfe zu AWL > Parameterübergabe schrieb:
Wenn Merker, Eingänge, Ausgänge, Peripherieeingänge oder Peripherieausgänge als Aktualoperanden an einer Funktion verwendet werden, werden diese anders behandelt als die anderen Operanden. Die Aktualisierung erfolgt hier nicht über den L-Stack, sondern direkt.
Der aufgerufene Baustein kann aber nicht erkennen, ob der Aktualparameter eine Variable aus diesen speziellen Speicherbereichen ist oder ein DBXa.b oder ein La.b, daher sollte man immer so programmieren, als ob es diese Siemens-Ausnahmeregel nicht gäbe.
Hilfe zu AWL > Parameterübergabe schrieb:
Warnung

Sorgen Sie bei der Programmierung des aufgerufenen Bausteins dafür, daß die als OUTPUT deklarierten Parameter auch beschrieben werden. Sonst sind die ausgegebenen Werte zufällig! Bei Funktionsbausteinen bekommt man den vom letzen Aufruf gemerkten Wert aus dem Instanz-DB, bei Funktionen den zufällig auf dem L-Stack liegenden Wert.

Soll ein Übergabeparameter Informationen in den FC bringen dann muß das ein IN-Parameter sein.
Soll er Informationen aus dem FC bringen, dann muß das ein OUT-Parameter sein.
Soll er zunächst Informationen in den FC bringen (das Wissen des aktuellen Zustands) und anschließend den eventuell veränderten Zustand aus dem FC speichern, dann muß das logischerweise ein IN_OUT-Parameter sein.

Harald
 
Zurück
Oben