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

Ergebnis 1 bis 9 von 9

Thema: Speicherbereich dynamisch darstellen bei SFC 20

  1. #1
    Registriert seit
    03.05.2006
    Beiträge
    58
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    Im OB1 habe ich solche AWL-Code erzeugt:

    L DB99.DBW4 // Fehler Anzahl (z.B. 4)
    T PAD 100

    CALL "BLKMOV"
    SRCBLK :=P#DB11.DBX0.0 BYTE 16
    RET_VAL:=MW100
    DSTBLK :=P#A 104.0 BYTE 16
    NOP 0

    gibt es Möglichkeit, dass ich díe Speicherbereich in SRCBLK und DSTBLK als Parameter eingeben kann? z.B. ich lese DB99.DBW4 und bekomme eine Zahl x, in SRCBLK schreibe ich dann " P#DB11.DBX0.0 BYTE x*4 " , weißt jemand wie kann ich das mit AWL realisieren?

    MFG,
    Rose
    Zitieren Zitieren Speicherbereich dynamisch darstellen bei SFC 20  

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

    Standard

    Guckst du hier: http://www.esatex.com/SPS-Forum/show...&highlight=Any

    oder suchst nach "Any" bzw. "Pointer".
    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

  3. #3
    Registriert seit
    13.09.2005
    Beiträge
    633
    Danke
    8
    Erhielt 8 Danke für 6 Beiträge

    Standard

    Hab' mir dafür mal einen eigenen Baustein geschrieben.

    Wenn du willst kann ich dir den zur Verfügung stellen.

  4. #4
    Rose ist offline Benutzer
    Themenstarter
    Registriert seit
    03.05.2006
    Beiträge
    58
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    vielen Dank Ihr beide!

    @crazycat: darf ich deine Baustein mal anschauen?

  5. #5
    Registriert seit
    13.09.2005
    Beiträge
    633
    Danke
    8
    Erhielt 8 Danke für 6 Beiträge

    Standard

    Klar!

    Er ist relativ kurz, deshalb poste ich ihn gleich hier und sende dir kein Projekt.

    Hier ist der Baustein:

    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
    SLW 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
    SLW 3
    +D
    T LD [AR1,P#6.0]

    CALL "BLKMOV"
    SRCBLK :=#Quelle
    RET_VAL:=MW1
    DSTBLK :=#Ziel


    Als Variablen musst du bei IN folgende Variablen einfügen:

    AnzahlDBB, INT
    QuellDB, INT
    QuellDW, INT
    ZielDB, INT
    ZielDW, INT

    Unter TEMP legst du diese 2 an:

    Quelle, ANY
    Ziel, ANY

    und dann speicherst du das ganze in einem FC.

    Das ganze sollte dann eigentlich funktionieren, probier' es mal.

  6. #6
    Rose ist offline Benutzer
    Themenstarter
    Registriert seit
    03.05.2006
    Beiträge
    58
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    vielen herzliche Dank! CrazyCat. Es wird mir sehr weiter hilfen..

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

    Standard

    @Rose
    Und mach aus dem SLW 3 ein SLD 3, es funktioniert beides, aber SLD ist richtig und bei "langen" Sprungweiten würde SLW zu "Fehlsprüngen" führen!

    Sieh dazu auch hier: http://www.esatex.com/SPS-Forum/show...hlight=blkmove, in dem angehängten Baustein ist es auch noch mit SLW, bin erst später darauf gekommen.

    Hier noch die AWL-Quelle:

    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; 
    ITD ; 
    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; 
    ITD ; 
    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 (11.08.2006 um 12:05 Uhr)
    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

  8. #8
    Rose ist offline Benutzer
    Themenstarter
    Registriert seit
    03.05.2006
    Beiträge
    58
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    nun in OB1:

    CALL FC 114
    AnzahlDBB:=DB99.DW4
    QuellDB :=DB12.DBD0
    QuellDW :=DBD0
    ZielDB := ?
    ZielDW := ?

    geht das auch wenn die Zielbereich nicht ein DB sondern der Ausgang ab Adresse 100 ist?

    // DSTBLK :=P#A 100.0 BYTE 16

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    CALL FC 114
    AnzahlDBB:=DB99.DW4 //hier muß eine Zahl drinstehen, wieviel Byte kopiert werden sollen (z.Bsp.8
    QuellDB :=DB12.DBD0 //Hier die Quell-DB-Nummer (also 10 für DB10)
    QuellDW :=DBD0 //Hier sollte die Nummer des StartDBB der Quelle drinstehen (Z.Bsp. 0 für DBB0)
    ZielDB := 20 //Das Ziel ist DB20
    ZielDW := 10 //im DB20 ab DW10 stehen nach dem Kopieren 8 Byte Daten

    Also z.Bsp.

    CALL FC 114
    AnzahlDBB:=8 //8 Byte kopieren
    QuellDB :=10 //aus DB10
    QuellDW :=0 //ab DW0 lesen
    ZielDB := 20 //in DB20
    ZielDW := 10 //ab DW ablegen

    geht das auch wenn die Zielbereich nicht ein DB sondern der Ausgang ab Adresse 100 ist?

    // DSTBLK :=P#A 100.0 BYTE 16
    Nein so geht das nicht, der FC kann nur von DB in DB kopieren.
    Du kannst aber im FC114 die Zeile

    L P#DBX 0.0; //Anfangs-DW im Ziel-DB
    durch
    L P#A0.0; ersetzen, die DB-Nummer wird dann ignoriert, oder du mußt sie mit 0 angeben, probiere es einmal aus, sollte so gehen, vielleicht hat das ja schon einmal jemand ausprobiert.
    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

Ähnliche Themen

  1. AWL Speicherbereich
    Von Chefmech im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.09.2011, 09:23
  2. Speicherbereich
    Von siemensdepp im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 28.02.2011, 09:12
  3. Speicherbereich kopieren
    Von tanja im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 25.07.2007, 23:46
  4. Realanzahl Speicherbereich
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 09.12.2005, 12:49
  5. Speicherbereich Formalismus
    Von Anonymous im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 29.11.2005, 20:43

Lesezeichen

Berechtigungen

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