Ja, indirekt auf IN/OUT bei FC ist gefährlich.
Achtung, der Code von Larry funktioniert nur in einem FB.
In einem FC liefert "L P##boTakt1" NICHT die Adresse des Ausgangsparameters boTakt1 sondern die Adresse der am Ausgang boTakt1 angeschlossenen Variable.
Und nicht einmal das direkt.
Kleines Bespiel...
Wenn man am FC-Ausgang einen Merker verwendet, dann kommt man im FC an die Adresse dran.
Wenn man am FC-Ausgang jedoch ein Datenbaustein-Bit verwendet, dann nicht mehr direkt.
Mann kann dann schon mittels Pointer auf die Adressen schreiben, man schreibt dann halt nur irgendwohin...
Ein weiteres Problem ist der Unterschied ob der FC in FUP oder AWL aufgerufen wurde.
Hier ein Beispiel für den Unterschied und was man jeweils bekommt wenn man versuch indirekt auf in Parameter zuzugreifen.
Allein dieser Unterschied macht es schon so gut wie unmöglich sinnvoll auf diese Weise zu arbeiten.
Die SPS legt beim Aufruf des FC die IN/OUT-Parameter in den Temp-Bereich und arbeitet dann intern mit Pointern auf die "Vorigen Lokaldaten".
IM FUP-Aufruf macht der AWL-Umsetzer das noch vorher (sichtbar), beim direkten AWL-Aufruf macht's die Maschine (unsichtbar)
Nach dem FC-Aufruf wird dann wieder vom TEMP auf die eigentlichen Adressen kopiert.
Ich wusste aber schon mal besser über dieses Verhalten bescheid. Vielleicht kann ja hier noch mal jemand genauer Licht ins Dunkel bringen wie das Handling bei den FCs funktioniert. Vor allem der Unterschied wenn man einen Merker und
einen DB am OUT hat....
Würd mich jetzt echt nochmal interessieren...
@
Katakis
Für deinen Fall wird's wohl das einfachste sein wenn du...
a) einen FB draus machst
b) Wenn's ein FC sein muss würd ich's vermutlich so machen:
- Doppelwort an FC - IN/OUT als Speicher
- Doppelwort auf ein 32Bit-Array im Temp kopieren
- Bits entsprechend manipulieren
- Bits aus Temp auf FC-Out kopieren
- 32Bit Array aus Temp wieder auf Doppelwort in FC-IN/OUT sichern.