2. Versorgung der elementaren Ein- und Ausgangsparameter
Bei der Versorgung von elementaren Formalparametern (z.B. die Datentypen BOOL, BYTE, WORD oder DWORD) der Schnittstelle einer Funktion sind zwei Fälle zu unterscheiden.
- Der elementare Formalparameter wird mit einem Merker, einem Ein- oder Ausgang aus dem Prozessabbild oder aus dem Lokaldatenstack (L-Stack) des aufrufenden Bausteines versorgt.
In diesem Fall arbeitet der Code der Funktion mit einem bereichsübergreifenden Zeiger direkt(!) auf diesen elementaren Aktualparametern (z.B. P#E0.0, P#M0.0).
- Der elementare Formalparameter wird mit einer Konstanten oder einem Datenbausteinelement versorgt.
In diesem Fall wird der Wert des Aktualparameters vor dem Aufruf der Funktion in den L-Stack des aufrufenden Bausteines kopiert. Der Code der Funktion arbeitet dann mit einem bereichsübergreifenden Zeiger auf diesen Lokaldatenbereich des aufrufenden Bausteines.
Beachten Sie bitte, dass bei Ausgangsparametern keine Initialisierung erfolgt und die Eingangsparameter nicht gelöscht werden. Deshalb ist in diesem Fall darauf zu achten, dass Eingänge nur gelesen und Ausgänge in jedem Zyklus geschrieben werden. Bei Befehlen wie "S" oder "R" wird das Signal nur abhängig vom VKE geschrieben. Deshalb sollten Sie diese Befehle durch die Zuweisung "=" ersetzen oder die Werte vor der Abfrage initialisieren.
Wenn Sie das Beschreiben der Werte nicht in jedem Zyklus sicherstellen können, sollten Sie einen IN/OUT- Parameter verwenden.
Abhilfe:
- Wenn bei einem FC eine OUTPUT-Variable beim Aufruf mit einer DB-Adresse versorgt und diese OUTPUT-Variable im FC anschließend mittels Setz- bzw. Rücksetz-Befehl in einen definierten Zustand gesetzt werden soll, so führt der Aufruf dazu, dass der S- bzw. R-Befehl sich wie ein =-Befehl auswirkt. Die Ursache hierfür liegt darin, dass die beim FC-Aufruf mit DB-Adressen versorgten OUTPUT-Variablen beim Aufruf über den L-Stack versorgt werden. Sollte nun die Bedingung für den R- bzw. S-Befehl nicht mehr erfüllt sein, wird die OUTPUT-Variable nicht mehr beschrieben. Somit wird die DB-Zelle mit einem zufällig in dieser Lokal-Stack-Adresse stehenden Wert versorgt. In diesem Fall empfehlen wir Ihnen als Abhilfe die OUTPUT-Variable durch eine IN/OUT-Variable zu ersetzten. Dadurch wird die Lokal-Stack-Adresse vor dem Aufruf durch den Inhalt der DB-Adresse definiert vorbelegt.
- Das Verhalten kann auch auftreten, wenn der FC mehrfach aufgerufen wird und/oder DB-Variablen als Aktualwerte benutzt werden. Beachten Sie dabei bitte die Hinweise aus der STEP 7-Onlinehilfe "Vermeiden von Fehlern beim Aufruf von Bausteinen". Die OUT-Parameter in einem FC müssen bei jedem Bausteinaufruf im Zyklus beschrieben werden.