Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Pointer auf statische Variablen mehrerer Instanzen in einem Multi-FB

  1. #1
    Registriert seit
    17.02.2006
    Beiträge
    39
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Pointer auf statische Variablen mehrerer Instanzen in einem Multi-FB  

  2. #2
    Registriert seit
    13.10.2007
    Beiträge
    12.063
    Danke
    2.793
    Erhielt 3.288 Danke für 2.168 Beiträge

    Standard

    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;
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  3. #3
    SIsepp ist offline Benutzer
    Themenstarter
    Registriert seit
    17.02.2006
    Beiträge
    39
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  4. #4
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.752
    Danke
    323
    Erhielt 1.526 Danke für 1.286 Beiträge

    Standard

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

    Code:
    L     P##err
    TAR2
    +D
          LAR1  
          L     W [AR1,P#0.0]
          L     0
          <>I   
          =     #state.error
    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  5. #5
    SIsepp ist offline Benutzer
    Themenstarter
    Registriert seit
    17.02.2006
    Beiträge
    39
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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  
    
          L     W [AR1,P#0.0]
          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

  6. #6
    Registriert seit
    13.10.2007
    Beiträge
    12.063
    Danke
    2.793
    Erhielt 3.288 Danke für 2.168 Beiträge

    Standard

    Kommentier doch mal die Zeile mit den ladebefehl aus
    und schau dir mal online deine adressregister an
    und die DB Register
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  7. #7
    SIsepp ist offline Benutzer
    Themenstarter
    Registriert seit
    17.02.2006
    Beiträge
    39
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ich habe mal alle so gelassen, den OB121 geladen

    und ein Bild gemacht
    Angehängte Grafiken Angehängte Grafiken

  8. #8
    Registriert seit
    13.10.2007
    Beiträge
    12.063
    Danke
    2.793
    Erhielt 3.288 Danke für 2.168 Beiträge

    Standard

    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?
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    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

  10. #10
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    wenn ich abschmieren lese muß ich zwangsläufig an Diagnosepuffer denken!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

Ähnliche Themen

  1. statische Variablen...
    Von snowleopard1702 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 08.05.2011, 11:47
  2. Antworten: 6
    Letzter Beitrag: 11.03.2010, 07:50
  3. Multi-Instanzen
    Von JOKER83 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 11.06.2009, 19:08
  4. Statische Variablen in FB´s
    Von Gerri im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 26.06.2008, 14:34
  5. Statische Variablen
    Von Sh4gr4th im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 09.12.2005, 14:45

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •