1.3.4.4 Parameter als Kopie oder als Pointer übergeben
Einführung
Beim Bausteinaufruf übergeben Sie den Parametern in der Schnittstelle des Bausteins Daten.
An den Eingangsparametern (Input) übergeben Sie die Daten, mit denen der Baustein arbeiten
soll. An den Ausgangsparametern (Output) legen Sie fest, wo die Bearbeitungsergebnisse
abgelegt werden. Durchgangsparameter (InOut) dienen sowohl der Übergabe von Daten an
den aufgerufenen Baustein als auch der Rückgabe von Ergebnissen.
Intern kennt STEP 7 zwei unterschiedliche Methoden der Parameterübergabe: Abhängig von
Übergabebereich und vom Datentyp des Parameters werden die Daten entweder als Pointer
oder als Kopie übergeben.
Übergabe als Kopie (Call by value)
Beim Bausteinaufruf wird der Wert des Operanden auf den Eingangsparameter des
aufgerufenen Bausteins kopiert. Bei Funktionsbausteinen wird die Kopie im Instanz-DB
abgelegt, bei Funktionen im Baustein-Stack. Für die Kopie wird zusätzlicher Speicherplatz
benötigt.
Das bedeutet, dass der aufgerufene Baustein immer mit dem Wert arbeitet, den der
angegebene Operand zum Zeitpunkt des Bausteinaufrufs hatte. Er kann nicht direkt auf den
Operanden zugreifen. Schreibende Zugriffe verändern nur die Kopie, nicht aber den
tatsächlichen Wert des angegebenen Operanden. Lesende Zugriffe lesen nur die Kopie, die
zum Zeitpunkt des Bausteinaufrufs angelegt wurde.
Übergabe als Pointer (Call by reference)
Die Parameter werden beim Bausteinaufruf über einen Pointer referenziert.
Das bedeutet, dass der aufgerufene Baustein unmittelbar auf die Speicheradresse des
Operanden zugreift, der als Parameter angegeben ist: Schreibende Zugriffe führen direkt zur
Veränderung des angegebenen Operanden. Lesende Zugriffe lesen den Wert des Operanden
unmittelbar zum Zeitpunkt des Zugriffs. Da keine Kopien angelegt werden, wird kein
zusätzlicher Speicher benötigt.
Hinweis
Deklarieren Sie strukturierte Datentypen im Bereich "InOut"
Nutzen Sie für strukturierte Variablen (z. B. vom Datentyp ARRAY, STRUCT, STRING, …)
wenn möglich den Bereich "InOut" in der Bausteinschnittstelle. Da strukturierte
Durchgangsparameter (InOut) standardmäßig als Pointer übergeben werden, wird der
benötigte Datenspeicher so nicht unnötig vergrößert.
Parameterübergabe bei S7-1200/1500
Die folgende Tabelle zeigt, wie in S7-1200/1500 Bausteinparameter mit elementarem bzw.
strukturiertem Datentyp übergeben werden. Elementare Datentypen sind z. B. BOOL, INT
oder BYTE. Strukturierte Datentypen sind z. B. ARRAY, STRUCT oder STRING.
Hinweis
Parameterübergabe zwischen Bausteinen mit optimiertem Zugriff und Bausteinen mit
Standardzugriff
Wenn bei einem Bausteinaufruf Strukturen als Durchgangsparameter (InOut) an den
aufgerufenen Baustein übergeben werden, werden diese standardmäßig als Pointer
übergeben (Call by reference).
Dies gilt jedoch nicht, wenn beide Bausteine unterschiedliche Optimierungseinstellungen
haben: Wenn einer der Bausteine die Eigenschaft "Optimierter Zugriff" und der andere
Baustein die Eigenschaft "Standardzugriff" hat, werden grundsätzlich alle Parameter als Kopie
übergeben (Call by value).
Wenn der Baustein viele strukturierte Parameter enthält, kann das schnell dazu führen, dass
der temporäre Speicherbereich (Lokaldaten-Stack) des Bausteins überläuft.
Außerdem können Probleme entstehen, wenn die ursprünglichen Operanden durch
asynchrone Prozesse verändert werden, z. B. durch HMI-Zugriffe oder durch Alarm-OBs.
Wenn nach der Bausteinbearbeitung die Kopien wieder auf die ursprünglichen Operanden
zurückkopiert werden, werden dabei die seit dem Anlegen der Kopie beim Bausteinaufruf
asynchron durchgeführten Änderungen an den ursprünglichen Operanden überschrieben.
Das können Sie vermeiden, indem Sie für beide Bausteine dieselbe Zugriffsart einstellen oder
die asynchronen Zugriffe zuerst in einen separaten Speicherbereich schreiben lassen und
diesen Bereich dann zu einem geeigneten Zeitpunkt synchron kopieren.
Siehe auch:
Bausteine mit optimiertem Zugriff (Seite 39)
FAQ 109478253: Warum kann es zum Überschreiben von Daten des HMI-Systems oder des
Webservers in der S7-1500 kommen? (
https://support.industry.siemens.com/cs/de/de/view/
109478253)
Parameterübergabe bei S7-300/400
Die folgende Tabelle zeigt, wie in S7-300/400 Bausteinparameter mit elementarem bzw.
strukturiertem Datentyp übergeben werden.
* Ausnahme: Operanden aus den Speicherbereichen E, A, M, P, L und teilqualifizierte DBAdressen
(z. B. "DW 2") werden als Pointer übergeben.
Hinweis
Besonderheiten bei der Übergabe als Pointer in S7-300/400
In den Fällen, in denen die Parameter über einen Pointer übergeben werden, ist es nicht
möglich, Ausgangs- oder Durchgangsparameter vom aufrufenden Baustein an die
Eingangsparameter des aufgerufenen Bausteins weiterzureichen.