Beschreibung:
Dieser Beitrag erfasst die folgenden Themengebiete:
- Sporadisch falsche Rückgabewerte bei den OUT-Parametern einer Funktion
- Versorgung der elementaren Ein- und Ausgangsparameter
- Unterschied zwischen Formal- und Aktualparametern
- Sporadisch falsche Rückgabewerte bei den OUT-Parametern einer Funktion
Dieses Verhalten von STEP 7 bezüglich der OUT-Parameter von Funktionen (FCs) kann folgende Ursache haben:
Gemäß IEC 1161 ist der FC ein Baustein ohne Gedächtnis und im Gegensatz zum FB hat der FC keine statischen Variablen. Die Bausteinparameter werden bei Funktionen und Funktionsbausteinen unterschiedlich abgelegt.
Unterschied zwischen statischen und temporären Lokaldaten:
- Statische Lokaldaten sind Operanden, die im Instanz-DB des FBs abgelegt werden. Statische Lokaldaten gehen nach der Beendigung des Bausteins nicht verloren.
- Temporäre Lokaldaten werden nicht im Instanz-DB, sondern im Lokaldatenstack im Systemspeicher der CPU abgelegt und können nicht über Zyklusgrenzen hinaus verwendet werden. Diese temporären Lokaldaten werden zur Zwischenspeicherung von Ergebnissen verwendet und stehen nur während der Programmbearbeitung zur Verfügung. Die Daten gehen nach Beendigung des Bausteins verloren.
Darstellung für die interne Arbeitsweise der CPU bzw. der Parameterablage bei FCs
Die temporären Lokaldaten werden in der Reihenfolge der Deklaration - gemäß dem Datentyp - im Lokaldatenstack abgelegt:
L Input T LW"1" Initialisierung der Variable L InOut T LW"3" Initialisierung der Variable CALL FC L LW"2" // Initialisierung der Variable wird hier nicht durchgeführt!
// Der Anwender muss hier sicherstellen, dass die OUTPUT Variable
// bei jedem Durchlauf des FCs beschrieben wird: T Output
L LW"3" T InOut Nach dem Aufruf der FC legt der Editor die Bausteinparameter als bereichsübergreifende Bereichszeiger im Bausteincode ab. Jeder Bausteinparameter benötigt ein Doppelwort Speicherplatz:
- P# LW"1" INPUT (E,A,M)
- P# LW"2" OUTPUT (E,A.M)
- P# LW"3" IN_OUTPUT (E,A,M)
Der Editor verwendet die temporären Lokaldaten bei der Bausteinparameterübergabe. Je nach Datentyp und Deklarationstyp weist der Zeiger auf den Aktualparameter:
L LW"2" T Output L LW"3" T InOut
Im Gegensatz zum Funktionsbaustein gibt es bei der Funktion nur eine "nicht remanente" Speicherung der Daten im Lokaldatenbereich. Dadurch ist eine Auswertung / Zuweisung der Daten beim Aufruf der Funktion zwingend erforderlich.
( 3 KB )
Bild 01
Durch diese Art der Parameterübergabe bei FC-Aufrufen wird vom Betriebssystem der Lokaldatenstack verbraucht. Dem Anwender steht somit nicht der volle Stack zur Verfügung.
- 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.
Weitere Informationen zu diesem Thema finden Sie in der Online-Hilfe auch unter den Suchbegriffen:
- Vermeidung von Fehlern beim Aufrufen von Bausteinen
- Zulässige Datentypen beim Übergeben von Parametern.