TIA Verständnisproblem

Zuviel Werbung?
-> Hier kostenlos registrieren
In einem FB wäre das dann wohl nicht aufgetreten, da der ja diesen Instanz-DB hat, richtig?
So ganz auch nicht.

Auch der FB übergibt einen Wert an seine Outs.
Wie Harald schon feststellte, sind FC/FBs immer Zuweisungen an die Ausgänge, egal ob Du im Baustein was aktiv dazu machst oder nicht.
Somit überschreibt die Zuweisung des 2. Bausteins immer die des 1.
Im FC ist das ohne Zutun im Baustein wie weiter oben festgestellt der Defaultwert, im FB dagegen der zuletzt im Baustein zugewiesene Wert, weil der gespeichert wird.

Deine Variable im DB würde also immer den Wert des FB2 bekommen, selbst wenn dort der Merker nicht gesetzt ist.
Somit wäre auch hier InOut wieder die richtige Wahl.
 
TIA hat keine Fehlermeldung, bzw. Warnung ausgegeben!
Dann läßt sich diese Warnung vielleicht abstellen? Ich meine mich zu erinnern, daß hier schonmal Fragen deswegen kamen, wenn TIA warnt wegen bedingter oder übersprungener Zuweisungen.
Oder war das wegen Lesen von TEMP ohne Schreiben??? War das überhaupt bei SCL??? Hmm... Ich weiß nicht mehr, ich habe noch fast keine eigenen TIA-Erfahrungen.

Und im DB wurde permanent eine 0 eingeschrieben; ganz egal was in FC1 programmiert ist.
Das wird wohl daher gekommen sein, weil nach FC1 noch FC2 aufgerufen wurde, mit einem OUT auf die selbe DB-Variable. Dann gewinnt IMMER FC2, egal was der FC1 tut. Und der FC2 hat anscheinend tatsächlich das gemacht, was in der TIA-Hilfe beschrieben ist: den BOOL-Defaultwert 0 ausgegeben.

Wie auch immer, wenn ich das, wie von dir vorgeschlagen, als IN_OUT mache, so klappt alles ganz prima!
Jepp, das wurde Dir ja von mehreren Leuten so empfohlen.

In einem FB wäre das dann wohl nicht aufgetreten, da der ja diesen Instanz-DB hat, richtig?
Nein, auch da brauchst Du einen IN_OUT. Hat hucki ja schon beschrieben.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In einem FB wäre das dann wohl nicht aufgetreten, da der ja diesen Instanz-DB hat, richtig?
Richtig!
:confused:
Sehe ich anders.
Hier würde sogar der Wert des 2. FB zugewiesen, wenn der Merker darin nicht aktiv ist, weil der OUT im IDB gespeichert ist und nicht wie bei InOut auf den Wert des FB1 gesetzt wird.

PS: Natürlich erst, wenn der Merker mindestens einmal auf 1 war, vorher halt der Default des OUTs.
 
:oops: hucki, mußtest Du jetzt meine zuerst falsche Antwort zitieren ;) :oops:
Wird wohl langsam Zeit für Wochenende...

Harald

Ach menno - und ich hatte mich schon gefreut, endlich auch mal etwas richtig zu deuten. Naja, war wohl wieder Nichts!

... was mir aber an dieser Sache immer noch etwas Kopfzerbrechen bereitet:

Der Sinn (soweit ich das jetzt verstanden habe), dass man IN_OUT verwendet ist doch der, dass der Ausgang beim Aufruf des Bausteins einen definierten Zustand - z.B. aus dem letzten Zyklus - bekommt.

Aja, und bei einem definierten Zustand wird der Zustand des Merkers beachtet und nichts an den DB weitergereicht. 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? :confused:
 
... was mir aber an dieser Sache immer noch etwas Kopfzerbrechen bereitet:

Der Sinn (soweit ich das jetzt verstanden habe), dass man IN_OUT verwendet ist doch der, dass der Ausgang beim Aufruf des Bausteins einen definierten Zustand - z.B. aus dem letzten Zyklus - bekommt.
Nein. Der Sinn des INOUTs ist, das die Variable im Baustein zuerst den Wert der Variable außerhalb bekommt (und zwar des aktuellen Zyklus).
Dann kann sie im Baustein einen neuen bekommen oder auch nicht. Und das Ergebnis davon geht wieder nach außen.

Kleine Eselsbrücke (wenn auch technologisch für IN und OUT nicht korrekt): Die Variable bekommt Innen einen neuen Wert oder behält den alten von außen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein. Der Sinn des INOUTs ist, das die Variable im Baustein zuerst den Wert der Variable außerhalb bekommt (und zwar des aktuellen Zyklus).

Ja, und damit aber doch einen definierten Zustand erhält - oder?

Denn wie im vorliegenden Fall wurde bei mir ja, da undefinierter Zustand, einfach der Defaultwert nach außen an den DB übergeben - und das, obwohl ja der Code von rechtswegen überhaupt nicht bearbeitet wurde (wegen Merkerstatus!).
 
Ja, und damit aber doch einen definierten Zustand erhält - oder?

Denn wie im vorliegenden Fall wurde bei mir ja, da undefinierter Zustand, einfach der Defaultwert nach außen an den DB übergeben - und das, obwohl ja der Code von rechtswegen überhaupt nicht bearbeitet wurde (wegen Merkerstatus!).
Ja, ich hab' überlegt, ob ich oben Jein schreibe.

Und ja, sie erhält einen definierten Wert.
Doch nicht so, wie Du oben meintest, aus einem früheren Zyklus (PS: wobei es der vom vorigen Zyklus sein kann, wenn außerhalb des Bausteins nichts an ihm verändert wird.). So ist es beim OUT in einem FB, da dessen Wert aus dem letzten Zyklus im IDB gespeichert wird.
Und letztendlich erhalten ja bei TIA, wie weiter oben festgestellt, alle Variablen einen definierten Wert. Nämlich ggf. den Default.

Bei INOUT wird jedoch immer als Erstes der Wert der Variablen außen am Baustein an die Variable im Inneren des Bausteins übergeben. Egal ob FB oder FC.
 
Zuletzt bearbeitet:
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? :confused:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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

Hm ok, würde mal Folgendes dazu schreiben wollen:

M10.0 FALSE --> Wert = 123

M10.0 TRUE --> Wert = 456

:confused:
 
Zurück
Oben