Step 7 Verständnis

Micha81

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe ein Verständnisproblem:

ich habe einen FC mit IN und Out Parametern.

im FC werden die Outparameter gesetzt. Nach meinem Verständnis kann das aber doch nicht gut funktionieren oder ?
Jetzt kann ja jemand auf die Idee kommen eine temp Variable an den out schreiben, dann habe ich doch jeden Zyklus ein undefiniertes Ergebnis oder ?
Wie ist das wenn ich einen Merker dran schreibe ?
Würde es dann funktionieren ?
Besser wäre ja ein in-out wobei dieser ja auch nicht temporär sein dürfte oder ?
 
Du meinst eine Temp-Variable dem FC als Parameter von außen an den Out-Parameter anzuschalten, oder innerhalb des FCs eine temp-Variable dem Out-Parameter zuzuweisen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du meinst eine Temp-Variable dem FC als Parameter von außen an den Out-Parameter anzuschalten, oder innerhalb des FCs eine temp-Variable dem Out-Parameter zuzuweisen?

Ne eine Temp Variable außen an den Out Parameter. Der FC hat ja keine Instanz und somit würde ein setzender Zugriff vermutlich kein setzender sein.
 
Wenn innerhalb des FCs dem Ausgangsparameter immer etwas zugewiesen wird (was immer gemacht werden sollte), dann kannst du auch eine Temp-Variable beim Aufruf anschalten. Nach dem Aufruf des FCs besitzt sie dann auch immer einen definierten Wert, nämlich den der innerhalb des FCs zugewiesen wurde.
 
Ja aber es ist dort folgendes programmiert:

U in1
S out1

Un in1
U in2
R out1

Also jetzt exemplarisch
Dann funktioniert das doch nicht oder ?
Out1 müsste doch wenn ein inout sein und auch von außen eine globale Variable oder eine statische sein oder ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte ja auch geschrieben, wenn dem Ausgangsparameter immer etwas zugewiesen wird.
Da ist dein Beispiel problematisch, weil eben out1 nicht immer etwas zugewiesen wird (wenn nicht in1 und nicht in2).

Aber auch wenn du den Parameter als InOut anlegst, könntest du theoretisch trotzdem außen eine Temp-Variable anschalten. Wenn du diese vorher selber mit einem entsprechenden Startwert belegst, ist das Verhalten auch definiert. Wenn auch unüblich.
 
Da ist dein Beispiel problematisch, weil eben out1 nicht immer etwas zugewiesen wird (wenn nicht in1 und nicht in2).
Hmmm. out1 wird nicht immer etwas zugewiesen? Doch, doch, das macht das BetriebsSystem, indem es auf dem Stack einen entsprechenden Platz ausguckt und diesen "undefinierten" Wert übernimmt (oder sogar noch initialisiert). Selbst wenn dieser Wert durch die "Anwender-"Befehle im FC nicht weiter verändert wird, so wurde bereits "unsichtbar" etwas zugewiesen.
Die Übergabe von out1 an das aufrufende Programm wird immer ausgeführt - auch wenn der Programmierer vergessen hat, out1 einen Wert zuzuweisen.
INOUT für out1 ist schon das Mittel der Wahl.
 
Guten Morgen zusammen,

also ich persönlich würde für solch eine Anwendung wie Heinileini schon schrieb einen INOUT verwenden und außen am Baustein mit einer remanenten, also dauerhaft speichernden Variable verschalten. Das heißt entweder eine DB Variable (Mein Favorit), oder einen Merker im remanenten Bereich. Dadurch bleibt der Zustand den man haben will dauerhaft bestehen und wird nicht vergessen. Alternativ könnte man im FC mit einer "=" Operation arbeiten, das geht aber mit dem gezeigten Beispielcode nicht.

Gruß Christian

EDIT: Remanent ist nur dann relevant, wenn du nach dem Neustart der CPU deinen Zustand behalten willst. Bei einem Merker außerhalb des remaneten Bereichs wird der Zustand während des normalen Betriebs auch behalten, allerdings bei Neustart der CPU auf FALSE gesetzt. Ich persönlich bin aber kein Freund davon für alles Mögliche Merker zu verwenden, das ist in meinen Augen ein unschöner Programmierstil. Funktioniert aber.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn an dem INOUT auch nur eine Temp-Variable dran ist, hat man das Problem des undefinierten Zustandes nur eine Ebene nach oben verschoben!
Ansonsten gilt was Heinileini schreibt.
 
@Micha:
Du könntest es dir vielleicht am Besten so vorstellen :
- soll dein Baustein aus den gegebenen Eingangsgrößen etwas berechnen/ermitteln und es soll nicht auf etwas "im Baustein gemerktes" zurück gegriffen werden dann könntest du hierzu einen FC nehmen (Beispiel : kontrollieren, ob sich ein Istwert innerhalb von vorgegebenen Grenzwerten bewegt).
- soll dein Baustein sich etwas "merken" oder willst du in dem Baustein mit Merkern arbeiten (würde ich heute nicht mehr machen) dann wäre ein FB die bessere Wahl (die Variablen, die sich etwas "merken" sollen aber unbedingt im STAT-Bereich definieren)

Dein Code-Beispiel wäre also in einem FB eigentlich besser aufgehoben (oder FC, der mit IN-OUT's für den Ausgang arbeitet).

Gruß
Larry
 
Wenn an dem INOUT auch nur eine Temp-Variable dran ist, hat man das Problem des undefinierten Zustandes nur eine Ebene nach oben verschoben!
Sicher doch! Aber, wie ich Thomas verstanden habe, sagt er, man hat in der aufrufenden Ebene die Chance, dafür zu sorgen, dass die "auch-nur-Temp-Variable" nicht (mehr) undefiniert ist in dem Moment, in dem sie per INOUT an den FC übergeben wird. Recht hat er.
Je nach Sinn und Zweck und Bedeutung des betreffenden Bits kann das sinnvoll und zweckmässig sein oder ein total irreführender und unnötiger Umweg.
Wenn wir z.B. an einen FlankenMerker denken, der bis zum nächsten PLC-Zyklus "überleben" muss, wäre es Unsinn, dafür z.B. eine TempVariable des OB1 zu verwenden.
Ob die Variable "nur" statisch oder besser remanent sein sollte, ist ein ganz anderes Thema.
 
Zurück
Oben