Step 7 Integration von Daten aus Mehrfachquellen in eine Ziel-Datenbaustein mittels FB

aliksander1612

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

ich habe folgendes Vorhaben und bräuchte dabei etwas Unterstützung: Ich möchte aus zwei Quell-Datenbausteinen unterschiedliche Werte wie Datum, Charge, Position und Toleranz (insgesamt 26 Werte) auslesen und diese anschließend in einem Ziel-Datenbaustein umstrukturiert wiedergeben, und zwar mithilfe eines Funktionsbausteins (FB). Ich habe bereits einen UDT mit der kompletten Datenstruktur für den Ziel-Datenbaustein erstellt und zwei Arrays gebildet, das passt schon mal. Einen FB habe ich auch erstellt, und am Eingang lese ich die Werte aus. Was ich jetzt wissen möchte, ist, wie ich es hinbekomme, dass beispielsweise der Wert aus DB2202.DBX4.0 mit dem Format (6) String dann in meinem Ziel-DB im Bereich 0.0 beginnt. Am besten so, dass ich dann anschließend nur noch den ARRAY-Bereich an meinem FB in-Out eintragen muss und er mir dann alle Werte passend hineinschiebt.
Am besten verwenden wir die Programmiersprache Kontaktplan und nicht direkt SCL oder AWL, vielleicht über die Funktion BLKMOVE

Quell DBs

Datum DB22.DBX4.0 STRING (6)
Charge DB22.DBX40.0. SRRING (8)
Position. DB33.DBW30. WORD
Toleranz. DB33.DBB40. INT


Struct UDT_Log

Datum STRING (6)
Charge STRING (8)
Position WORD
Toleranz INT

Ziel DB 3
Array (1..2)
UDT_Log

Datum DB3.DBX0.0. STRING 6
Charge DB3.DBX08.0 STRING 8
Position DB3.DBX18 WORD
Toleranz DB3.DBX 20.0

Step7- Classic, S7-300

Danke !
 
Zuletzt bearbeitet:
Eine wichtige Info wäre:
  1. TIA-Protal oder Step7-Classic
  2. Welche Steuerung (S7-300/400 oder 1200/1500)
  3. Mit "Datenbank" meinst du vermutlich "Datenbaustein"?
 
Das ginge tatsächlich am Einfachsten mit SCL - dort könntest du nämlich, wenn deine UDT's alle identisch (also gleichen Typs) sind es einfach so zuweisen ohne Pointer oder sowas zu bilden - also in etwa so :
Code:
"Ziel_DB".Daten[1] := "Quell__DB1".Daten ;
"Ziel_DB".Daten[2] := "Quell__DB2".Daten ;
 
In Kontaktplan kannst du mit Blockmove "QuellDatenbaustein.UDT-Arrayeintrag[1]" auf "ZielDatenbaustein.UDT-Arrayeintrag[1] schreiben.
Das geht aber nur mit festen Indexnummern und Datenbausteinen. Kenne in Kontaktplan keinen Weg um die Indizes variabel zu machen.

In SCL geht das:
Code:
//################################################### Variable Index-Zugriffe auf Arrays
IxQ:= 1;
IxZ:= 2;

DBZ.AR[IxZ]:= DBQ.AR[ixQ];

//###################################################
//Variable Datenbausteine gehen nicht direkt. Du kannst sowas machen.
//Da wechselst du anhand einer INT-Variablen den Kopierbefehl. Aber das geht in KOP auch
DbQNr:= 10;
IxZ:= 2;

CASE DbQNr OF
        10: DBZ.AR[ixZ]:= DB10.AR[1];
        11: DBZ.AR[ixZ]:= DB11.AR[1];
        12: DBZ.AR[ixZ]:= DB11.AR[1];
        ....
    ELSE:
        // Anweisungen_ELSE
        ;
    END_CASE;
Für Kopieren aus variablen DB-Nummern kann man sich was in AWL oder SCL mit indirekter Adressierung stricken.
Aber da muss man sich dann quasi die ANY-Pointer für Blockmove selber zusammenbauen. Also Adress-Offsets und Längen selbst berechnen.

Edit: Gerade gesehen das es 2 Quell-DBs und ein Ziel-DB ist.
 
Zuletzt bearbeitet:
Zurück
Oben