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
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]