Zusammenkopieren aus mehreren DBs

zehdeh

Level-2
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich bin auf der Suche nach einer Lösung für zusammentragen von Daten.
Im Programm liegen Prozessdaten in 24 verschiedenen DBs vor, die ich gerne in einen DB schreiben möchte, um diesen dann über TSEND zu verschicken.
Die Schwierigkeit liegt darin, dass die Daten „verstreut“ in den DBs liegen und wesentlich zu viele sind, um sie per Hand zu kopieren.
Je ein DB besteht auf 10 gleich aufgebauten Structs, von denen ich jeweils an 8 verschiedenen Stellen Daten abgreifen möchte. Diese sollen dann nacheinander in den großen Ziel-DB geschrieben werden.
Ich habe mir schon ein wenig das Gehirn zermalmt, ob man das irgendwie mit geschachtelten Loops und Pointern realisieren kann, bin aber noch zu keinem sinnvollen Ergebnis gekommen. Hat vielleicht jemand ne schicke Idee?
Ich hab das Problem nochmal versucht, grafisch darzustellen:

Achja, das Ganze sollte in AWL auf einer CPU 416-2 DP mit Step 7 V5.5 programmiert werden.
 

Anhänge

  • DB_Zusammenstellen.jpg
    DB_Zusammenstellen.jpg
    39,4 KB · Aufrufe: 63
Da du von Pointern und Loops schreibst, hast du dich wohl bislang mit AWL beschäftigt.
Geht sicherlich, aber sowas lässt sich wesentlich einfacher in SCL lösen.
Hilfreich sind dabei die sogenannten "Sichten" (Views).

Gruß
Blockmove
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,

Danke für den Tipp mit den Sichten, interessante Sache und war mir wo anders auch tatsächlich hilfreich. Ich habe mein Problem jetzt etwas anders gelöst, indem ich for-schleifen und den WORD_TO_BLOCK_DB genutzt habe:

Code:
FOR seq_loop := 0 TO 5 BY 1 DO
    FOR step_loop := 0 TO 9 BY 1 DO
        
        // Werte aus DB 30X
        SRC_DBnumber := (INT_TO_WORD(300 + (seq_loop + 1))); // Greift auf DB 30X zu mit X=[1-6]
        SRC_byteindex := (step_loop * 140); // 140 = Bytelänge eines Steps
        DST_byteindex := (38 + 2 + (seq_loop * 820) + (step_loop * 82));
        // 38 = Header-Offset 
        // 2 = Ofenebene-Offset
        // step_loop * 82 = Länge eines Steps im PDE-DB
        // seq_loop * 820 = Länge einer Sequenz im PDE-DB
        
        
       "DB1".DW[DST_byteindex + 0] := WORD_TO_BLOCK_DB(SRC_DBnumber).DW[SRC_byteindex + 0];
       "DB1".DW[DST_byteindex + 2] := WORD_TO_BLOCK_DB(SRC_DBnumber).DW[SRC_byteindex + 2];
       [...]
       "DB1".DW[DST_byteindex + 58] := WORD_TO_BLOCK_DB(SRC_DBnumber).DW[SRC_byteindex + 130];
       "DB1".DW[DST_byteindex + 60] := WORD_TO_BLOCK_DB(SRC_DBnumber).DW[SRC_byteindex + 132];
        
    // Werte aus DB 40X
        SRC_DBnumber := (INT_TO_WORD(400 + (seq_loop + 1))); // Greift auf DB 40X zu mit X=[1-6]


       "DB1".DW[DST_byteindex + 62] := WORD_TO_BLOCK_DB(SRC_DBnumber).DW[150];
       [...]
       "DB1".DW[DST_byteindex + 80] := WORD_TO_BLOCK_DB(SRC_DBnumber).DW[168];

      END_FOR;
    
    END_FOR;

FOR seq_loop := 6 TO 23 BY 1 DO
    FOR step_loop := 0 TO 9 BY 1 DO

 [Quasi das selbe nochmal in Grün] 

    END_FOR;
END_FOR;

Ich bin mir allerdings nicht ganz sicher, ob das wirklich so funktioniert, mit dem Testen tu ich mich noch ein wenig schwer :?

Eine Frage wäre noch, ob eine solche Lösung nicht relativ Zeitaufwändig wäre, mit dem ständigen zugreifen auf DBs etc... kann das jemand von euch einschätzen? Nur so gefühlsmäßig, soll auf ner CPU 416-2 DP laufen..
 
Zuletzt bearbeitet:
Zurück
Oben