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

Ergebnis 1 bis 7 von 7

Thema: Indirekte Adressierung von SFC 20

  1. #1
    Registriert seit
    31.10.2003
    Beiträge
    265
    Danke
    23
    Erhielt 37 Danke für 31 Beiträge

    Standard


    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
    Zitieren Zitieren Indirekte Adressierung von SFC 20  

  2. #2
    Registriert seit
    07.05.2004
    Ort
    Campbelltown
    Beiträge
    2.437
    Danke
    131
    Erhielt 276 Danke für 86 Beiträge

    Standard

    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
    Gegen Schwachsinn, Schwachköpfe und armselige Trittbrettfahrer kann man nicht argumentieren.

    Gott sieht alles, auch Signaturen in Geheimschrift,,... aber er petzt nicht.

  3. #3
    Registriert seit
    13.11.2004
    Beiträge
    170
    Danke
    0
    Erhielt 14 Danke für 9 Beiträge

    Standard

    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.

  4. #4
    Registriert seit
    07.05.2004
    Ort
    Campbelltown
    Beiträge
    2.437
    Danke
    131
    Erhielt 276 Danke für 86 Beiträge

    Standard

    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
    Gegen Schwachsinn, Schwachköpfe und armselige Trittbrettfahrer kann man nicht argumentieren.

    Gott sieht alles, auch Signaturen in Geheimschrift,,... aber er petzt nicht.

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    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
    Geändert von Ralle (27.02.2009 um 14:17 Uhr) Grund: Aus gegebenem Anlaß eine kleien Korrektur!
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. Folgende 4 Benutzer sagen Danke zu Ralle für den nützlichen Beitrag:

    Buschmann (13.09.2017),service@ia-lautenschlager (15.12.2010),SIGGI (12.03.2009),vollmi (06.01.2016)

  7. #6
    Registriert seit
    13.11.2004
    Beiträge
    170
    Danke
    0
    Erhielt 14 Danke für 9 Beiträge

    Standard

    P##Temp geht natürlich nicht!!

    Das war vorher so, da ich es für SFC21 verwendet hatte:

    Code:
    LAR1  P##Temp_Loeschen

  8. #7
    andre ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    31.10.2003
    Beiträge
    265
    Danke
    23
    Erhielt 37 Danke für 31 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

  9. Folgender Benutzer sagt Danke zu andre für den nützlichen Beitrag:

    SIGGI (21.02.2009)

Ähnliche Themen

  1. Indirekte Adressierung in AWL
    Von Bensen83 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 31.01.2015, 15:58
  2. indirekte Adressierung
    Von Sash7770 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.12.2008, 12:47
  3. indirekte Adressierung
    Von Linowitch im Forum HMI
    Antworten: 13
    Letzter Beitrag: 06.12.2008, 19:43
  4. Indirekte Adressierung
    Von thomasgull im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 31.01.2008, 14:49
  5. Indirekte Adressierung
    Von wusel220983 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 18.05.2007, 18:19

Lesezeichen

Berechtigungen

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