komisches Verhalten bei FC aufruf und transfer aus diesem

Tampapdex

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

habe ein Problem mit dem Verständniss was in meinem Programm genau passiert. Und zwar habe ich ein FC erstellt wo 3 Realwerte eingelesen werden, addiert und dann durch 3 dividiert und dann erfolgt die Ausgabe. Diese Ablaufstruktur ist abhängig von einem Wandlung-Start-Signal (ENABLE). Diese FCs werden im OB1 Aufgerufen.

http://img651.imageshack.us/i/fc1.png/

Zum Testen sind die Eingänge mit 1,2,3 bzw. 4,5,6 als REAL geladen. Somit sollte beim ersten FC Aufruf ein Mittelwert von 2 und beim zweiten ein Mittelwert von 5 rauskommen.

Wenn ich das Ergebniss auf ein MW Transferiere dann verhält sich das Programm so wie ich das erwarte. MD12 bzw MD 28 enthalten das Ergebniss.

ENABLE ist auf 1
http://img138.imageshack.us/i/mwaufrufe00ein.png/
ENABLE ist auf 0
http://img97.imageshack.us/img97/5797/mwaufrufe00aus.png

Bis jetzt ist alles Super und Verständlich. Nun habe ich zusätzlich ein DB10 als Globaldatenbaustein erstellt. Dort zwei Variablenfelder von Typ REAL erstellt und schreibe meine Ergebnisse dort rein.

ENABLE auf 1
http://img26.imageshack.us/img26/4743/db1dbd0aufrufe00ein.png
ENABLE auf 0
http://img202.imageshack.us/img202/9114/db1dbd0aufrufe00aus.png

Und genau da liegt mein Problem. ENABLE auf 1 -> FCs werden ständig durchlaufen - das Transferergebniss stimmt. Sobalt ich den ENABLE auf 0 setze schreibt mir die SPS auf DB10.DBD0 das Ergebniss von DB10.DBD4 (zweiter FC Aufruf) rein. Beim MD Transfer pasiert dies nicht - das Programm arbeitet so wie ich es erwarte.


Wo liegt der Unterschied zw Transfer auf ein MD und einen DBx.DBDx ? Was läuft hier schief?

P.S die Antwort von Siemens schreib ich hier besser nicht rein - könnte etwas peinlich sein :D
 
P.S die Antwort von Siemens schreib ich hier besser nicht rein - könnte etwas peinlich sein :D
Würde mich aber schon interessieren. Für wenn wäre das peinlich?

Zu Deiner Frage:
Wo liegt der Unterschied zw Transfer auf ein MD und einen DBx.DBDx ? Was läuft hier schief?
Leider sieht man es nicht, aber ich tippe jetzt mal das der Ausgang von Deiner FC als OUT deklariert ist.
Und genau da ist der Unterschied zwischen MW und DB Wort.
Du kannst ein Merkerwort trotzdem von Außen beeinflussen auch wenn es über ein OUT zugewiesen wird, bei einem Datenwort geht das nicht.
Ersetze das OUT durch ein IN_OUT und beide verhalten sich gleich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Paule hat recht, aber ich ergänze mal noch mit ein paar Erklärungen aus der Step7-Hilfe, denn das erklärt dann, warum der "falsche" Wert im DBD 0 landen kann.

Funktionen (FC)Funktionen (FC)
Zuordnen von Aktualparametern zu Formalparametern
Ein Formalparameter ist ein Platzhalter für den "tatsächlichen" Parameter, den Aktualparameter. Aktualparameter ersetzen beim Aufruf einer FC die Formalparameter. Sie müssen den Formalparametern einer FC immer Aktualparameter zuordnen (z. B. dem Formalparameter "Start" einen Aktualparameter "E3.6"). Die Eingangs-, Ausgangs- und Durchgangsparameter, die von der FC verwendet werden, werden als Pointer auf die Aktualparameter des Codebausteins gespeichert, der die FC aufgerufen hat.
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 ENO-Ausgang in KOP und FUP. Denken Sie auch an BEB und die Wirkung der MCR-Befehle.
 
Zuletzt bearbeitet:
Würde mich aber schon interessieren. Für wenn wäre das peinlich?

Zu Deiner Frage:

Leider sieht man es nicht, aber ich tippe jetzt mal das der Ausgang von Deiner FC als OUT deklariert ist.
Und genau da ist der Unterschied zwischen MW und DB Wort.
Du kannst ein Merkerwort trotzdem von Außen beeinflussen auch wenn es über ein OUT zugewiesen wird, bei einem Datenwort geht das nicht.
Ersetze das OUT durch ein IN_OUT und beide verhalten sich gleich.



