Im Zusammenhang mit Multiinstanzen (MI) und AR2 versteckt der Step7 Editor einige Dinge die man zum Verständnis des Ganzen braucht.
Ich versuche mal eine Erläuterung anhand eines Beispieles:
Zwei Bausteine FB1 und FB2. FB1 ist MI-fähig, FB2 nicht MI-fähig:
Code:
FUNCTION_BLOCK "FB1_Multiinstanzfaehig"
VAR
wSTAT : WORD ;
END_VAR
BEGIN
L #wSTAT;
END_FUNCTION_BLOCK
FUNCTION_BLOCK "FB2_NichtMultiinstanz"
CODE_VERSION1
VAR
wSTAT : WORD ;
END_VAR
BEGIN
L #wSTAT;
END_FUNCTION_BLOCK
Bei der symbolischen Programmierung zeigt der Step7 Editor im ersten Netzwerk
L #wSTAT
an.
Da die CPU im Gegensatz zum Step7-Editor keine Symbolik kennt, wird in Wirklichkeit folgendes gemacht:
Im "FB1_Multiinstanzfaehig":
und im "FB2_NichtMultiinstanz":
Hier kann man auch sehen, dass ein nicht MI-fähiger FB geringfügig schneller ist als ein MI-fähiger, aber das nur nebenbei.
Nun, wer schreibt in das AR2 den passenden Offset? Das macht auch der Step7 Editor "unter der Haube" beim Aufrufen der entsprechenden Bausteine.
Um dem Beispiel oben zu folgen: Es wird ein FB3 (MI-fähig) angelegt, in dem die Bausteine oben folgendermaßen aufgerufen werden:
1. FB1 als MI im FB3
2. FB1 mit eigenem Instanzdatenbaustein
3. FB2 mit eigenem Instanzdatenbaustein (geht ja auch nicht anders)
Zur Verdeutlichung der Adressen habe ich im Stat-Bereich noch eine Dummy-Variable (wFoo) angelegt.
Code:
FUNCTION_BLOCK "FB3_Aufrufe"
VAR
wFoo : WORD;
FB1_Instanz : "FB1_Multiinstanzfaehig";
END_VAR
BEGIN
NETWORK
TITLE =FB1 als Multiinstanz
CALL #FB1_Instanz ;
NETWORK
TITLE =FB1 mit eigenem Instanz-DB1
CALL "FB1_Multiinstanzfaehig" , DB 1 ;
NETWORK
TITLE =FB2 (nicht MI-fähig) mit eigenem DB 2
CALL "FB2_NichtMultiinstanz" , DB 2 ;
END_FUNCTION_BLOCK
Jetzt die verschiedenen Aufrufe mit dem was der Step7 Editor drumherum schreibt:
1. FB1 als Multiinstanz im FB3
Code:
L DINO
T LW 4
TDB
AUF DI [LW 4]
TAR2 LD 0
+AR2 P#2.0
UC "FB1_Multiinstanzfaehig"
LAR2 LD 0
TDB
Hier wird einmal das AR2 in LD 0 gerettet (LD 0 ist in diesem Fall frei da keine Temp-Variablen im FB3 angelegt sind).
Dann wird der Offset der Instanzdaten wie in der Deklaration zu AR2 hinzuaddiert.
Somit kann nachhher im Baustein mit L DIW [AR2,P#0.0] auf die Instanzvariablen +Offset zugegriffen werden.
Wie man sieht wird hier das AR2 vor dem Aufruf gesichert und nach dem Aufruf wieder zurückgeschrieben.
So kann ein "wildgewordener" FB wenigstens nur sich, und nicht auch den Aufrufer durcheinanderbringen.
2. FB1 mit eigenem Instanz-DB 1
Code:
TDB
AUF DI 1
TAR2 LD 0
LAR2 P#DBX 0.0
UC "FB1_Multiinstanzfaehig"
LAR2 LD 0
TDB
Hier wird das AR2 mit einem Zeiger auf DBX0.0 geladen, damit im Baustein am Offset 0 auch der Anfang des eigenen Instanz-DBs steht.
3. FB2 (nicht MI-fähig) mit eigenem DB 2
Code:
TDB
AUF DI 2
TAR2 LD 0
LAR2 P#DBX 0.0
UC "FB2_NichtMultiinstanz"
LAR2 LD 0
TDB
Hier wird zwar auch das AR2 entsprechend geladen, obwohl es eigentlich unnötig wäre da im FB2 das AR2 für den Zugriff
auf die Stat-Variablen garnicht benötigt wird.
Aber der Step7 Editor "baut" dieses einfach um jeden Aufruf herum.
Gruß
Thomas