Registerindirekte Adressierung in Multiinstanz

Beiträge
9.189
Reaktionspunkte
2.934
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein Problem mit der registerindirekten Adressierung. Und zwar habe ich einen FB in dem ich einen weiteren FB als Multiinstanz aufrufe. In diesem FB der Multiinstanz möchte ich nun in einer Schleife mit der Registerindirekten Adressierung arbeiten, da die absolute Adresse sich ja immer verschieben kann.
Beispiel:
Code:
      L     P##FiFO_Letzter_Antrieb_1   // Zeiger auf ersten Eintrag in Liste
      LAR1                                  // ins Adressregister laden
      L     #FiFo_Zeiger                 // FiFo Zeiger laden
      L     1
      -I    
      SLW   3                             // Auf Zeigerformat bringen
      +AR1                                // Zum Adressregister hinzuaddieren
      L     #Nr_Letzter_Antrieb      // Wert
      T     DBB [AR1,P#0.0]             // und Wert in Adresse schreiben
Nun wird der Wert aber nicht an die passende Adresse geschrieben.
Im der Variablendeklaration der statischen Variablen steht #FiFO_Letzter_Antrieb_1 an Adresse 38.0. Im DB jedoch an Adresse 76. Der Wert wird jedoch nicht an Adresse 76.0, sondern an Adresse 38.0 im DB geschrieben.
In der Zuweisung habe ich auch schon T B oder T DBI probiert, es ändert sich aber nicht.
Achja, ich probiere mit PLCsim weil ich leider keine SPS zur Verfügung habe.

Kann ich das Problem irgendwie lösen ohne den Offset fest anzuparametrieren?

Grüße
Thomas
 
Mal schnell getippt

TAR2 // Offset für Multiinstanz aus AR2
SLD 8 // Maskieren
SRD 8 //
T #AR2 //


LAR1 P##FiFO_Letzter_Antrieb_1 // Zeiger auf ersten Eintrag
L #FiFo_Zeiger // FiFo Zeiger laden
L 1
-I
SLW 3 // Auf Zeigerformat bringen
L #AR2
+D
+AR1 // Zum Adressregister hinzuaddieren
L #Nr_Letzter_Antrieb // Wert
T DBB [AR1,P#0.0] // und Wert in Adresse schreiben

Hab mal schnell ne möglichkeit getippt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
das mit dem AR2 war mit neu, in meinen Unterlagen und in der Siemens-Hilfe finde ich da auch keine nähere Beschreibung zu.
Hier im Forum gibt es einen Thread in dem steht, dass im AR2 der Offset in einem Multiinstanz-DB gespeichert ist. Aber ich will den Baustein ja nicht auf Multiinstanz festnageln, er soll universell einsetzbar sein.
Gibt es diesbezüglich noch irgendwelche Informationsquellen?
Was steht z.B. im AR2 wenn ich den Baustein nicht als Multiinstanz aufrufe?
 
Hi,
das mit dem AR2 war mit neu, in meinen Unterlagen und in der Siemens-Hilfe finde ich da auch keine nähere Beschreibung zu.
Hier im Forum gibt es einen Thread in dem steht, dass im AR2 der Offset in einem Multiinstanz-DB gespeichert ist. Aber ich will den Baustein ja nicht auf Multiinstanz festnageln, er soll universell einsetzbar sein.
Gibt es diesbezüglich noch irgendwelche Informationsquellen?
Was steht z.B. im AR2 wenn ich den Baustein nicht als Multiinstanz aufrufe?


Dann sollte im AR2 eine Null stehen und somit ist der Baustein universell. Teste das doch mal und schreibe das Ergebnis hier rein.

pt
 
Danke, funktioniert!
Wird der Baustein nicht als Multiinstanz aufgerufen steht im Adressregister AR2 nach ausmaskieren (SLD 8, SRD 8 ) eine 0.
Also lässt sich der Baustein nun universell einsetzen.
Getestet habe ich es aber auch nur mit PLCSim.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Adressregister

AR2 wird in der S7 als Baisadressregister verwendet. Beim Aufruf einer Instanz steht P#DBx0.0 im AR2. Wenn eine Multiinstanz aufgerufen wird erhöt sich die Basisadressen um die Startadresse der Lokalinstanz.

Achtung: Soll mit dem AR2 im Multiinstanzbaustein gearbeitet werden, muss der INhalt vorher gerettet werden.
 
Ich hoffe jemand sieht sich das Thema noch an xD

TAR2 // Lädt das Adressregister 2 in Akku 1 - OK
SLD 8 // Schieben Links um 8 bits im Doppelwort - Warum?
SRD 8 // Schieben Rechts um 8 bits im Doppelwort - Warum?
T #AR2 // Trasferiere das in die Variable AR2 - Na ok

könnte mir das bitte wer beschreiben?

Ich wollte heute auch einen FB multiinstanzfähig machen, scheiterte aber daran das ich im aufzurufenden FB mehrere Statische Wörter in ein PEW schiebe. Also..

L DIW 52
TAW
T PAW [#OUT_ADR_TMP]

Rufe ich das jetzt in einer multiinstanz auf schiebt er es natürlich in die DB adresse des Übergeortneten FB, der Offset fehlt dann natürlich.

Würde denn sowas gehen:

L DIW [AR2, P#52.0]
TAW
T PAW [#OUT_ADR_TMP]


MFG Befree
 
Zuletzt bearbeitet:
TAR2 // Lädt das Adressregister 2 in Akku 1 - OK
SLD 8 // Schieben Links um 8 bits im Doppelwort - Warum?
SRD 8 // Schieben Rechts um 8 bits im Doppelwort - Warum?
T #AR2 // Trasferiere das in die Variable AR2 - Na ok

könnte mir das bitte wer beschreiben?
Über die Schiebebefehle wird die Bereichskennung des Pointer ausmaskiert. In einem Multiinstanz-FB steht dort nach laden des AR2 0x85 drin. Diese Kennung steht für DI (Instanzdatenbaustein).
Ausmaskieren würde auch über verUNDen gehen.

L DIW 52
TAW
T PAW [#OUT_ADR_TMP]

Lege das DIW im statischen Bereich doch einfach symbolisch an und greife auch darüber mit dem Ladebefehl zu.
Also
Code:
L #myStatWord
TAW
T PAW [#OUT_ADR_TMP]
Wenn der FB als Multiinstanzfähig deklariert wurde, generiert der Step7-Editor für dich nicht sichtbar daraus automatisch den Pointer mit dem Offset.
Aus der symbolischen Adressierung wird bei einem Multiinstanz-FB:
Code:
L     DIW [AR2,P#8.0]
Bei einem Nicht-Multiinstanz-FB würde daraus schlicht:
Code:
L     DIW 8
generiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
erstmal Danke Thomas

Über die Schiebebefehle wird die Bereichskennung des Pointer ausmaskiert. In einem Multiinstanz-FB steht dort nach laden des AR2 0x85 drin. Diese Kennung steht für DI (Instanzdatenbaustein).
Ausmaskieren würde auch über verUNDen gehen.

Bedeutet Ausmaskieren in diesem Fall das ich die "reine" Adresse separiere und das DI aus dem Register "lösche"?

Lege das DIW im statischen Bereich doch einfach symbolisch an und greife auch darüber mit dem Ladebefehl zu.

Im FB benutze ich 16 Bits zur kommunikation mit einem FU, diese übertrage ich durch das verschieben des DIW.

Wenn der FB als Multiinstanzfähig deklariert wurde, generiert der Step7-Editor für dich nicht sichtbar daraus automatisch den Pointer mit dem Offset.

OK - dann müsste das doch schon der richtige Befehl sein oder?

Code:
L DIW [AR2,P#52.0]

wäre dann im normalen FB

Code:
L DIW 52

und im Multi-FB Offset + 52, also z.B

Code:
L DIW 552
 
erstmal Danke Thomas



Bedeutet Ausmaskieren in diesem Fall das ich die "reine" Adresse separiere und das DI aus dem Register "lösche"?



Im FB benutze ich 16 Bits zur kommunikation mit einem FU, diese übertrage ich durch das verschieben des DIW.



OK - dann müsste das doch schon der richtige Befehl sein oder?

Code:
L DIW [AR2,P#52.0]


... du hasts kapiert!
Es sprechen trotzdem manche Dinge dafür, AR2 nicht direkt zu verwenden.

Wenn z.B.
- dein Baustein in der Entwicklung ist, oder (später) erweitert werden soll, dann kann sich ganz schnell DIW52 in DIW 60 ändern (durch einfügen von Parametern, statischen Variablen) - hier würde ich immer über AR1 gehen (symbolisch) + AR2
- indirekte Zugriffe auf Instanzdaten in Multiinstanzen berechnet werden müssen

Im übrigen hab ich keine Ahnung, wozu die Ausmaskiererei gut sein soll.
Wird meiner Meinung nach nicht benötigt.

Kann mal jemand ein Beispiel nennen wo das benötigt wird???

Micha
 
Im übrigen hab ich keine Ahnung, wozu die Ausmaskiererei gut sein soll.
Wird meiner Meinung nach nicht benötigt.

Kann mal jemand ein Beispiel nennen wo das benötigt wird???

Die Befehle +AR1 und +AR2 ohne Operand machen die Ausmaskiererei quasi intern, indem die Bits der Bereichskennung bei der Addition nicht bearbeitet werden.

Wenn man die Zeiger anders verarbeiten möchte muss man das eben selber ausmaskieren.
 
Zurück
Oben