Step 7 Kein Wert nach Open-DB

Januar

Level-2
Beiträge
238
Reaktionspunkte
52
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

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.

1702461438989.png
 
Moin Januar,

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.
 
Ja, das hat jetzt das gewünschte Ergebnis gebracht. Ich habe jetzt vor jedem Zugriff auf den DB den DB nochmal explizit geöffnet.

Lustigerweise war das aber auch nicht konsistent, meine ich. Es gab später im FC noch andere Zugriffe, die dann wieder funktioniert hatten.
 
Wandel mal in AWL und beobachte dann die offenen DBs im Programm.

Sieht danach aus, als ob der Out hier mit Call by Ref und nicht Call by Value übergeben wird und damit ein anderer DB geöffnet wird.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das "OUT.T_VL" ist ein vollqualifizierter DB-Zugriff.
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"
 
Zuletzt bearbeitet:
Zurück
Oben