Step 7 ANY Pointer im FB auf lokale Daten bauen, BSEND / SFB12 tut nicht (Fehler Code 10)

Need4Speed

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

mal wieder das leidige Thema mit einem ANY Pointer ... Ich rufe BSEND / SFB12 von meinem eigenen FB (AWL) auf, und da ist der Parameter
Code:
SD_1
ein "Zeiger auf Sendebereich."

Ich möchte meinen Sendebereich gerne als ARRAY im Instanz-DB meines FB verwalten, d.h. mein AWL Code im FB sammelt Daten zusammen, füllt dann den BYTE ARRAY im Instanz-DB des FB auf, und den möchte ich dem BSEND gerne als Sendebereich übergeben. Leider klappt es überhaupt nicht, folgendes habe ich versucht:

Code:
//ANY Pointer for DEST zusammenbauen
// #pAnyBSend ist als Instanzvariable vom Typ "ANY" deklariert


      LAR1  P##pAnyBSend
      L     B#16#10                     // ANY SyntaxID; bei S7 immer 0x10
      T     LB [AR1,P#0.0]

      L     B#16#2                       // Datentyp BYTE
      T     LB [AR1,P#1.0]

      L     #bSendLen                   // Anzahl Bytes, Wiederholfaktor
      T     LW [AR1,P#2.0]

      L     0                                 // DB Nr; vermutlich 0 weil lokaler Instanz DB/lokale Adresse
      T     LW [AR1,P#4.0]

      L     P##aSendePuffer          // Pointer auf STAT Variable #aSendePuffer (vom Typ BYTE ARRAY, Länge == #bSendLen)
      T     LD [AR1,P#6.0]

// Speicherbereich: #84 = Global-DB, #85 = Instanz-DB, #86 = lokale Daten, #87 = vorige, lokale Daten
      L     B#16#87                    // geht nicht, aber #84, #85, #86 gehen auch nicht 
      T     LB [AR1,P#6.0]

// Entscheiden ob BSEND breit ist für die nächsten Auftrag
      ...
      // SET
      = #bSendRequest

// Aufruf BSEND
      CALL  FB    12 , DB12
       REQ   :=#bSendRequest
       R     :=#bSendReset
       ID    := W#16#1
       R_ID  := DW#16#1
       DONE  :=#BSendDone
       ERROR :=#BSendError
       STATUS:=#BSendStatus
       SD_1  :=#pAnyBSend
       LEN   :=#bSendLen

Wenn ich hingegen einen Gobal-DB als Quelle im ANY Pointer angebe, dann funktioniert es (allerdings finde ich es halt umständlich, weil ich dann den DB anlegen und konfigurieren muss; eleganter wäre es, wenn der SendePuffer - quasi "for free" - über "Instanz-DB generieren" erstellt werden könnte).

Ich fürchte, da ist konzeptionell was nicht richtig, weil der SFB 12/ BSEND ja auf die lokalen (Instanz-) Daten meines FB zugreifen muss, da kommt doch sicher einiges durcheinander?!

Falls jemand einen Tipp hat, würde ich mich sehr freuen!! VG, Jürgen


P.S. Hier der ANY Pointer auf einen Global DB- damit tut es.

Code:
//ANY Pointer for DEST auf Global-DB zusammenbauen
// #pAnyBSend ist als Instanzvariable vom Typ "ANY" deklariert


      LAR1  P##pAnyBSend
      L     B#16#10                     // ANY SyntaxID; bei S7 immer 0x10
      T     LB [AR1,P#0.0]
      L     B#16#2                       // Datentyp BYTE
      T     LB [AR1,P#1.0]

      L     #bSendLen                   // Anzahl Bytes, Wiederholfaktor
      T     LW [AR1,P#2.0]

      L     2046                                 // DB Nr
      T     LW [AR1,P#4.0]

      L     P#DBX 0.0          // Pointer auf Offset im Global DB
      T     LD [AR1,P#6.0]

      L     B#16#84                    // Speicherbereich, #84 == Global-DB
      T     LB [AR1,P#6.0]
 
Wenn du den Any-Pointer selber zusammenstellst und dieser auf deinen DB oder DI zeigen soll, dann musst du in jedem Fall auch die DB-Nummer im Any-Pointer korrekt beschreiben.
An die Nummer des Instanz-DBs gelangst du mit
L DINO

Ich verstehe allerdings nicht, warum du nicht ganz einfach dem BSEND am Parameter SD_1 direkt dein Array #aSendePuffer übergibst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank Thomas!

Das mit dem L DINO hat leider nicht geklappt:

Code:
//ANY Pointer for DEST zusammenbauen
      LAR1  P##pAnyBSend
      L     B#16#10                     // ANY SyntaxID; bei S7 immer 0x10
      T     LB [AR1,P#0.0]


      L     B#16#2                      // Datentyp BYTE
      T     LB [AR1,P#1.0]


      L     #bSendLen                   // Anzahl Bytes, Wiederholfaktor
      T     LW [AR1,P#2.0]


      L     DINO                        // DB Nr; vermutlich 0 weil lokaler Instanz DB/lokale Adresse
      T     LW [AR1,P#4.0]


      L     P##aSendePuffer          // Pointer auf STAT Variable #aSendePuffer (vom Typ BYTE ARRAY, Länge == #bSendLen)
      T     LD [AR1,P#6.0]


      L     B#16#85
      T     LB [AR1,P#6.0]


Ich verstehe allerdings nicht, warum du nicht ganz einfach dem BSEND am Parameter SD_1 direkt dein Array #aSendePuffer übergibst.

Das funktioniert!! Ich hätte schwören können, dass ich das vorher schon versucht hatte. Super, Danke!!

VG, Jürgen
 
Moin,

wenn du einen any-pointer baust und ihn auf lokale Daten zeigen lässt und ihn dann einen FC oder FB benutzt werden die lokalen des aufgerufenen FB/FCs benutzt. Das kann man aber lösen wenn man ihn auf vorherige lokale Daten setzt.
 
Hallo Clyde82,

ok, klingt erst mal plausibel, also dann so:

Code:
      LAR1  P##pAnyBSend
      L     B#16#10                     // ANY SyntaxID; bei S7 immer 0x10
      T     LB [AR1,P#0.0]


      L     B#16#2                       // Datentyp BYTE
      T     LB [AR1,P#1.0]


      L     #bSendLen                   // Anzahl Bytes, Wiederholfaktor
      T     LW [AR1,P#2.0]


      L     0                                 // DB Nr; vermutlich 0, V-L (vorige lokale Daten)
                                               // L DINO geht aber auch nicht
      T     LW [AR1,P#4.0]


      L     P##aSendePuffer          // Pointer auf STAT Variable #aSendePuffer (vom Typ BYTE ARRAY, Länge == #bSendLen)
      T     LD [AR1,P#6.0]


// Speicherbereich: #84 = Global-DB, #85 = Instanz-DB, #86 = lokale Daten, #87 = vorige, lokale Daten
      L     B#16#87                    // geht nicht, aber #84, #85, #86 gehen auch nicht 
      T     LB [AR1,P#6.0]

Hast du noch einen Vorschlag, wie ich es anders versuchen könnte? Muss man V-L Daten auf LAR2 oder vorher noch TAR1/TAR2 sicher oder was in der Art?

Vielen Dank!! VG, Jürgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achtung! Es geht nicht um die Lokaldaten/TEMP sondern um die (lokalen) Instanzdaten/STAT. Das Problem hat nichts mit Vorgänger-Lokaldaten zu tun.

Bei ANY-Pointer auf eigene Instanzdaten/STAT muß man bei (in der Regel) multiinstanzfähigen FB auch noch den Multiinstanz-Offset aus AR2 addieren. (ausführliches Beispiel)
Wenn man #aSendePuffer an BSEND.SD_1 anschließt, dann macht das der AWL-Übersetzer automatisch/unsichtbar. Wenn man selber den ANY bastelt, dann muß man selber addieren:
Code:
      TAR2                      //Multiinstanzoffset aus AR2
      UD    DW#16#FFFFFF        //Bereichskennung (DB) entfernen
      L     P##aSendePuffer     //Adresse/Offset #aSendePuffer in dieser Instanz mit Bereichskennung (DI)
      +D                        //dazu addieren --> Adresse #aSendePuffer im IDB
      T     LD [AR1,P#6.0]

Harald
 
Zurück
Oben