Step 7 Pointer auf Struct in Struct

schuld

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

ich suche eine Lösung für folgendes Problem:
Für einen Pointer in einem Multiinstanz-DB hatte ich bisher folgenden Code zur generierung des Pointers:

Code:
Adresse von Struct 'Daten'
      LAR1  P##Daten             //Daten ist ein Struct
      TAR2                              //Wenn Multiinstanz-DB wird Offset-Adresse aus ADR2 hinzuaddiert
      +AR1  
      TAR1  
      SRW   3                           //Bit-Adresse entfernen
      T     #Daten_adr_Struct_1
Diesen Pointer habe ich dann wie folgt verwendet:

Code:
//Zieldatenbereich 1 für Anypointer generieren
      LAR1  P##dest_1_any               //Anfangsadresse des Ziel Anypointers in AR1 laden
      L     B#16#10                     //10h fuer S7
      T     LB [AR1,P#0.0]
      L     B#16#2                      //Bereichstyp Byte
      T     LB [AR1,P#1.0]              //im Anypointer ablegen
      L     136                              //Anzahl der zu übertragenden Bytes
      T     LW [AR1,P#2.0]
      L     #Inst_DB_Nr                 //Zugriff auf Instanz-DB
      T     LW [AR1,P#4.0]
      L     #Daten_adr_Struct_1       //Nummer des ersten zu kopierenden Byte
      SLD   3                           //Ins Pointerformat bringen
      T     LD [AR1,P#6.0]              //Ergebnis im Anypointer eintragen
      L     B#16#85                     //Speicherbereich Instanz-DB
      T     LB [AR1,P#6.0]
Mit diesem Pointer schreibe ich anschließend Daten mittels SFC81 in diesen Struct.

Nun soll der Struct Daten aber in einen Struct (Struct Daten in Struct Para) verschoben werden.
Bei folgender Zuweisung bekomme ich aber Fehlermeldungen:
Code:
      LAR1  P##Para.Daten             //Daten ist ein Struct im Struct Para

Wie kann ich dieses Problem lösen?? Kann mir da jemand weiterhelfen? :)

Vielen Dank und Grüße
schuld
 
nettes Problem, nicht unlösbar.

wir bauen uns ein UDT für ANY ... überhaupt immer eine gute Idee sowas mal da zu haben!

Code:
TYPE UDT1
  STRUCT
    SyntaxId  : BYTE;
    DataType  : BYTE;
    DataCount : INT;
    DB_Number : WORD;
    BytePointer : DWORD;
  END_STRUCT
END_TYPE

uns interessiert für obige Anwendung ja der BytePointer.

Problem könnte die Bereichskennung sein.
Übergeben wir einem Baustein den Pointer auf Lokaldaten, so interpretiert der Baustein die Daten richtig als Lokaldaten des vorhergehenden Bausteins.
Rufen wir aus einem FB auf, so bekommen wir nicht die Kennung IDB sondern "nur" DB ...

Deswegen gilt: Den konkreten Anwendungsfall immer überprüfen!

im folgenden Baustein wird die Bereichskennung angepasst und für alle anderen Bereiche "FA17FA17" ausgegeben.

Code:
FUNCTION FC253 : VOID

VAR_INPUT
  DataStruct : ANY;
END_VAR

VAR_OUTPUT
  BytePointer : DWORD;
END_VAR

VAR_TEMP
  Buffer : UDT1;
  TempAny AT Buffer : ANY;
  ID : INT;
END_VAR

BEGIN 
   TempAny := DataStruct;
   ID := DWORD_TO_INT(SHR(IN:=Buffer.BytePointer,N:=24));
   
    CASE ID OF
        135 : BytePointer := Buffer.BytePointer AND DW#16#FEFFFFFF;                        
        132 : BytePointer := Buffer.BytePointer OR DW#16#1000000;
    ELSE: BytePointer := DW#16#FA17FA17;
    END_CASE;
   END_FUNCTION

der Aufruf für obiges Beispiel sieht dann so aus:

Code:
      CALL  FC   253
       DataStruct :=#Para.Daten
       BytePointer:=#tempAR1

      LAR1   #tempAR1
 
Zurück
Oben