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

Ergebnis 1 bis 10 von 10

Thema: Wie einen Block aus/in einen Datenbaustein kopieren, via einer übegebenen dbnr?

  1. #1
    Registriert seit
    14.09.2011
    Beiträge
    109
    Danke
    17
    Erhielt 5 Danke für 5 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Bei der Aktion der S7-1200/1500 Fetch write beizubringen hänge ich an einer Stelle fest.


    Code:
                #pt := DB_ANY_TO_VARIANT(in := #dbnr, err => #ret_val); // Klappt nicht, wenn
    Mein Problem ist, daß ich dbnr nicht versorgen kann.
    Definiert man dbnr als "DB_ANY", dann kann man das tun:

    Code:
                  dbnr := 1; // Klappt.
                #pt := DB_ANY_TO_VARIANT(in := #dbnr, err => #ret_val); // klappt auch ... mit #pt kann man weiter arbeiten ...
    Aber wie macht man sich aus einem USint #nr eine gültige DB_ANY #dbnr?


    Gruß Jojo
    Zitieren Zitieren Gelöst: Wie einen Block aus/in einen Datenbaustein kopieren, via einer übegebenen dbnr?  

  2. "Wenn du "nicht optimierte" DB nutzt, kannst du genau so "Any-Basteln" betreiben, wie in Step7 V5.5 und anschließend mit diesen Adressen ein BlkMove machen.

    Code:
    L     P##ReadThisAdress
          LAR1
          L B [ AR1 , P#0.0 ]
          T     #AdressOut.AnyPoint.Syntax_ID
    
    
          L B [ AR1 , P#1.0 ]
          T     #AdressOut.AnyPoint.DataType
    
    
          L W [ AR1 , P#2.0 ]
          T     #AdressOut.AnyPoint.DataCount
    
    
          L W [ AR1 , P#4.0 ]
          T     #AdressOut.AnyPoint.DB_Number
    
    
          L B [ AR1 , P#6.0 ]
          T     #AdressOut.AnyPoint.MemLowByte
    
    
          L B [ AR1 , P#7.0 ]
          T     #AdressOut.AnyPoint.MemHighByte
    
    
          L W [ AR1 , P#8.0 ]
          T     #AdressOut.AnyPoint.ByteBitAdr


    "


  3. #2
    Registriert seit
    17.12.2010
    Beiträge
    222
    Danke
    21
    Erhielt 75 Danke für 53 Beiträge

    Standard

    Hallo
    Darf ich mal nachfragen warum du an der db nummer hängst? In der 1500 ist ja die philosophie es wirklich symbolisch zu machen. Also wenn du ab den DB_ANY deinen db angibst sollte das ja funktionieren. Oder musst du die db nummer dynamisch umschalten?

  4. #3
    Avatar von shadowdb
    shadowdb ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.09.2011
    Beiträge
    109
    Danke
    17
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Ich reimplementiere das Fetch/Write Protokoll. (Weil es ja FW_TCP/FB210 nicht mehr in den neueren CPU 12xx/15xx gibt).

    Die DBNr wird dynamisch übergeben, die Länge des Bereiches ebenfalls, steht beides im Telegramm Kopf.
    2
    Meine Nutzdaten/Empfangsdaten habe ich in einem #Buffer im Lokaldaten bereich (I-DB, statisch, ohne "optimierungen").

    Eigentlich will ich sowas wie BLKMOV/SFC20 in C: memcpy(...) machen, aber in TIA SCL v13 lässt sich das nicht ordentlich adressieren.
    (BLKMOV/SFC14 gibt es auch nicht mehr....)

    Ich hänge daran, die DBNr dynamisch zu verwenden, um sowas wie move_blk_variant, poke_blk verwenden zu können.

    Gruß Jojo

    PS: Jetzt weiß ich auch warum TIA "TIA" heisst. Es ist soviel neu, daß man Fragen muß, "Thanks-in-Advance"

  5. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.133
    Danke
    523
    Erhielt 2.672 Danke für 1.929 Beiträge

    Standard

    Wenn du "nicht optimierte" DB nutzt, kannst du genau so "Any-Basteln" betreiben, wie in Step7 V5.5 und anschließend mit diesen Adressen ein BlkMove machen.

    Code:
    L     P##ReadThisAdress
          LAR1
          L B [ AR1 , P#0.0 ]
          T     #AdressOut.AnyPoint.Syntax_ID
    
    
          L B [ AR1 , P#1.0 ]
          T     #AdressOut.AnyPoint.DataType
    
    
          L W [ AR1 , P#2.0 ]
          T     #AdressOut.AnyPoint.DataCount
    
    
          L W [ AR1 , P#4.0 ]
          T     #AdressOut.AnyPoint.DB_Number
    
    
          L B [ AR1 , P#6.0 ]
          T     #AdressOut.AnyPoint.MemLowByte
    
    
          L B [ AR1 , P#7.0 ]
          T     #AdressOut.AnyPoint.MemHighByte
    
    
          L W [ AR1 , P#8.0 ]
          T     #AdressOut.AnyPoint.ByteBitAdr


    Angehängte Grafiken Angehängte Grafiken
    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. #5
    Registriert seit
    19.10.2010
    Beiträge
    322
    Danke
    15
    Erhielt 35 Danke für 31 Beiträge

    Standard

    Guten abend, ich muss das Thema nochmas nach oben holen. Ich versuche verzweifelt dynamisch einen variablen aber gleich aufgebauten DB in einen Ziel DB zu kopieren. Leider funktioniert das überhaupt nicht. Ich kann auch mit der Funktion DB_ANY_TO_VARIANT den Zeiger nicht erzeugen um danach den Baustein zu kopieren. Als zweiter Schritt sollte das auch zum Laden von der MMC in den Arbeitsspeicher funktionieren. Gibt es vielleicht auch eine Möglichkeit sich den aktuellen Zeiger anzeigen zu lassen?

  7. #6
    Registriert seit
    11.12.2009
    Beiträge
    2.097
    Danke
    387
    Erhielt 384 Danke für 267 Beiträge

    Standard

    In SCL würde ich folgendes machen:

    Code:
    MeinZielDB := MeinQuellDB;
    Oder habe ich zu einfach gedacht?

    Grüße

    Marcel
    Stell Dir vor es geht, und keiner kriegts hin!

  8. #7
    Registriert seit
    19.10.2010
    Beiträge
    322
    Danke
    15
    Erhielt 35 Danke für 31 Beiträge

    Standard

    Ja so funktioniert es schlussendlich allerdings ist einer der beiden dynamisch adressierbar

  9. #8
    Registriert seit
    11.12.2009
    Beiträge
    2.097
    Danke
    387
    Erhielt 384 Danke für 267 Beiträge

    Standard

    Deshalb hab ich mir abgewöhnt für jedes Aggregat einen DB zu machen, sondern habe einen DB mit einem ARRAY of Aggregat...

    Somit kann ich dann sowas machen:

    Code:
    Datenbausten.Aggegat[Ziel] := Datenbaustein.Aggregat[Quelle];
    Grüße

    Marcel
    Stell Dir vor es geht, und keiner kriegts hin!

  10. #9
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.133
    Danke
    523
    Erhielt 2.672 Danke für 1.929 Beiträge

    Standard

    Wie viele DB hast du?
    Wenn das übersichtlich ist, ginge auch eine Case-Anweisung, die dann jeweils die Anweisung
    ZielDB := QuellDB1;
    ZielDB := QuellDB2;
    ...
    enthält.

    Wenn der DB eine große Hauptstruktur enthält, die dann wiederum in Unterstrukturen unterteilt ist, sollte auch der von mit oben gepostete Code mit der Hauptstruktur funktionieren.
    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

  11. #10
    Registriert seit
    19.10.2010
    Beiträge
    322
    Danke
    15
    Erhielt 35 Danke für 31 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das Problem ist ja, dass der Baustein nicht im Ladespeicher liegt. Haben jetzt aber herausgefunden, dass es nur mit nicht optimierten Bausteinen funktioniert. Wieso das so ist, keine Ahnung. Jetzt kann ich den Baustein aber auch klassisch über einen Any Pointer ansprechen. Würde der Baustein im Ladespeicher liegen könnte ich ihn auch per Array indiziert ansprechen

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 11.06.2015, 21:37
  2. Antworten: 5
    Letzter Beitrag: 05.09.2014, 09:34
  3. Step 7 Daten aus DB in einen anderen DB kopieren
    Von roadjet im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 10.05.2014, 13:37
  4. Wie einen Atmega 8515-16 kopieren?
    Von maxi im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 13.07.2006, 13:18
  5. Antworten: 2
    Letzter Beitrag: 18.07.2005, 10:42

Lesezeichen

Berechtigungen

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