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

shadowdb

Level-1
Beiträge
115
Reaktionspunkte
8
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
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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" :D
 
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

attachment.php


attachment.php
 

Anhänge

  • Schnappschuss (2016-06-02 15.03.54).jpg
    Schnappschuss (2016-06-02 15.03.54).jpg
    103,3 KB · Aufrufe: 198
  • Schnappschuss (2016-06-02 15.04.44).jpg
    Schnappschuss (2016-06-02 15.04.44).jpg
    109,8 KB · Aufrufe: 194
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?
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zurück
Oben