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

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

Thema: Any-Pointer über Bausteinschnittstelle

  1. #1
    Registriert seit
    06.05.2004
    Beiträge
    51
    Danke
    20
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen

    Ich bin dabei eine Kommunikation von CPU zu CPU über die PN Schnittstelle zu realisieren. Das Senden und Empfangen werden über die Bausteine Put und Get gelösst. Die losgelöste Funktion von Schrieben und Empfangen funktioniert tadellos, nun bin ich dabei die Funktion in Bausteine als Multiinstanz zu packen, dabei ist folgendes Problem entstanden:

    Die Funktion Put und Get benötigen je 2 ANY Pointer für die Variabeln ADDR_1 und RD_1, nun möchte ich diese Variabeln in der Multiinstanz als IN resp. als IN_OUT Variabel gestalten. Bsp. IN_OUT Variabel E_Pointer_Send als ANY und IN_OUT Variabel E_Pointer_Recive als ANY. Danach wollte ich die IN_Out Variablen dem Baustein PUT zuweisen mit #E_Pointer_Send, dies funktioniert nicht.

    Wie bringe ich die ANY Variabeln auf die Schnittstelle der Multiinstanz?

    Im Anhnag ein Bild, besten Dank für Eure mithilfe.

    Grüsse Mathias

    PUTGET.JPG
    Zitieren Zitieren Any-Pointer über Bausteinschnittstelle  

  2. #2
    Registriert seit
    03.09.2009
    Beiträge
    129
    Danke
    15
    Erhielt 19 Danke für 19 Beiträge

    Standard

    Das "durchschleifen" von Variablen vom Typ ANY funktioniert nicht. Du musst zunächst eine Kopie deines ANY als temporäre Variable abspeichern. Diese kannst du dann in deinem FB verwenden.

    Immer wieder hilfreich ist hier der folgende Thread:
    http://www.sps-forum.de/faq/12923-an...atentypen.html

  3. Folgender Benutzer sagt Danke zu Beckx-net für den nützlichen Beitrag:

    de vliegende hollander (19.02.2014)

  4. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard

    ANY-Parameter können nicht von IN/IN_OUT/OUT zu Bausteinaufrufen durchgereicht werden. Sie müssen vorher in TEMP umkopiert werden. Diese Parameter-Kopien in TEMP können dann an den Bausteinaufruf geschrieben werden.

    (Glücklicherweise ist es bei ANY in AWL auch nicht möglich, von außen direkt in die Instanz zuzugreifen, was bei einfachen Datentypen allerdings möglich wäre ala "L #PLC1.S_PLC_GET.STATUS")

    Achtung:
    Der Speicherbereich, der per ANY "durchgereicht" wird, muß ein globaler Speicherbereich sein (wie z.B. P#DB10.DBX20.0 BYTE 30). Er darf nicht in TEMP liegen, das funktioniert nicht weil TEMP nur Baustein-relativ adressierbar ist.

    ANY-Parameter von IN/IN_OUT in TEMP umkopieren in Multiinstanz-FB:
    Code:
    //Multiinstanz! AR2 Adressregister sichern
          TAR2  #tmp_DW_AR2_Save
    
    //*** E_Any_farAdr kopieren *************************
    //Pointer auf IN_OUT-Parameter E_Any_farAdr erstellen
          LAR1  P##E_Any_farAdr             // relative Adresse #E_Any_farAdr in dieser Instanz (DI)
          TAR2                              // Offset dieser Multiinstanz (DB)
          +AR1                              // AR1: absolute Adresse #E_Any_farAdr im IDB (DI)
    
    //Pointer auf TEMP-Variable tmp_Any_farAdr erstellen
          LAR2  P##tmp_Any_farAdr           // AR2: Adresse des TEMP-ANY
    
    //ANY IN_OUT.E_Any_farAdr nach TEMP.tmp_Any_farAdr kopieren
          L     D [AR1,P#0.0]               // (S7-ID + Datentyp + Wiederholfaktor)
          T     D [AR2,P#0.0]
          L     W [AR1,P#4.0]               // (DB_Nr)
          T     W [AR2,P#4.0]
          L     D [AR1,P#6.0]               // (Bereichsadresse)
          T     D [AR2,P#6.0]
    
    //*** E_Any_locAdr kopieren *************************
    //Pointer auf IN_OUT-Parameter E_Any_locAdr erstellen
          LAR1  P##E_Any_locAdr             // relative Adresse #E_Any_locAdr in dieser Instanz (DI)
          L     #tmp_DW_AR2_Save            // Offset dieser Multiinstanz (DB)
          +AR1                              // AR1: absolute Adresse #E_Any_locAdr im IDB (DI)
    
    //Pointer auf TEMP-Variable tmp_Any_locAdr erstellen
          LAR2  P##tmp_Any_locAdr           // AR2: Adresse des TEMP-ANY
    
    //ANY IN_OUT.E_Any_locAdr nach TEMP.tmp_Any_locAdr kopieren
    //ALTERNATIVE Codevariante für besser verstehbar
          L     DID [AR1,P#0.0]             // (S7-ID + Datentyp + Wiederholfaktor)
          T     LD [AR2,P#0.0]
          L     DIW [AR1,P#4.0]             // (DB_Nr)
          T     LW [AR2,P#4.0]
          L     DID [AR1,P#6.0]             // (Bereichsadresse)
          T     LD [AR2,P#6.0]
    
    //*** Ende Parameter vorbereiten ********************
    //VOR Zugriffen auf Instanzobjekte das AR2 unbedingt wiederherstellen!
          LAR2  #tmp_DW_AR2_Save            //AR2 Adressregister wiederherstellen
    
    //*** GET mit ANY-Parametern aufrufen ***************
          CALL  #S_PLC_GET
           REQ   :=...
           ID    :=...
           NDR   :=...
           ERROR :=...
           STATUS:=...
           ADDR_1:=#tmp_Any_farAdr
           RD_1  :=#tmp_Any_locAdr
    EDIT:
    Achtung! Dieses Programmbeispiel funktioniert nur bis IDB mit max Größe 4kB. Eine Korrektur siehe Beitrag #17

    Harald
    Geändert von PN/DP (19.02.2014 um 18:04 Uhr) Grund: Hinweis auf Fehlerkorrektur zugefügt
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren ANY-Parameter von IN/IN_OUT in TEMP umkopieren in Multiinstanz-FB  

  5. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    de vliegende hollander (19.02.2014),Petri.f (19.02.2014)

  6. #4
    Registriert seit
    28.07.2008
    Beiträge
    68
    Danke
    1
    Erhielt 33 Danke für 19 Beiträge

    Standard

    Hallo zusammen.
    Das Thema wird immer wieder angesprochen.
    Zuletzt im Thread:
    verschachtelte Übergabe von Variablen (Datenstrukturen)

    OK, steinigt mich, weil ich keinen korrekten Link einfügern kann....
    mfg
    Linus
    Zitieren Zitieren Informationen siehe auch dort...  

  7. Folgender Benutzer sagt Danke zu LinusAM4V für den nützlichen Beitrag:

    de vliegende hollander (19.02.2014)

  8. #5
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Unglücklich

    Guten Morgen,
    ich hab den von Harald im Post #3 geschriebenen Code in meinem Projekt benutzt.

    Der Code dient dazu in einem FB 801 einen Pointer für SendData und RecvData über die Bausteinschnittstelle zu übergeben. Dieser FB801 wird dann in einem Multiinstanz FB800 aufgerufen. Wenn ich den FB801 mit dem Code von Harald nur einmal aufrufe im FB800 dann funktioniert alles. Sobald ich aber den Baustein über 16 mal aufrufe geht die CPU in Stop.

    Wenn ich im Fenster Baugruppenzustand (Diagnosepuffer) auf die Schaltfläche Baustein öffnen klicke öffnet sich der Baustein FB801 und springt zu Harald's Code.

    Vielleicht hatte von euch schon jemand das Problem und kann mir weiterhelfen.

    Vielen dank im Voraus.


    FB800.jpgBaugruppenzustand - Stacks.pngBaugruppenzustand - Diagnosepuffer.png

    Code:
    //AR2 Adressregister sichern      TAR2  #tmp_DW_AR2_Save
    
    
    //*** SendData kopieren *************************
    //Pointer auf IN_OUT-Parameter SendData erstellen
          LAR1  P##SendData                 // relative Adresse #SendData in dieser Instanz (DI)
          TAR2                              // Offset dieser Multiinstanz (DB)
          +AR1                              // AR1: absolute Adresse #SendData im IDB (DI)
    
    
    //Pointer auf TEMP-Variable tmp_Any_SendData erstellen
          LAR2  P##tmp_Any_SendData         // AR2: Adresse des TEMP-ANY
    
    
    //ANY IN_OUT.SendData nach TEMP.tmp_Any_SendData kopieren
          L     D [AR1,P#0.0]               // (S7-ID + Datentyp + Wiederholfaktor)
          T     D [AR2,P#0.0]
          L     W [AR1,P#4.0]               // (DB_Nr)
          T     W [AR2,P#4.0]
          L     D [AR1,P#6.0]               // (Bereichsadresse)
          T     D [AR2,P#6.0]
    
    
    
    
    
    
    //*** RecvData kopieren *************************
    //Pointer auf IN_OUT-Parameter RecvData erstellen
          LAR1  P##RecvData                 // relative Adresse #RecvData in dieser Instanz (DI)
          L     #tmp_DW_AR2_Save            // Offset dieser Multiinstanz (DB)
          +AR1                              // AR1: absolute Adresse #RecvData im IDB (DI)
    
    
    //Pointer auf TEMP-Variable tmp_Any_RecvData erstellen
          LAR2  P##tmp_Any_RecvData         // AR2: Adresse des TEMP-ANY
    
    
    //ANY IN_OUT.RecvData nach TEMP.tmp_Any_RecvData kopieren
    //ALTERNATIVE Codevariante für besser verstehbar
          L     DID [AR1,P#0.0]             // (S7-ID + Datentyp + Wiederholfaktor)
          T     LD [AR2,P#0.0]
          L     DIW [AR1,P#4.0]             // (DB_Nr)
          T     LW [AR2,P#4.0]
          L     DID [AR1,P#6.0]             // (Bereichsadresse)
          T     LD [AR2,P#6.0]
    
    
    //*** Ende Parameter vorbereiten ********************
    //VOR Zugriffen auf Instanzobjekte das AR2 unbedingt wiederherstellen!
          LAR2  #tmp_DW_AR2_Save            //AR2 Adressregister wiederherstellen
    Geändert von Petri.f (19.02.2014 um 10:32 Uhr)

  9. #6
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Tja ich würde mal drauf tippen das einer der Pointer über das Ende des DBs hinauszeigt...
    Das Grauen lauert in der Zwischenablage !!

  10. #7
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke schonmal für deine Antwort dtsclipper,
    das hast du warscheinlich an dem AR1 Di erkannt da dies ein wenig zu hoch ist. Hättest du einen Lösungsvorschlag wie mann dem entgegen wirken kann.

    Vielen Dank

  11. #8
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Ähh - nein.

    Die Info habe ich aus Deinem Diagnosebild, da steht Zugriffsfehler auf Instanz-DB mit der Zugriffsadresse 61718.

    Das scheint mir zu hoch.
    Das Grauen lauert in der Zwischenablage !!

  12. #9
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe trotzdem keine Ahnung wie ich den Fehler beseitigen kann. Auch wenn der Pointer über das Ende des DBs hinauszeigt was muss ich machen damit er dies nicht mehr macht. Und wieso tritt der Fehler erst bei mehreren Bausteinaufrufe auf. Ich such zwar schon die ganze Zeit im I-Net bei Siemens usw aber ich finde dort nix.



  13. #10
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mit dem Programm kopierst Du ja Pointeradressen, also Typ, Bereich und Länge.

    Mein Verdacht tendiert dahin das irgendwo im Basisdaten-DB ein Zahlenfehler steckt.

    Eine mögliche Testreihe ist den Haupt-FB800 immer nur um einen Aufruf zu verlängern bis es nicht mehr geht und dann dan letzten Aufruf ( der es dann ja zerschossen hat ) zu kontrollieren.
    Das Grauen lauert in der Zwischenablage !!

Ähnliche Themen

  1. Ausgänge über ANY Pointer setzen
    Von Pico1184 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 02.10.2012, 11:53
  2. Speichrzugriff über Adresse aus ANY-Pointer
    Von MarkusP210 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.09.2009, 11:26
  3. Zugriff auf DB(String) über Pointer
    Von Thomas R im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.03.2007, 21:04
  4. pointer über temp struct...
    Von Jochen Kühner im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.09.2006, 10:23
  5. adressierung DB über Pointer
    Von TonyMono im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 13.06.2006, 22:24

Lesezeichen

Berechtigungen

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