IN:Pointer in Multiinstanz

mrdoc

Active member
Beiträge
33
Punkte Reaktionen
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo erstmal,

kurze Beschreibung meines Vorhabens:
Ich habe einen FB den ich in einem anderen FB aufrufen möchte und zwar als Multiinstanz.

Problem ist das der FB der als Multiinstanz aufgerufen wird nicht mehr richtig funkioniert.
Sobald ich ihn aber normal mit eigenem Instanz-DB aufrufe geht wieder alles.

Mittlerweile habe ich herausgefunden dass es an folgenden Zeilen liegt:
Code:
L     P##Host_Exchange
      LAR1  
      L     B [AR1,P#2.0]

#Host_Exchange ist ebenfalls ein DB der als Pointer an den FB übergeben wird.

Wenn ich den FB mit eigenem IDB aufrufe kommt am Ende der Zeilen wie erwartet der Datentyp 84 also DB raus.
Wenn ich ihn nun aber als Multiinstanz aufrufen aber nach wie vor exakt den selben Pointer übergebe kommt irgendein quatsch raus (nichts im Bereich der Datentypen).


Ich hoffe jemand kann mir da die Augen öffnen.

P.S.: Falls mit jemand nicht glaubt ich kann auch gerne besagtes Programm anhängen ;)

MfG
Robin
 
Zuletzt bearbeitet:
OP
M

mrdoc

Active member
Beiträge
33
Punkte Reaktionen
1
Ok jetzt habe ich doch noch was in den tiefen des Siemens Supports gefunden:

Code:
      TAR2  
      L     P##Host_Exchange
      UD    DW#16#FFFFFF
      +D    
      LAR1

Dadurch wird der Datentyp (84) auch wunderbar ausgelesen (yeah!).
Leider hackt es nun wenige Zeilen weiter nämlich beim auslesen der DB-Nummer.

Code:
L     W [AR1,P#0.0]               // 'Host_Exchange' DataBlock
      T     #AuxDb

Dort wird nun der Wert 24833 ausgelesen...
...statt 1 wie ich erwartet hätte.
 

M-Ott

Well-known member
Beiträge
1.773
Punkte Reaktionen
374
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei indirekter Adressierung in Multiinstanzen musst Du zwingend das AR2 zum AR1 addieren, da das AR2 den Offset des Beginns des Speicherbereich des FB im übergeordneten IDB angibt.
 

Freki

Active member
Beiträge
29
Punkte Reaktionen
0
Soweit ich das sehe wird doch das AR2 zu AR1 addiert. Zumindest bei seiner zweiten Antwort.
Andere Frage an Mr. Doc: Wann arbeitest du eigentlich?????
 

SPSKILLER

Well-known member
Beiträge
728
Punkte Reaktionen
159
Ok jetzt habe ich doch noch was in den tiefen des Siemens Supports gefunden:

Code:
      TAR2  
      L     P##Host_Exchange
      UD    DW#16#FFFFFF
      +D    
      LAR1

Dadurch wird der Datentyp (84) auch wunderbar ausgelesen (yeah!).
Leider hackt es nun wenige Zeilen weiter nämlich beim auslesen der DB-Nummer.

Code:
L     W [AR1,P#0.0]               // 'Host_Exchange' DataBlock
      T     #AuxDb

Dort wird nun der Wert 24833 ausgelesen...
...statt 1 wie ich erwartet hätte.

Schau mal in der AWL Ansicht online, ob sich AR1 oder DB1/2 zwischen den Ladeoperationen ändern.
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2022
Power-User
Beiträge
19.943
Punkte Reaktionen
6.032
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok jetzt habe ich doch noch was in den tiefen des Siemens Supports gefunden:

Code:
      TAR2  
      L     P##Host_Exchange
      UD    DW#16#FFFFFF
      +D    
      LAR1

Dadurch wird der Datentyp (84) auch wunderbar ausgelesen (yeah!).
Das ist leider nicht ganz richtig. :sad:
Der offizielle Siemens Support und die Step7-Hilfe sagen, daß beim Addieren des Multiinstanz-Offset aus dem AR2 die Bereichskennung aus AR2 ausgeblendet werden muß und NICHT aus der Parameteradresse P##inparameter - dann stimmt auch die errechnete Adresse mit der Bereichskennung 16#85 = DI !

Zugriff auf eine Multiinstanz
Code:
      TAR2                      // Lade Adressregister in den AKKU 1 (Offset)
      UD    DW#16#FFFFFF        // Ausblenden der Bereichskennung
      L     P##variable         // Lade Adresse der Variablen
      +D                        // Addiere Offset und Variablenadresse
      LAR1                      // Speichere das Ergebnis im Adressregister AR1
So herum ist sichergestellt, daß AR1 eine Adresse erhält, die sich auf den Instanz-DB bezieht (Bereichskennung 16#85).
Eine nachfolgende bereichsübergreifende registerindirekte Operation L W [AR1,P#0.0] greift dann auf den IDB zu.

Beachte:
Das AR2 enthält eine Adresse mit der Bereichskennung 16#84 = DB
P##inparameter ist eine Adresse mit der Bereichskennung 16#85 = DI

Die Übergabeparameter liegen im Instanz-DB, also sollte ein registerindirekter Zugriff über das DI-Register adressieren oder das DB-Register muß die Nummer des IDB enthalten.
Ganz sicher geht man mit einem bereichsinternen registerindirekten Zugriff (der Inhalt des DB-Registers in dann beliebig): L DIW [AR1,P#0.0]


So wird Dein Code funktionieren:
Code:
      LAR1  P##Host_Exchange    // Lade Adresse des Parameters in dieser Instanz 85... (DI)
      TAR2                      // Lade den Offset dieser Instanz im IDB aus dem AR2 in den AKKU1
      +AR1                      // Addiere Variablenadresse und Offset --> 85... (DI)

//bereichsübergreifend registerindirekt - AR1 muß eine DI-Adresse 85... enthalten!
      L     W [AR1,P#0.0]       // 'Host_Exchange' DataBlock
      T     #AuxDb

//bereichsintern registerindirekt - die Bereichskennung in AR1 wird ignoriert, es wird DI verwendet
      L     DIW [AR1,P#0.0]     // 'Host_Exchange' DataBlock
      T     #AuxDb

siehe auch: Bei welchen Operationen überschreibt STEP 7 den Akku-Inhalt bzw. den Inhalt von Registern?

Harald
 
OP
M

mrdoc

Active member
Beiträge
33
Punkte Reaktionen
1
Vielen Dank für die Lösungsvorschläge bin leider erst jetzt zum Antworten gekommen.

Mit der Methode von PN/DP funktioniert alles so wie es soll und was noch viel wichtiger ist... ich verstehe sogar warum ;)

Andere Frage an Mr. Doc: Wann arbeitest du eigentlich?????

Bin aus der Nachtschicht gekommen und mit so einem Problem kann ich nicht einschlafen.
 
Oben