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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: ANY-Pointer Indirekt Adressieren

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    habe folgendes Anliegen:

    in einem FB (FB100) verwende ich die SFB14 (PUT) und SFB15 (GET). Da ich mit mehreren Steuerungen kommunizieren muss, will ich den FB100 als Multi_FB mehrmals aufrufen.
    Wie kann ich jetzt die Pointer für die PUT-/GET-Bausteine als Eingangsvariablen an FB100 anparametrieren?
    Pointer
    SRC:=>P#DB80.DBX14.0 BYTE 10
    DST:=P#DB100.DBX0.0 BYTE 10
    möchte ich durch lokale Variablen ersetzen, damit ich den FB100 unverändert mehrmals verwenden kann?

    Bedanke mich im Voraus..
    Zitieren Zitieren ANY-Pointer Indirekt Adressieren  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Benutze mal google mit der Suche "ANY an FB übergeben" - da findest Du viele komplett ausprogrammierte Beispiele

    Kurzfassung:
    übergib SRC und DST als IN-Parameter (Typ: ANY) an den FB100
    im FB100 kopierst Du die IN-Parameter auf TEMP-ANY (mit Hilfe von AR1 und AR2)
    die TEMP-ANY kannst Du dann an PUT/GET schreiben/übergeben

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Nachtrag:
    Die ursprünglichen ANY dürfen allerdings nicht auf Speicher im L-Bereich (TEMP) zeigen - das Weiterreichen der ANY also am Besten nur mit Speicher in DB benutzen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Standard

    Morgen Heini,
    schau dir diesen Beitrag mal an hat mir érst gestern geholfen.

    http://www.sps-forum.de/simatic/6360...ittstelle.html

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

    Standard

    Hätte zu diesem Theme auch noch eine Frage. Ich habe den Any über die TEMPvariable auf die INvariable gelegt. Jeweils für Senden und Empfangen. Das funktioniert auch so.
    Am IN des FB wird dann z.B der Wert P#DB100.DBX0.0 BYTE 100 für den Empfangsbereich und P#DB100.DBX100.0 BYTE 100 für den Sendebereich angegeben.

    Jetzt möchte ich im FB in die ANY TEMPvariable ein INT am anfang reinschreiben also die ersten 2 Byte. Die restlichen Bytes werden durch den DB ja belegt.

    Was ich machen will ist egal welchen DB und welche länge man am FB eingibt das immer die ersten zwei Bytes für den Watchdog vorbelegt sind. Somit muss der Anwender sich nicht mehr um die Überwachung kümmern.

    Hab schon das Thema ANY Aufbau im Forum gefunden aber ich bekomme einfach keinen Anfang.

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    @Petri:
    Es tut mir leid, aber was du da machen willst habe ich nicht verstanden. Erklär mal an einem Beispiel (also was steht in dem ANY wann drin) .

    Gruß
    Larry

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

    Standard

    Hallo Larry,
    hab den Baustein als Bild angehängt.
    http://img18.myimg.de/VMwaree3b99.png

    Wie du siehst führe ich meinen Watchdog (RemoteCounter & MyCounter) momentan noch nach außen an den FB und übergebe ihn dann an den DB.
    Ich möchte mir aber diesen Schritt sparen.
    Wenn jetzt der Anwender an dem IN "SendData" seinen DB100DBX.0.0 BYTE 100 angibt möchte ich einfach im FB auf die ersten zwei BYTE's den MyCounter draufschreiben. und mit dem RecvData das gleiche.

    Somit muss sich der Anwender nicht mehr um die Beschaltung des Watchdog kümmern den er liegt immer auf den ersten zwei Bytes.

    Hoffe man versteht es
    Geändert von Petri.f (24.09.2013 um 13:12 Uhr)

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    ... ich glaube ich habe es verstanden ...
    Und nein ... das geht so nicht.
    Der ANY-Pointer zeigt ja auf einen Datenbereich und ist nicht der Datenbereich selber. Was du also nur machen kannst ist, dir eine lokale Kopie deines Datenblocks anzulegen (also der echten Quelldaten), diese dann um die gewünschten weiteren Daten zu erweitern und die erweiterten Daten dann weiterzuschicken (also darauf dann einen neuen ANY zeigen lassen).

    Gruß
    Larry

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    @Petri:
    Wenn ich es richtig verstanden habe, dann ist das, was Du vorhast, eine höchst unsaubere Programmierung.
    Falls die PUT/GET-Speicherbereiche bei jeder FB-Instanz immer gleich groß sein sollten, dann könntest Du diese Speicherbereiche als STRUCT an den FB übergeben und so sauber auf Variablen in den Speicherbereichen zugreifen.

    PS: Dein Baustein-Bild kann leider nicht geöffnet werden - Zugriff verboten.
    Hänge das Bild einfach an den Beitrag an - das Klammersymbol im erweiterten Beitragseditor oder da der Button "Anhänge verwalten".

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten morgen,
    hab nochmals das Bild des Bausteins angehangen. KOP_AWL_FUP - [OB1 -- _CYCL_EXC_ -- CP343-1 COM_Projekt1_SIMATIC 300(1)_CPU 315-000003.png KOP_AWL_FUP - [FB680 -- _FB_AG_SEND_AG_RECV_ -- CP343-1 COM_Projekt1_SIMATIC 30-000005.jpg KOP_AWL_FUP - [FB680 -- _FB_AG_SEND_AG_RECV_ -- CP343-1 COM_Projekt1_SIMATIC 30-000004.jpg



    Ich benutze die AG_SEND & AG_RECV Bausteine und leite die Send und Recv Daten an den IN/OUT des Bausteins. Dies mach ich mit dem unteren Code.
    Damit ich jetzt nicht immer die Watchdog Daten aus dem Baustein an den DB übergeben muss, dachte ich mir das ich dies einfach direkt im Baustein machen könnte. Da der DB Bereich sowieso am IN/OUT des Bausteins als ANY angegeben ist.




    Code:
    ANY-Parameter von IN/IN_OUT in TEMP umkopieren in Multiinstanz-FB:
     
    
    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
    Gruß

Ähnliche Themen

  1. String indirekt adressieren
    Von The Dude im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.06.2011, 12:21
  2. Pointer indirekt zu adressieren
    Von Erich04 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 26.05.2011, 07:54
  3. Antworten: 12
    Letzter Beitrag: 20.11.2009, 13:06
  4. DB-Pointer indirekt Adressieren
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.03.2004, 16:59
  5. ANY-Pointer indirekt adressieren
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.02.2004, 15:41

Lesezeichen

Berechtigungen

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