Lokalvariablen in Multiinstanzen

Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      TAR2                              // Anfangsadresse der aktuellen Instanz
      UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
      [COLOR="#FF0000"]L     P##INSTANZVAR[/COLOR]
      +D                                // Addiere Offset und Variablenadresse
      LAR1
jedoch bekomme ich nun einen Systemfehler
Hast Du die rote Zeile vergessen?

Harald
 
Probier es mit dieser code

Code:
TAR2                              // Anfangsadresse der aktuellen Instanz
      UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
      [COLOR=#ff0000]L     P##INSTANZVAR  // Name Ihre ANY[/COLOR]
      +D                                // Addiere Offset und Variablenadresse
      LAR1

Edit Harald war sneller.

Joop
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nein ich hatte die rote zeile davor ich

ich habe alle LAR1 in meinem Funktionsbaustein durch

Code:
  TAR2                              // Anfangsadresse der aktuellen Instanz
      UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
      +D                                // Addiere Offset und Variablenadresse
      LAR1

ersetzt

auch die, die gar nichts mit den lokal Variablen zu tun hatten. I

ch habe nun nur die LAR1 umgeschrieben, die mit Eingängen arbeiten. Also den Pointern, die auf die übergebenden ANY Pointer zeigen. Damit funktioniert es soweit :p
 
Nochmal ganz ausführlich:

Du hast jedes dieses:
Code:
      L     P##INSTANZVAR
      LAR1
ersetzt durch:
Code:
      L     P##INSTANZVAR
      TAR2
      UD    DW#16#FFFFFF
      +D
      LAR1
Dann ist es korrekt, funktioniert und darf keinen "Systemfehler" verursachen.

Beachte: bei Zugriffen auf die Adresse von TEMP-Variablen darf das AR2 nicht addiert werden. Nur beim Zugriff auf die Adressen von Instanz-Variablen (IN/OUT/IN_OUT/STAT) muß AR2 addiert werden.

Harald
 
genau so hab ich es gemacht

Ich habe mittendrin noch indirekte Adressierung zum Beispiel:

Code:
   AUF   #DB_NUMMER
      L     P#211.0                     
      L     #LEN_COMMUNITY
      SLD   3
      +D    
      LAR1  
      L     B#16#A0                     //A0 := Get Request Befehl
      T     DBB [AR1,P#0.0]
      L     #LEN_PDU                    //PDU Länge
      T     DBB [AR1,P#1.0]
      L     B#16#2                      //Datentyp 2 := Integer
      T     DBB [AR1,P#2.0]

Hierbei greift das Programm auf einen globalen DB zu und nicht auf den InstanzDB. Diese LAR1 hatte ich zuvor auch verändert. Das ,denke ich, den Fehler verursacht hat. Liege ich richtig das dadurch Adressen entstanden sind die gar nicht existieren und somit der systemfehler zustande kommt?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, durch das Addieren des AR2 greifst Du auf höhere Adressen als gewollt im globalen DB #DB_NUMMER zu, welche wahrscheinlich gar nicht existieren (DB nicht groß genug!).
Wie gesagt: AR2 nur bei Zugriffen auf Adressen der eigenen Instanzvariablen addieren.

Harald
 
Hallo zusammen.
Bitte für mich nochmal zum Mitschreiben:
Grisu88, du hast einen FB, der einen INParameter besitzt.
Dieser FB wird in einem Vater FB als Multiinstanz mehrfach aufgerufen.
Die Instanzen sitzen in der STAT Sektion des Vaters.
Über den Pointer wird ein ANY Pointer addressiert und dem Sohn FB übergeben.
Meine Frage lautet nun:
Wo genau liegen die ANY Pointer und wie übergibst du den Pointer beim Aufruf der Multiinstanz?
Danke für eine Antwort.
mfg
Linus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also:
ich habe FB unteranderem ANY Pointer als Eingang bekommen. Im Instanzdatenbaustein dieses FB wird dann ein Speicherplatz von 10 Bytes zur Verfügung gestellt (ANY Pointer benötigen 10 Bytes). Wenn nun der Eingang einen ANY Pointer bekommt werden an dieser Stelle die Daten abgelegt.
Zum Beispiel soll ein Datenbereich von 10 Bytes im globalen DB 500 über den Eingang "Datenablage" übergeben werden.
Code:
      CALL  FB 1 , DB400
       DATENABLAGE     :=P#DB500.DBX0.0 BYTE 10
Lädt man nun im FB 1 den Eingang "DATENABLAGE", wird nicht der übergebende ANY Pointer geladen. Stattdessen wird ein Pointer der auf das erste Bit des ANY-Pointers, welcher im Instanzdatenbaustein gespeichert ist, geladen. Damit im FB 1 der eigenltiche ANY Pointer wieder verwendet werden kann, habe ich den ANY Pointer im Temp Bereich wieder gebildet:
Code:
      L     P##DATENABLAGE
      [COLOR=#ff0000]TAR2                              // Anfangsadresse der aktuellen Instanz
      UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
      +D                                // Addiere Offset und Variablenadresse[/COLOR]
    [COLOR=#0000ff]  LAR1  [/COLOR]
      L     D [AR1,P#0.0]               //übergebender Pointer wird in einen ANY Zeiger gewandelt
      T     LD     0
      L     D [AR1,P#4.0]
      T     LD     4
      L     W [AR1,P#8.0]
      T     LW     8
Die ersten 10 Bytes des lokalen Temp Bereichs sind nun der übergebende ANY-Pointer. Das Problem war nun der Einsatz von Multiinstanzen. Dieser FB 1 soll sehr oft aufgerufen werden. Das bedeutet das jedes mal ein Instanzdatenbaustein benötigt wird. Damit die Anzahl der Instanzdatenbausteine gering gehalten wird, werden alle "FB 1" in einem FB 2 aufgerufen und die Instanzdatenbausteine von FB 1 als Multiinstanzen im Instanzdatenbaustein von FB 2 gelegt.
Das Problem ist LAR1 (Blaue Markierung), in den Multiinstanzen spielt das Adressregister 2 eine wesentliche Rolle. So ist je nach position der Multiinstanz im Instanzdatenbaustein von FB 2 das Adressregister 2 verschieden. Somit muss jede Adressierung die sich in einer Multiinstanz abspielt in Bezug auf das Adressregister 2 stattfinden. Das erledigt der rot markierte Programmteil.

Bitte verbessert mich wenn ich jetzt irgendwas falsches gesagt habe :p
 
Zurück
Oben