Für Siemens - Die Antwort beinhaltete das so ein Fehler schon mal vorkommen kann da REAL Zahlen gerundet werden ...

Werde mich mal auseinandersetzen mit OUT und IN_OUT - ganz klar ist mir das nicht - mal reinlesen - aber erstmal vielen Dank
 
da du bei deinem test wahrscheinlich nur diese beiden bausteine in der CPU hast sind die lokaldaten des ausgangs des ersten aufrufs zufällig die selben, die beim letzten durchlauf des zweiten bausteins geschrieben wurden. fügst du einen dritten aufruf des selben bausteins ein ohne andere bausteine einzufügen, wird das ergebnis dieses bausteins übertragen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich nochmal


Paule hatte natürlich recht das der Ausgabewert per OUT ausgegeben wurde
http://img22.imageshack.us/i/vorherf.png/

jetzt hab ich das auf IN_OUT geändert
http://img17.imageshack.us/i/nacher.png/


läuft 1a aber sieht nicht so schön aus (nicht auf der rechten Seite - beim ersten Blick siehts wie ein Eingang aus)
http://img697.imageshack.us/i/gesammt.png/


------------------


Du kannst ein Merkerwort trotzdem von Außen beeinflussen auch wenn es über ein OUT zugewiesen wird, bei einem Datenwort geht das nicht.
Das ist mir nicht ganz klar. Ein MD kann ich von Aussen beschreiben so wie ich lustig bin - das was im Programmablauf als letztes steht wird dann ausgegeben (falls es ausgegeben werden soll). Aber auch in einem GlobalDB Aufruf - DBx.DBDx kann ich doch rumschreiben und rumsauen wie ich will oder gibt es da etwas was ich übersehe?


Bitte nicht schlagen lerne SPS noch :(


@vierlagig

japp hast recht - hatte aber schon mit den zwei Bausteinen genug Verwirrung - ein dritter hätte das Chaos verursacht :ROFLMAO:
 
Das ist mir nicht ganz klar. Ein MD kann ich von Aussen beschreiben so wie ich lustig bin - das was im Programmablauf als letztes steht wird dann ausgegeben (falls es ausgegeben werden soll). Aber auch in einem GlobalDB Aufruf - DBx.DBDx kann ich doch rumschreiben und rumsauen wie ich will oder gibt es da etwas was ich übersehe?
Klar kannst Du da auch "rumsauen" wie Du willst.
Aber wenn das in DBW an einer Out hängt wirst Du nicht viel erfolg mit dem "rumschreiben" haben. ;)

PS: Lieber schaut es nicht so gut aus, aber funktioniert. :D
 
Zuletzt bearbeitet:
Irgendwie macht es nicht klick bei mir. Hab jetzt alles durchgeschaut was ich so an Material da habe und sehe keinen Untershied zw. schreiben in ein MD und DBx.DBDx . Für mich sind das derzeit beides Speicherbereich in der CPU wo einfach was reingeschrieben wird.

Somit erklährt sich nicht für mich wieso der Transfer von einem OUT in einem FC mit einem MD klappt und mit einem DBx.DBDx nicht. Nach meinem empfinden und derzeitigem Verständnis müsste das Programm bei beiden Variablenarten gleich reagieren.

Bei Benutzung eines IN_OUTs klappt es mit beidem.

Hätte jemand die Lust mir das genauer zu erklähren? Würde mich freuen da ich gerne auch Verstehe was ich anwende. Mir würden auch paar Stichworte reichen bzw. Ort wo ich nach diesen suchen kann - will ja nicht alles vorgekaut haben - wobei hmm ;)


P.S Wie man das Problem umgeht ist mir nun klar aber ich würde verstehen wollen wie es zu diesem kommt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dieses Dokument aus den Siemens-FAQ sollte dich ein wenig aufklären:

Anhang anzeigen MzIyOTY1MjMxNjc1NDI0Mzc1AAAA_189227_1_inter_WW_2005-11-16.pdf

Die Kurzform:
Auf MC7-Ebene wird der Pointer von E A M L DBW, DBD ... direkt übergeben.
Sobald ein voll qualifizierter DB-Zugriff stattfindet wird der Ausgang in einem (nicht sichtbaren) Lokaldatenwort gespeichert,
und aus diesen dann nach dem eigentlichen Bausteinaufruf mittels der Sequenz
Auf DB
L LD ..
T DBD ...
in den DB übertragen.

Würdest du jetzt händisch VOR dem FC-Aufruf deinen DB öffnen, an die OUT-Var des Bausteins
lediglich DBD0 oder so schreiben, würde das auch wieder funktionierten.

Nun ist es aber so, das dieses LW/LD aber von JEDEM Bausteinaufruf verwendet wird.

Mfg
Manuel
 
Zurück
Oben