Zuweisung von werten auf Out-Variablen

blasterbock

Level-1
Beiträge
373
Reaktionspunkte
35
Zuviel Werbung?
-> Hier kostenlos registrieren
Auf dem Bild ist der Quellcode des aufgerufenen Bausteins und sein Aufruf im Status zu sehen. Es werden einfach nur 3 Werte abhängig von 3 Eingangsbits auf drei Ausgänge kopiert.
Meine Frage ist nun, warum nimmt bei der gezeigten Beschaltung die Ausgangsvariable den Wert von Out2 an und nicht den von Out3 ?
 

Anhänge

  • Seltsam.jpg
    Seltsam.jpg
    107,7 KB · Aufrufe: 94
Weil an ein2 ein 1-Signal liegt (Eingang ist negiert)
An ein3 liegt ein 0-Signal und daher wird der Abschnitt
Code:
*
...
L #in3
T #out3
...
übersprungen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Meine Frage ist nun, warum nimmt bei der gezeigten Beschaltung die Ausgangsvariable den Wert von Out2 an und nicht den von Out3 ?
Wenn du alle Ausgänge mit ein und derselben Variablen belegst, müssen alle den gleichen Wert haben. Unterschiedliche Variablen -> und es funzt.

MfG
FrankW
 
Das ist mir schon klar.
Es erfolgt aber an out3 eine weitere Zuweisung zu der gleichen Variablen.
Wenn ich an den out3 eine andere Variable schreibe, wird der Wert 0 an out3 angezeigt, wie es auch richtig ist.
Aber warum wird dummyint nicht auf 0 geschrieben ?

@Frank W
Ich sehe es ja, dass es funktioniert, aber warum wird der out3 nicht in die Variable geschrieben ?
 
Zuletzt bearbeitet:
Das ist mir schon klar.
Es erfolgt aber an out3 eine weitere Zuweisung zu der gleichen Variablen.
Wenn ich an den out3 eine andere Variable schreibe, wird der Wert 0 an out3 angezeigt, wie es auch richtig ist.
Aber warum wird dummyint nicht auf 0 geschrieben ?

@Frank W
Ich sehe es ja, dass es funktioniert, aber warum wird der out3 nicht in die Variable geschrieben ?
Weil du nichts schreibst, du überspringst ja das schreiben bei nicht gesetzten Eingang.

MfG
FrankW
 
Das stimmt nicht. Die Variable out3 wird intern mit dem Wert 0 belegt (sieht man, wenn man eine andere Variable an out3 legt).

So weit ich das System verstehe, werden bei einem Bausteinaufruf alle Übergabeparameter auf den Stack geschrieben. Also muss beim Rücksprung aus dem FC out3 einen Wert haben.

Wo liegt mein Denkfehler ?
 
Dein Denkfehler liegt darin, dass du der Meinung bist, die SPS tut etwas von selbst. Dem ist nicht so. Du schreibst nicht auf die Variable! Wenn du in ein MW z.Bsp. die Zahl 14 schreibst und das MW danach als #out3 nimmst, bleibt die 14 so lange stehen bis #ein3 TRUE ist, dann steht dort der #in3-Wert!!!!

MfG
FrankW
 
Zuviel Werbung?
-> Hier kostenlos registrieren
BOAH, das kann doch nun wirklich nicht so schwer sein!

du hast eine IF-THEN-Anweisung gebaut. problem dabei, es wird nicht mehr beschrieben, also der wert bleibt. das was du willst ist ein IF-THEN-ELSE-Konstrukt:

Code:
    IF ein1 
        THEN out1:=in1; 
        [B][COLOR=Red]ELSE out1:=0; [/COLOR][/B]
    END_IF;
und jetzt gehst du zu deinem chef und sagst, dass du ganz dringend einen leergang brauchst!
 
Zuletzt bearbeitet:
du hast im OB1 die tempvariable #dummyint definiert und beschreibst sie durch dein out2 mit 2.dann steht die 2 natürlich da drinnen.egal wo du sie anlegst.wie schon oben beschrieben.nimm drei verschiedene und es passt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
du hast im OB1 die tempvariable #dummyint definiert und beschreibst sie durch dein out2 mit 2.dann steht die 2 natürlich da drinnen.egal wo du sie anlegst.wie schon oben beschrieben.nimm drei verschiedene und es passt.

Ja und setzte in den FC3 vor Deinen Code einfach ein:

Code:
L   0
T   #Out1
T   #Out2
T   #Out3
 
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.
 

Anhänge

  • Seltsam1.jpg
    Seltsam1.jpg
    181,7 KB · Aufrufe: 29
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
@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 ?
 
"...Wichtiger Unterschied bei Ausgangsparametern von FC und FB​
In 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.​
Achtung​
Wird 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.

Hinweis​
Bei OUTPUT-Parametern eines FB bzw. INOUT-Parametern eines FC und FB
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​
Hinweise beachten, um nicht unbeabsichtigt "alte" Werte weiter zu verarbeiten...."

kleiner Auszug aus "Programmieren mit Step7" --> Outparameter setzen, basta!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist doch alles nicht so schwer

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!!
 
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!!

OK, das Basta nehme ich zurück!
 
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 FrankW
Outparameter setzen, basta!
Hatten wir das nicht schon?
@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.

EDIT: während ich schrieb, hat WGertzen wohl schon gelöst ...
 
Zuletzt bearbeitet:
Zurück
Oben