Indirekte Adressierung von SFC 20

andre

Level-2
Beiträge
268
Reaktionspunkte
37
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe da ein kleines Problem. Ich will Daten mit dem SFC 20 rangieren. Die Quelle ist immer die gleiche Adresse, z.B.
P# DB10.DBX0.0 BYTE 32. Das Ziel ist abhängig von dem Inhalt in einem Merkerbyte. Ich möchte aus dem Merkerbyte einen Zeiger programmieren, der jeweils auf den zugehörigen DB zeigt. Die Biteadresse spielt dabei keine Rolle. Ich errechne aus dem Merkerbyte die DB-Nr und lege sie in eine temp. Variable. Warum akzeptiert der Editor folgende Anweisung nicht?
P# DB[DB-Nr].DBX0.0 BYTE 32
Wenn ich schreibe:
AUF DB[DB-Nr], das funktioniert doch auch.
Gruß Andre
 
Siemens kann nur 32 Bit Adressen handeln. Du musst dir einen ANY-Pointer zusammenbasteln. Das ist mit der Hilfe ziemlich einfach. Einfach mal nach ANY suchen. Dort findest du den Aufbau der Datenstructur.

Gruß pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der ANY-Pointer ist für derartige Adressierung nicht ausgelegt.
Der Bereichszeiger muss selbst erstellt werden.

Hier ein Beispiel:

Code:
      LAR1  P##Temp                     // ********** ANY-Pointer bauen **************
      L     B#16#10                     // Syntax ID 
      T     LB [AR1,P#0.0]
      L     B#16#2                      // Bereichtyp 2=Byte, 4=Word
      T     LB [AR1,P#1.0]
      L     32                          // Anzahl der Bytes/Word
      T     LW [AR1,P#2.0]
      L     #DB                         // DB Adresse
      T     LW [AR1,P#4.0]
      L     P#DBX 0.0                   // Bereichspointer in Datenbaustein
      L     0                           // Byte-Adresse des Datenbereiches
      SLD   3                           // In Pointerformat wandeln
      +D                                // mit Bereichspointer verbinden
      T     LD [AR1,P#6.0]              // ******* Ende ANY-Pointer bauen *************

Übrigens steht in der Hilfe von Step7 bereits ein Beispiel für die indirekte Adressierung von SFC20 drin.
 
Hier mal ein einfacher FC, welcher die Datenanwahl variabel macht:

Code:
FUNCTION FC 112 : INT
TITLE =BLK_Move
{ S7_language := '7(1) Deutsch (Deutschland)  16.06.2005  14:21:35' }
AUTHOR : Ralle
FAMILY : SYSTEM
NAME : BLK_MOVE
VERSION : 1.1


VAR_INPUT
  AnzahlDBB : INT ;	
  QuellDB : INT ;	
  QuellDW : INT ;	
  ZielDB : INT ;	
  ZielDW : INT ;	
END_VAR
VAR_TEMP
  Quelle : ANY ;	
  Ziel : ANY ;	
END_VAR
BEGIN
NETWORK
TITLE =Blocktransfer zwischen Datenbausteinen

      LAR1  P##Quelle; //Anfangsadresse des ANY-Pointers in AR1 laden

      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]; 
      L     #AnzahlDBB; //Transferlaenge
      T     LW [AR1,P#2.0]; 
      L     #QuellDB; //Quelle-DB 
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Quell-DB
      L     #QuellDW; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 

      LAR1  P##Ziel; //Anfangsadresse des ANY-Pointers in AR1

      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]; 
      L     #AnzahlDBB; //Transferlaenge
      T     LW [AR1,P#2.0]; 
      L     #ZielDB; //Ziel-DB
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Ziel-DB
      L     #ZielDW; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 

      CALL SFC   20 (
           SRCBLK                   := #Quelle,
           RET_VAL                  := #RET_VAL,
           DSTBLK                   := #Ziel);
END_FUNCTION
 
Zuletzt bearbeitet:
Hallo,
Vielen Dank, das hat mir sehr geholfen. Mit dieser Form der Adressierung habe ich immer noch Schwierigkeiten. Das kann manchmal ganz schön verwirren.
Gruß Andre
 
Zurück
Oben