TIA Kompletten DB über Blockmove kopieren (TIA V14SP1)

pkampitsch

Level-1
Beiträge
17
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte gerne einen kompletten DB(nicht optimiert)in einen anderen DB kopieren können. Leider stehe ich da momentan auf dem Schlauch. Mit PLC-datentypen oder Arrays funktioniert das einwandfrei.
Danke für eure Hilfe!

Gruß
Philipp

Gesendet von meinem SM-G950F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum erstellst Du Deinen DB nicht aus einem PLC-Datentyp, wenn's damit geht?
Hallo hucki, weil ich die UDT`s eigentlich nur dann nutze, wenn ich die Struktur mehrmals benötige (z.B. einen Zähler). Vielleicht verstehe ich nur nicht ganz, wie mächtig die PLC-Datentypen in TIA geworden sind.

Gesendet von meinem SM-G950F mit Tapatalk
 
da du einen nicht optimierten DB nutzt, kannst du die DB länge lesen und dir so einen Any Pointer zusammen stellen.
In welcher Sprache möchtest du es den schreiben und was für eine Steuerung hast du?
 
da du einen nicht optimierten DB nutzt, kannst du die DB länge lesen und dir so einen Any Pointer zusammen stellen.
In welcher Sprache möchtest du es den schreiben und was für eine Steuerung hast du?
Hallo Hadante, danke für deine Antwort.
Das ganze möchte ich gerne in SCL realisieren.
Eine 1515 Steuerung ist im Einsatz.

Gesendet von meinem SM-G950F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
Hallo hucki, weil ich die UDT`s eigentlich nur dann nutze, wenn ich die Struktur mehrmals benötige (z.B. einen Zähler). Vielleicht verstehe ich nur nicht ganz, wie mächtig die PLC-Datentypen in TIA geworden sind.
Ich sag mal so, wenn du deine Daten in einem DB hast und in einen anderen kopieren möchtest, dann hast du doch eine Mehrfachverwendung und ergo einen guten Grund diese in eine UDT zu packen. Und dann kannst du auch DB1 := DB2 in SCL machen ;)
 
Ich persönlich finde die Verwendung von Any Zeigern im SCL nicht schön.
Im AWL hätte ich es so gelöst, im SCL würde ich im Zweifelsfall lieber eine Schleife verwenden.

Aber hier ein schnell hin gekritzeltes Beispiel wie es möglich wäre. Schön ist es nicht aber sollte gehen.
Any1 und Any2 sind Temp Variabeln mit einer AT Ansicht.
Quelle ist DB50 und Ziel ist DB51.

Code:
#RetVal := ATTR_DB(REQ := TRUE, DB_NUMBER := 50, DB_LENGTH => #leng, ATTRIB => #by);

#Any1k.Kennung := B#16#10; //S7
#Any1k.Anzahl := #leng; //Länge des DB
#Any1k.Datentyp := b#16#2; //Datentyp Byte
#Any1k.Bereich := dw#16#84000000; //Datenbereich DB und Adresse 0.0 da wir den ganzen DB wollen
#Any1k.DBNr := 50;


#Any2 := #Any1;


#Any2k.DBNr := 51;


#RetVal := BLKMOV(SRCBLK := #Any1, DSTBLK => #Any2);
 
Das wäre mein Vorschlag mit PEEK und POKE:

Code:
#Quell_DB.RETVAL_ATTR_DB:= ATTR_DB(REQ := "AlwaysTRUE", DB_NUMBER := #iDB_Quelle, DB_LENGTH=> #Quell_DB.DB_Laenge, ATTRIB=> #Quell_DB.DB_Attribut);
#Ziel_DB.RETVAL_ATTR_DB := ATTR_DB(REQ := "AlwaysTRUE", DB_NUMBER := #iDB_Ziel, DB_LENGTH => #Ziel_DB.DB_Laenge, ATTRIB => #Ziel_DB.DB_Attribut);
IF #Quell_DB.DB_Laenge <= #Ziel_DB.DB_Laenge THEN
    FOR #i := 0 TO UDINT_TO_INT(#Quell_DB.DB_Laenge) DO
        #Quell_DB.Wert := PEEK(area := 16#84, dbNumber := #iDB_Quelle, byteOffset := #i);
        POKE(area := 16#84, dbNumber := #iDB_Ziel, byteOffset := #i, value :=  #Quell_DB.Wert);
    END_FOR;
END_IF;
 
Bis die Schleife durch ist :)

Du hast schon Recht, das ist nicht zwingend performant. Aber sooooo schlecht ist die Lösung trotzdem nicht, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo hucki, weil ich die UDT`s eigentlich nur dann nutze, wenn ich die Struktur mehrmals benötige (z.B. einen Zähler). Vielleicht verstehe ich nur nicht ganz, wie mächtig die PLC-Datentypen in TIA geworden sind.
Ich sag mal so, wenn du deine Daten in einem DB hast und in einen anderen kopieren möchtest, dann hast du doch eine Mehrfachverwendung und ergo einen guten Grund diese in eine UDT zu packen. Und dann kannst du auch DB1 := DB2 in SCL machen ;)
*ACK*

Code:
[COLOR=#333333]DB1 := DB2;[/COLOR]
statt des ganzen "Geratzes", was ansonsten so nötig ist.
Welchen Grund mehr braucht man für den UDT?

Alle vorhandene Variablen des DB kopieren, in einen neuen UDT eintragen und die DB-Vorlage von Global auf den UDT umstellen. Ist ja auch nicht die Welt an Arbeit.
Ganz nebenbei kannst Du bei Bedarf den DB noch in einem Rutsch als HMI-Variable, mit der gleichen Struktur und die sich beim Übersetzen automatisch aktualisiert, ins WinCC übernehmen.
:cool:
 
Ansonsten gibts noch Poke_BLK

Code:
POKE_BLK(area_src:=16#84,
         dbNumber_src:=1,
         byteOffset_src:=0,
         area_dest:=16#84,
         dbNumber_dest:=2,
         byteOffset_dest:=0,
         count:=300);
 
Hallo zusammen,
stehe vor dem selben Problem.

Ich habe mehrere DB´s erstellt mit dem selben PLC Datentyp (nicht optimeirt)

Nun habe ich eine Variable (INT oder DB_Any) in der Praktisch meine "Progammnummer" steht, jetzt möchte ich praktisch DB"Programmnummer" in DBxy kopieren.
Wie muss ich da nun vorgehen? Habe schon zig Beiträge durch, aber komme nicht auf eine einfache lösung :(

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun habe ich eine Variable (INT oder DB_Any) in der Praktisch meine "Progammnummer" steht, jetzt möchte ich praktisch DB"Programmnummer" in DBxy kopieren.
Wie muss ich da nun vorgehen? Habe schon zig Beiträge durch, aber komme nicht auf eine einfache lösung :(

Auf einer 1500/1200er?
Dann würde ich dir POKE_BLK vorschlagen.
 
Super Danke! Genau das was ich gesucht habe. Bin vorhin schon einmal kurz auf POKE gestoßen aber nicht auf POKE_BLK.

Vielen Danke!
 
Zurück
Oben