Ich habe in einem älteren Programm einen Multiplexer gefunden, der auf die gezeigte Art arbeitet. Ich sehe, dass es schon seit Jahren funktioniert.
Aber darum geht es nicht.
Das Compilat im Speicher kann nicht wissen, welche der Ausgangsvariablen es wann schreiben soll. Es existiert also ein fester Programmcode mit ebenso festen Zuweisungen. Auch wenn ich die Variable out3 nicht zuweise, wird trotzdem beim Aufruf des FC ein Wort im Stack für diesen Wert reserviert sein, mit einem beliebigen Inhalt.
Wenn ich die Variable out3 im aufgerufenen Baustein explizit auf 0 setze, passiert das gleiche.
@fd
Kann ich den Lehrgang bei Dir machen ?
@Boxhead
Habe Deinen Vorschlag eben erst gesehen.
Mein neues Beispiel macht genau Deinen Vorschlag.
Das heißt out3 ist eine definierte Größe und müsste am Ausgang des FC als letzte Zuweisung der dummyint eine 0 annehmen.
Last edited by blasterbock; 02.12.2008 at 09:58.
Lieber Feste feiern, als feste arbeiten.
Geht es dir um eine Lösung oder um eine Diskussion.
Zur Lösung solltest du die Hinweise annehmen und bei Diskussion: -> Mach den Lehrgang bei fd
MfG
FrankW
....Wer lesen kann ist klar im Vorteil.....
Ich bin auch an dem Lehrgang interessiert, denn ich teile die Verwunderung von blasterblock.
Wenn alle OUT-Variablen einen definierten Wert im FC zugewiesen bekommen, würde ich erwarten, dass der dummyint nach dem Aufruf den Wert aus OUT3 enthält, weil ich denke, dass der als letzter aus dem FC "rauskommt".
Grüße von HaDi
blasterbock (02.12.2008)
@FrankW
Danke für Deine Hilfe gegenüber fd
Mir geht es nicht um eine Diskussion.
Bei einer SPS ist die letzte Zuweisung einer Variablen die gültige Zuweisung.
Warum nicht bei Aufruf eines FC ?
Wenn ich hinter das Netzwerk des letzten Beispiels an das Programmende ein
L 0
T out3
schreibe, wird out3 auch am Augang richtig auf dummyint zugewiesen.
Bei der Zuweisung im Netzwerk 1 funktioniert das nicht.
@HaDi
Wann machen wir den Lehrgang ?
Lieber Feste feiern, als feste arbeiten.
"...Wichtiger Unterschied bei Ausgangsparametern von FC und FBIn Funktionsbausteinen (FB) wird beim Zugriff auf Parameter die Kopie des
Aktualparameters im Instanz-DB verwendet. Wird beim Aufruf eines FB ein
Eingangsparameter nicht übergegeben bzw. im Baustein ein Ausgangsparameter
nicht beschrieben, so werden die im Instanz-DB noch vorhandenen älteren Werte
weiter verwendet (Instanz-DB = Gedächtnis des FB).
Funktionen (FC) haben kein Gedächtnis. Die Versorgung der Formalparameter ist
deshalb im Gegensatz zum FB nicht optional, sondern zwingend erforderlich. Der
Zugriff auf FC-Parameter erfolgt über Adressen (bereichsübergreifende Zeiger).
Wird als Aktualparameter ein Operand aus dem Bereich Daten (Datenbaustein)
oder eine lokale Variable des rufenden Bausteins verwendet, wird für die
Parameterübergabe eine Kopie des Aktualparameters in den Lokaldaten des
rufenden Bausteins temporär gespeichert.AchtungWird in einem solchen Fall ein OUTPUT Parmeter in einem FC nicht beschrieben,
können die ausgegebenen Werte zufällig sein!
Der für die Kopie bereitgestellte Bereich in den Lokaldaten des rufenden Bausteins
wird mangels Zuweisung an den OUTPUT Parmeter nicht beschrieben und bleibt
somit unverändert. Damit wird zufällig der in diesem Bereich stehende Wert
ausgegeben, da Lokaldaten nicht automatisch mit z. B. 0 vorbelegt sind.
Beachten Sie deshalb Folgendes:•Initialisieren Sie wenn möglich OUTPUT Parameter.
•Setze- und Rücksetze-Befehle sind VKE-abhängig. Wird mit diesen Befehlen
der Wert eines OUTPUT Parameters ermittelt, wird bei VKE = 0 kein Wert
gebildet.
•Achten Sie darauf, dass - unabhängig von allen möglichen Programmpfaden
innerhalb des Bausteins - die OUTPUT-Parameter auf jeden Fall beschrieben
werden. Beachten Sie hierbei insbesondere Sprungbefehle sowie den ENOAusgang
in KOP und FUP. Denken Sie auch an BEB und die Wirkung der
MCR-Befehle.
HinweisBei OUTPUT-Parametern eines FB bzw. INOUT-Parametern eines FC und FBHinweise beachten, um nicht unbeabsichtigt "alte" Werte weiter zu verarbeiten...."
können die ausgegebenen Werte zwar nicht zufällig sein, da hier ohne
Beschreibung des Parameters der alte Ausgangswert bzw. der Eingangswert als
Ausgangswert erhalten bleibt. Dennoch sollten Sie auch hier die oben gegebenen
kleiner Auszug aus "Programmieren mit Step7" --> Outparameter setzen, basta!
MfG
FrankW
....Wer lesen kann ist klar im Vorteil.....
Kurze Lösung!
Die FC Parameter werden als Zeiger übergeben. Daher zeigen Out1, out2 und out3 alle auf die gleiche Speicherzelle !!!!!
Somit wird dummyInt mit dem letzten schreibzugriff auf eine der Variablen festgelegt.
Siehe auch Text von FrankW wo die Zeiger erwähnt werden.
Nebenbei sei der erwähnt, dass der Tonfall einiger Beiträge doch etwas daneben liegt!! Soll doch mal einer sagen, dass er der perfekte Programmierer
ist. Wenn ich das mal von mir dachte, schlug zum Glück kurz danach die Maschine in die Wand ein und ich wuste direkt, dass ich doch nicht so perfekt bin!!
blasterbock (02.12.2008),forendiva (02.12.2008),FrankW (02.12.2008),HaDi (02.12.2008)
ich glaube, über das hier geschilderte Phänomen bin ich auch schon mal gestolpert. Allerdings entzieht sich das meiner Alltagserfahrung, insbesondere, da ich praktisch ausschließlich FB in AWL mache ...
Meine Idee: es handelt sich um einen Darstellungsfehler im Status. Die Variable #dummyint wird nur einmal gelesen und dann einmal richtig und zweimal falsch angezeigt. Ist die CPU auf Prozessbetrieb eingestellt?
Derweil lese ich die gerade hinzugekommene Antwort von FrankWHatten wir das nicht schon?Outparameter setzen, basta!EDIT: während ich schrieb, hat WGertzen wohl schon gelöst ...@Boxhead
Habe Deinen Vorschlag eben erst gesehen.
Mein neues Beispiel macht genau Deinen Vorschlag.
Das heißt out3 ist eine definierte Größe und müsste am Ausgang des FC als letzte Zuweisung der dummyint eine 0 annehmen.
Last edited by Perfektionist; 02.12.2008 at 10:41.
Bookmarks