ich habe ein Problem mit einem FC und der Funktion OpenDB.
Soweit ich es verstanden habe, öffnet die Funktion OpenDB einen am FC-Eingang spezifizierten DB, wodurch ich danach auf die Adressen zugreifen kann, ohne den DB explizit nochmal zu erwähnen. Das nutze ich, um aus mehreren, gleich strukturierten DBs Infos zu ziehen und diese in jeweils eine Struktur zu packen.
Mein FC soll also einen DB nehmen, Daten rausziehen (die immer an den gleichen Adressen innerhalb des DBs stehen) und diese dann in eine Struktur verpacken.
Allerdings funktioniert das nicht. In NW1 des FC wird der DB geöffnet.
NW2 liest einen Real-Wert von DBD18 und verarbeitet diesen weiter. Funktioniert super.
NW3 liest einen Real-Wert von DBD14 und verarbeitet diesen weiter. Funktioniert nicht. Warum? Was könnte ich hier falsch gemacht haben? An der FC-Schnittstelle wird auch der DB übergeben und mit richtigem Symbol dargestellt.
durch das Schreiben in "OUT.T_VL" wurde vielleicht in #DB_Nr 0 eingetragen?
Speziell, wenn man mit DB- und Adressregistern arbeitet, bietet sich die Programmierung mit AWL an, da man so direkt sehen kann, welcher DB aufgeschlagen ist.
Ich schreibe doch aber gar nicht auf einen DB, oder sehe ich das falsch? Wird die Struktur am Ausgang erst nach Abarbeitung des FCs in den DB geschrieben?
Moin,
das "OUT.T_VL" ist ein vollqualifizierter DB-Zugriff. Damit wird der DB aufgeschlagen, der außen am Formalparameter angegeben wurde.
Tipp: AWL nutzen. Dann kannst Du sehen, welcher DB aufgeschlagen wurde.
Nein, ist es nicht. Es ist ein Zugriff auf eine Struktur (vermutlich im Bereich OUT).
Bei FC kommt es darauf an, was für ein Aktualparameter beim FC-Aufruf verschaltet ist.
Elementare Datentypen: Bei E/A/M ist die Übergabe "Call by Referenz" und es wird sofort auf den Aktualparameter geschrieben. Bei DB ist die Übergabe "Call by Value" und es wird erst nach Ende des FC-Durchlaufs aus dem Übergabeparameter (im Stack) in den Aktualparameter kopiert.
Zusammengesetzte Datentypen: werden vermutlich auch bei OUT als "Call by Referenz" übergeben - das würde halbwegs erklären, warum Zugriff auf "OUT.T_VL" evtl. das DB1-Register verändert. Möglicherweise kann man das beim Beobachten als AWL (oder mit PLCSIM im Einzelschritt?) sehen. Mir kommt das Problem im Moment noch komisch vor... habe aber jetzt keine Zeit, das genauer zu untersuchen.
siehe "Hilfe zu AWL" Thema: "Parameterübergabe" und "Hilfe zu STEP 7" Thema: "Parameterübergabe bei Bausteinen"