Der IN_OUT heißt IN_OUT, weil vor dem Aufruf des FB/FC der Wert des außen angegebenen Aktualparameters in den Baustein-Formalparameter kopiert wird (wie bei einem IN) und nach Ende des FB/FC der Wert vom Formalparameter in den Aktualparameter kopiert wird (wie bei einem OUT). Dadurch bekommt der IN_OUT ein Gedächtnis, falls ihm im Baustein nichts zugewiesen wird - das was Du als "definiert" bezeichnest.
Oder anders gesagt, bei einem undefinierten Zustand würde von FC/FB (unabhängig vom Merkerstatus) immer der Defaultwet "durchgereicht" werden, was bei einem definierten Zustand nicht der Fall ist. Könnte man das so formulieren?
Nein, leider nicht. Der Zustand des Merkers wird beachtet und FB und FC verhalten sich unterschiedlich:
- ist der Merker TRUE und wird dadurch im FB/FC die Zuweisung ausgeführt, dann erscheint an dem Ausgang und damit in der angeschlossenen DB-Variable der zugewiesene Wert.
- ist der Merker FALSE, dann wird im FB/FC nichts auf den Formalparameter des Ausgangs zugewiesen. Bei einem FC erscheint dadurch der Defaultwert am Ausgang, bei einem FB der Wert, den der Formalparameter des Ausgangs vorher hatte (aus dem Instanz-DB). (das bezieht sich jetzt auf einen OUT)
bei einem definierten Zustand wird der Zustand des Merkers beachtet und nichts an den DB weitergereicht.
Es wird auf jeden Fall etwas an die DB-Variable weitergereicht, weil eine Parameterübergabe eine Zuweisung ist, die immer ausgeführt wird, wenn der Bausteinaufruf bearbeitet wird. Bei einem IN_OUT fällt das Schreiben in die DB-Variable aber nicht auf, weil es der selbe Wert von vor der Bausteinbearbeitung ist (wenn in dem Baustein keine andere Zuweisung stattfindet).
Diese tatsächlich stattfindende Zuweisung des selben Wertes sieht man in folgendem Fall:
Würde der FB/FC durch einen OB unterbrochen, welcher der selben DB-Variable einen anderen Wert zuweist, dann würde nach Ende des FB/FC die Zuweisung aus dem OB zunichte gemacht werden, dadurch daß die Zuweisung des alten Wertes am Ausgang des FB/FC ausgeführt wird.
Oder einfacher nachprüfbar: der FB/FC selbst schreibt direkt auf die globale DB-Variable
Code:
// Aufruf des FC1
DB1.DW0 := 123 ;
FC1(tuwas:=M10.0, IN_OUT_1:=DB1.DW0) ;
Code:
// FC1:
IF tuwas THEN
IN_OUT_1 := 456 ;
END_IF ;
DB1.DW0 := 789 ;
Wenn M10.0 FALSE ist dann hat nach Abarbeitung des FC1 der DB1.DW0 den Wert .....?
Wenn M10.0 TRUE ist dann hat nach Abarbeitung des FC1 der DB1.DW0 den Wert .....?
Harald