Hi nochmal
was ich bisher über die 1200 weiß ist die Parameterübergabe dort ganz anders als bei der 300/400. Der 1200 haben wir ja schon etwas unter den Rock geschaut ;-) Dem Verhalten nach ist es bei der 1500 so wie bei der 1200, aber die lässt sich nicht unter den Rock schauen, die hat Hosen an ;-)
Also Parameterübergabe bei einem FC auf der 1200:
Auch hier muss man wieder zwischen den einfachen (BOOL bis LREAL) und den komplizierten (String, Array, Struct) Datentypen unterscheiden. Einfache Datentypen zeigen ein Call-By-Value Verhalten, komplizierte Datentypen zeigen ein Call-By-Referenz Verhalten.
Es gibt bei der 1200 drei L-Bereiche, nicht nur einen wie bei der 300/400. L ist ein Stack, d.h. für jede FC und jeden FB wird vor dem Aufruf ein Stackframe angelegt. In diesem Rahmen darf der Baustein addressieren. Den L-Stack der 300/400 gibt es auch bei der 1200. Aber was sind die anderen beiden? Neben dem L gibt es noch einen L'. Bei einem nicht optimierten Baustein, landen die Tempvariablen auf dem L. Bei einem optimierten Baustein landen die Temp auf dem L'. Der Unterschied zwischen L und L' liegt darin, wie die Variablen dort landen. Bei L ist es wie auf der 300/400. Bei L' liegen die Variablen "vernünftiger".
Code:
L L'
a : BOOL 0.0 8.0
b : LREAL 2.0 0.0
Was soll da jetzt "vernünftig" sein? Naja, ich zitiere meinen Studierten: "Beim 64Bit-Zugriff auf 2.0 bekommt ein 32Bit Prozessor das kotzen". Drastisch aber klar. Noch ein Zitat: "Das habt ihr jetzt davon, dass ihr immer nach Adressen fragt und selber meint besser zu wissen wo das Bit zuliegen kommen soll" ...
Bei den DB gibt es diese Unterschiede auch. So bin ich überhaupt dahintergekommen. Wenn man mehrere Variablen im DB hat mit auffälligen Werten, kann man die beim Laden im Wireshark gut deren Muster beobachten. Aber zurück zum L und der Parameterübergabe.
So wir haben Bereich 1 für L und Bereich 2 für den optimierten L'. Der dritte Bereich ist der für die Parameter. Auch diese scheinen nach Größe sortiert und optimiert auf dem Stack zu liegen. Sehen kann man den Bereich des Stacks nicht -- ich zumindest :-( Aber das interessiert ja auch nicht, sondern wie es sich verhält. Und es verhält sich so wie eine Kopie.
Egal womit man einen einfachen Typen versorgt, ob E A M Temp oder aus einen DB und sogar bei Peripherie, wenn man einen INOUT hat, werden die Werte vor dem eigentlichen Aufruf in diesen Parameterbereich kopiert und nach dem Aufruf wieder zurück. Bei PE klappt das mit einem INOUT natürlich nicht. Man bekommt einen Fehler, nach dem der Baustein ausgeführt würde. Bei PA klappt ja schon das Lesen nicht also bekommt man den Fehler schon vor dem eigentlichen Aufruf, der Baustein wird gar nicht erst ausgeführt.
Die 1500 verhält sich genauso. Diese Verhalten finde ich insgesammt deutlich logischer als bei der 300/400, besonders wegen P, siehe oben.
Genug geschwafelt
'n schön' Tach auch
HB