Also erstmal: Es stellt sich die Frage, ob im Rahmen der Aufgabe tatsächlich ein Merker (= Variable im Merkerbereich der Steuerung) benutzt werden muss oder ob hier einfach ein S7-Veteran eine
CoDeSys-Aufgabe stellen wollte.
Sollte es sich um einen Merker handeln müssen (warum auch immer, i.d.R. gibt es keine Notwendigkeit, Variablen als Merker zu deklarieren...und wenn die besteht, weiß man es), so ist die genannte Definition/Deklaration schon richtig so.
Es ist erstmal auch völlig irrelevant, wo der Merker deklariert wird. In FB's sollte man's vermeiden, weil dann erstens jede Instanz auf den selben Speicherbereich zugreift und es generell unsauber ist, auf Variablen von "außerhalb" des aktuellen Bausteins zuzugreifen. In FC's gilt der zweite Punkt ebenso. Folglich bleiben die Programme und die globalen Variablenlisten.
Wie schon erwähnt wurde, reicht die Deklaration innerhalb des aufrufenden Programms aus.
Ist die Variable (ich nenne sie bewusst nicht "Merker", weil das für mich ein Speicherbereich ist, und ich sehe hier keinen Sinn, das Ding auf ne Adresse zu packen) global deklariert, kann man THEORETISCH aus dem FB direkt drauf schreiben oder daraus lesen. Sollte man aber - wie gesagt - bleiben lassen.
Ist die Variable innerhalb des aufrufenden Programms deklariert, so wird der FB sie nicht "sehen" können. Legt man sie nun lokal im FB nochmal an, so ist das einfach eine lokale Variable, die zufällig den selben Namen trägt, wie eine lokale Variable des aufrufenden Programms. Der Wert innerhalb des FB ist also nicht der selbe, wie in der Variable außen.
Folgendes sollte funktionieren:
1. Anlegen der Variablen bMerker1 innerhalb des aufrufenden Programms:
Code:
VAR
bMerker1: BOOL; (* Die Variable *)
END_VAR
2. Deklaration einer schreib- wie lesbaren Variablen im FB:
Code:
VAR_IN_OUT
IObMerker: BOOL; (* In/Out für das Verändern von bMerker1 *)
END_VAR
3. Beim Aufruf des FB die Var. bMerker1 übergeben:
Code:
fbInstanzA(IObMerker := bMerker1);
4. Im AS mit dem Qualifier S oder R (ich empfehle, IEC-Schritte zu verwenden) die Variable IObMerker manipulieren. Die Änderung wird dann - durch die Verwendung von VAR_IN_OUT - direkt auf die übergebene Variable angewendet. Ist quasi eine Übergabe per Referenz.
BY THE WAY: Sollte mal der Zugriff auf eine globale Variable aus einem FB/FC heraus nötig sein, so sollte dieser nur auf KONSTANTEN erfolgen. Diese sollte man dann (eigentlich) gemäß der IEC mittels VAR_EXTERNAL im FB nochmals deklarieren. Ausnahmen von dieser Regel sollte man sich gut überlegen, denn wirklich sauber ist dieser Zugriff unter Umgehung des Bausteininterfaces sicher nicht. Ich verweise hierzu auf meine Signatur...