Pointer auf statische Variablen mehrerer Instanzen in einem Multi-FB

SIsepp

Level-2
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
moin,

hab da mal eine Frage.

ich habe einen Multi-FB mit mehreren Instanz (FBs) angelegt.

jetzt habe ich in einer Instanz folgenden Code hinterlegt:

U #err.meld[1]
O #err.meld[2]
O #err.meld[3]
O #err.meld[4]
O #err.meld[5]
O #err.meld[6]
O #err.meld[7]
O #err.meld[8]
O #err.meld[9]
O #err.meld[10]
O #err.meld[11]
O #err.meld[12]
O #err.meld[13]
O #err.meld[14]
O #err.meld[15]
O #err.meld[16]
= #state.error


"err" ist ein Datentyp eines UDTs mit einem ARRAY[1..16] of BOOL

wenn ich jetzt einen 2. Instanz aufrufen funktioniert alles ohne Probleme.

um Tipparbeit zu sparen habe ich gedacht, legste dir mal einen Pointer an....

das sah dann so aus:

L P##err
LAR1
L W [AR1,P#0.0]
L 0
<>I
= #state.error

hat mit der ersten Instanz auch funktioniert aber leider nicht mit der 2. Instanz.

ich muss noch dazusagen das der Offset zwischen zwei gleiche Instanzaufrufen innerhalb des FBs variieren kann!

gibt es keine Möglichkeit symbolisch auf meinen Datentyp "err" zuzugreifen?

z.B. L #err

grüße & danke
SiSEPP
 
bei der Multiinstanz muß du aufpassen und zum Pointer das AR2 addieren

Code:
NETWORK
TITLE =Adressregister retten
      TAR1  #dTempAR1; 
      TAR2  #dTempAR2; 
NETWORK
TITLE =Zeiger umladen
//Pointer-Zeiger umladen
      TAR2  ; //AR2 in Akku
      UD    DW#16#FFFFFF; //Bereichscodierung ausblenden
      L     P##pZeiger_XY; //Stardadresse
      +D    ; 
      LAR1  ; 
//DB-Nr Temp. zwischenspeichern
      L     W [AR1,P#0.0]; 
      T     #wTempDB_Nr; 
//Adresse Temp. zwischenspeichern
      L     D [AR1,P#2.0]; 
      T     #dTempAdresse; 
NETWORK
TITLE =Datenbaustein aufschlagen und Adressrgister stellen
//Global, AR1 stellen 
      AUF   DB [#wTempDB_Nr]; 
      LAR1  #dTempAdresse; 
NETWORK
TITLE =Beispiel
      U     DBX [AR1,P#0.0]; 
      =     #xtest; 
NETWORK
TITLE =Adressregister wieder herstellen
      LAR1  #dTempAR1; 
      LAR2  #dTempAR2;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Helmut,

habe mal deinen Code verwendet.

leider schmiert die CPU an der stelle " L DBW [AR1,P#0.0]" ab.

wenn ich die Zeile auskommentiere und den Wert innerhalb des Zeigers "#err" >0 mache ebenfalls.

Code:
      TAR1  #dTempAR1
      TAR2  #dTempAR2

      TAR2  
      UD    DW#16#FFFFFF
      L     P##err
      +D    
      LAR1  

      L     W [AR1,P#0.0]
      T     #wTempDB_Nr

      L     D [AR1,P#2.0]
      T     #dTempAdresse

      AUF   DB [#wTempDB_Nr]
      LAR1  #dTempAdresse

      L     DBW [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error


      LAR1  #dTempAR1
      LAR2  #dTempAR2
 
Du musst bei deinen obigen Pointer den Inhalt des AR2 (in diesem steht der Offset im IDB dazuaddieren.

Code:
L     P##err
[COLOR=Red]TAR2
+D[/COLOR]
      LAR1  
      L     W [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error

Mfg
Manuel
 
hallo Manuel,

habe deinen Vorschlag mal ausprobiert.

die CPU schmiert aber bei der rot markierten Zeile ab.

Code:
      TAR1  #dTempAR1
      TAR2  #dTempAR2

      TAR2  
      UD    DW#16#FFFFFF
      L     P##err
      TAR2  
      +D    
      LAR1  

     [COLOR="red"] L     W [AR1,P#0.0][/COLOR]
      T     #wTempDB_Nr

      L     D [AR1,P#2.0] 
      T     #dTempAdresse

      AUF   DB [#wTempDB_Nr]
      LAR1  #dTempAdresse


      L     W [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error


      LAR1  #dTempAR1
      LAR2  #dTempAR2
 
ich habe mal alle so gelassen, den OB121 geladen

und ein Bild gemacht
 

Anhänge

  • pppp.jpg
    pppp.jpg
    118,9 KB · Aufrufe: 35
Code:
TAR2  ; //AR2 in Akku
      UD    DW#16#FFFFFF; //Bereichscodierung ausblenden
      L     P##pZeiger_XY; //Stardadresse
      +D    ; 
      LAR1  ;

An dieser Stelle hast du doch schon die richtige
Pointeradresse, wie übergibst du ihn an den
Baustein?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
so richtig verstehe ich das nicht ...
Rufst du den selben FB in einer anderen Instanz nocheinmal wieder auf ?
Also einmal "call FB1,DB1" und dann "call FB1,DB2" ?
Vielleicht um da mal sinnvoll weiter zu kommen ... poste doch mal deinen FB und ggf. auch den Aufruf davon. Was wird eigentlich übergeben ?

Gruß
Larry
 
habe mal das Projekt hochgeladen.

im FB1000 rufe ich den FB10 mehrmals auf
 

Anhänge

  • Phoenix.zip
    364,4 KB · Aufrufe: 9
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne das Projekt einzusehen, ist das Multiinstanz. Aber
der zweite TAR2 von manuell muss da wieder raus.
Das mit den Pointer ausslesen funktioniert als Multi-
Instanz, ist getestet.
Schau dir doch mal an was in den Temponären Speicher
steht, wenn die zweite TAR Anweisung entfernt wurde.

Schau dir auch mal an ob deine instanz auch noch
aktuell ist (IDB) und ob auch alles in die Steuerung
geladen ist.
 
Code:
      TAR2  
      UD    DW#16#FFFFFF
      LAR1  
      L     P##err
      +AR1  

      L     DIW [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error

Gruss Daniel
 
Code:
      TAR2  
      UD    DW#16#FFFFFF
      L     P##err
      +D    
      LAR1  

      L     DIW [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error

oder so. ;)

Gruss Daniel
 
moin,

es funktioniert! :ROFLMAO:

tausend dank an alle!! :sm24:


Code:
      TAR1  #dTempAR1
      TAR2  #dTempAR2

      TAR2  
      UD    DW#16#FFFFFF
      L     P##err
      +D    
      LAR1  

      L     W [AR1,P#0.0]
      T     #wTempDB_Nr

      L     D [AR1,P#2.0]
      T     #dTempAdresse

      AUF   DB [#wTempDB_Nr]
      LAR1  #dTempAdresse


      L     DIW [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error


      LAR1  #dTempAR1
      LAR2  #dTempAR2
 
Code:
      TAR1  #dTempAR1
      TAR2  #dTempAR2
 
      TAR2  
      UD    DW#16#FFFFFF
      L     P##err
      +D    
      LAR1  
 
      [COLOR=orange]L     W [AR1,P#0.0][/COLOR]
[COLOR=orange]    T     #wTempDB_Nr[/COLOR]
 
[COLOR=orange]    L     D [AR1,P#2.0][/COLOR]
[COLOR=orange]    T     #dTempAdresse[/COLOR]
 
[COLOR=orange]    AUF   DB [#wTempDB_Nr][/COLOR]
[COLOR=orange]    LAR1  #dTempAdresse[/COLOR]
 
 
      L     DIW [AR1,P#0.0]
      L     0
      <>I   
      =     #state.error
 
 
      LAR1  #dTempAR1
      LAR2  #dTempAR2

Hallo sepp,
die orangen Anweisungen kannst du weg lassen, die sind aus meinen
Beispiel, das war dafür gedacht wenn du den Zeiger von außen an
als DB Zeiger an den Baustein heranführst. Wenn du auf Lokaldaten
des eigenen FB zugreifst, kannst du die über das Adressregister auf
die eigenen Instanzsdaten zugreifen. Wenn du dir mal die Variabeln
#wTempDB_Nr, #dTempAdresse anschaust, wirst du sehen das da
auch nichts drinsteht. Der Vorteil oder auch Nachteil des DB-Zeiger
liegt darin das du die Zeiger noch mehr manipulieren kannst.
Z.b. Daten von der Instanz in einen Globaldatenbaustein kopieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
moin Helmut,

jetzt läuft die Sache wie geschmiert!!!

"Daten von der Instanz in einen Globaldatenbaustein kopieren, ist das nächste was ich in Angriff nehmen werden!"

... darum war dein Beispiel, genau das was ich brauchte!!!

nochmal danke, danke, danke!

schönes Wochenende

grüße SiSEPP
 
Zurück
Oben