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

Ergebnis 1 bis 7 von 7

Thema: Pointer an FB übergeben, aber wie?

  1. #1
    Registriert seit
    17.03.2008
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe Wissenden

    Ich möchte im Rahmen meiner momentanen Programmierarbeiten aus einem FB heraus einen bestimmten Eingangsbereich abfragen. Dazu will ich die Basisadresse dieses Eingangsbereichs per Pointer an den FB übergeben.

    Ich habe in den Eingangsparamtern einen Pointer namens "Basisadresse "deklariert.
    An diesem Eingang übergebe ich z.B. P#2.0

    L #akt_Offset
    SLW 3
    LAR1
    L P##Basisadresse
    +AR1
    L EB [AR1,P#0.0]
    T #Zwischenspeicher


    Beim Befehl L P##Basisadresse lädt es immer 85000000
    Warum??
    Kann es sein, dass das ein Pointer auf den Speicherplatz des Pointers "Basisadresse" im Instanz-DB ist und wenn ja, wie schaffe ich es den eingentlichen Pointer (z.B. P#2.0 ) zu laden?


    Noch zum System:
    CPU 315-2DP
    S7 V 5.1.1 (für Programmentwurf zu Hause)
    S7 V5.4 (in der Firma)

    MFG

    Aendes
    Zitieren Zitieren Pointer an FB übergeben, aber wie?  

  2. #2
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Hallo Aendes,

    hier sind mal zwei kurze Programmbeispiele zur Übergabe von POINTERN:

    Code:
    FUNCTION_BLOCK FB 100
    TITLE =POINTER
    //DB-POINTER
    //
    //BYTE 0  Datenbausteinnummer
    //BYTE 1  Datenbausteinnummer
    //
    //BYTE 2  Bereichszeiger
    //BYTE 3  Bereichszeiger
    //BYTE 4  Bereichszeiger
    //BYTE 5  Bereichszeiger
    //   
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'POINTER'
    VERSION : 1.0
     
    VAR_INPUT
      DB_NUMMER : BLOCK_DB ;    
      DB_POINTER : POINTER ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =POINTER
     
          AUF   #DB_NUMMER; // DB öffnen 
     
          L     P##DB_POINTER; // POINTER
          LAR1  ; 
     
          L     D [AR1,P#2.0]; // POINTER Bereichszeiger
          LAR1  ; 
     
    NETWORK
    TITLE =Daten (WORD) kopieren
     
          L     W [AR1,P#0.0]; 
          T     W [AR1,P#2.0]; 
     
    END_FUNCTION_BLOCK
    Code:
    FUNCTION_BLOCK FB 120
    TITLE =DB-POINTER
    //DB-POINTER
    //
    //BYTE 0  Datenbausteinnummer
    //BYTE 1  Datenbausteinnummer
    //
    //BYTE 2  Bereichszeiger
    //BYTE 3  Bereichszeiger
    //BYTE 4  Bereichszeiger
    //BYTE 5  Bereichszeiger
    //   
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : 'POINTER'
    VERSION : 1.0
     
    VAR_INPUT
      DB_POINTER : POINTER ;    
    END_VAR
    VAR_TEMP
      DB_NUMMER : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =DB-POINTER
     
          L     P##DB_POINTER; // POINTER
          LAR1  ; 
     
          L     W [AR1,P#0.0]; // POINTER DB-Nummer
          T     #DB_NUMMER; 
     
          AUF   DB [#DB_NUMMER]; // DB öffnen
     
          L     D [AR1,P#2.0]; // POINTER Bereichszeiger
          LAR1  ; 
     
    NETWORK
    TITLE =Daten (WORD) kopieren
     
          L     W [AR1,P#0.0]; 
          T     W [AR1,P#2.0]; 
     
    END_FUNCTION_BLOCK
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  3. #3
    Aendes ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.03.2008
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das sieht ja ganz gut aus. Ich denke die 2. Variante ist etwas eleganter.
    Vielen dank für die Ausführungen!!

    MFG Aendes

  4. #4
    Registriert seit
    01.02.2008
    Beiträge
    93
    Danke
    9
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi

    So eine frage kan mir einer ein Projekt schiken ein geziptes??
    dan kan ich das direckt testen.
    Was ich erreichen will

    Ich will in einen DB was laden z.b. db1.dbd1
    und dan will ich den db1 danach auslesen das ich quasi die adresse hochzähle und so mir eine menge qode spare. ich habe die FAQ im forum gelesen aber irgentwie raller ich das nicht .

    Bitte hilfe

  5. #5
    Registriert seit
    14.10.2005
    Beiträge
    137
    Danke
    3
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Zitat Zitat von Aendes Beitrag anzeigen
    Hallo liebe Wissenden

    L #akt_Offset
    SLW 3
    LAR1
    L P##Basisadresse
    +AR1
    L EB [AR1,P#0.0]
    T #Zwischenspeicher


    Beim Befehl L P##Basisadresse lädt es immer 85000000
    Warum??
    Kann es sein, dass das ein Pointer auf den Speicherplatz des Pointers "Basisadresse" im Instanz-DB ist und wenn ja, wie schaffe ich es den eingentlichen Pointer (z.B. P#2.0 ) zu laden?

    Aendes
    Hi,

    du hast den Fehler schon erkannt. Du lädst nicht die Adresse die in #Basisadresse steht, sondern den Pointer indem die Adresse der Variable #Basisadresse steht....

    L #akt_Offset
    SLD 3
    LAR1
    L #Basisadresse
    +AR1
    L EB [AR1,P#0.0]
    T #Zwischenspeicher



    Probier es mal so...


    Torsten

    Edit: Fehler für die Nachwelt korrigiert...
    Geändert von Torsten05 (21.03.2008 um 12:07 Uhr)

  6. #6
    Aendes ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.03.2008
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das funktioniert so leider nicht. Das habe ich anfänglich auch probiert. Letztlich hilft hier nur der Code von Kai. (Ich hab's probiert und es geht).

    Interessant wäre jetzt noch wie ich einen Pointer an einen FC übergebe.
    bzw. wie ich ihn im FC verwenden kann. Hier gibt's dann ja keinen Instanz-DB mehr, den man adressieren kann.

    Muss man da dann auf einen CPU-Stapelspeicher (Stack) zugreifen, oder wie geht denn das?

  7. #7
    Registriert seit
    14.10.2005
    Beiträge
    137
    Danke
    3
    Erhielt 5 Danke für 5 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    dass das oben nicht funktioniert liegt aber nicht an den geposteten Zeilen. Da liegt noch woanders der Wurm drin. Egal...
    Edit: Pointer sind Doppelwörter. Es muss also SLD3 heissen.


    Wenn du nicht nur eine Byte-Bit-Adresse übergeben willst, kannst du mit nem ANY-Pointer arbeiten, oder aber die DB-Nr. nochmal extra als Word übergeben und dann :
    (Also In-Variable DB_Nummer, Typ word...)

    Auf DB_Nummer

    schreiben.

    Zum Any-Pointer findest du was in der Hilfe von Step7 oder ich glaube auch hier im Forum...

    Torsten
    Geändert von Torsten05 (21.03.2008 um 12:03 Uhr)

Ähnliche Themen

  1. Pointer an Funktion übergeben
    Von Anaconda55 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 01.11.2011, 19:54
  2. Adresse an Pointer übergeben
    Von schuld im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 17.11.2010, 12:42
  3. Array ohne Pointer übergeben? (SCL)
    Von tahren im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 15.06.2010, 12:08
  4. Pointer an FB übergeben
    Von xhasx im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 26.07.2007, 22:40
  5. Pointer einem parametrieren FC übergeben
    Von S7_Mich im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.10.2004, 15:03

Lesezeichen

Berechtigungen

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