IN:Pointer in Multiinstanz

mrdoc

Level-1
Beiträge
33
Reaktionspunkte
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:
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.
 
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.
 
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?????
 
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.
 
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
 
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.
 
Zurück
Oben