TIA Kopieren zwischen Standard DB und optimiertem DB

Mephisto

Level-1
Beiträge
242
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich hab hier ein mittelgroßes Problem:
Ich habe einen Standard (also nicht optimierten) DB in dem ein Array abgelegt ist.
Die Daten dieses DB möchte ich in einen optimierten DB kopieren.
In weiterer Folge soll das dann auch in die andere Richtung funktionieren.

Ich möchte einen SCL-FB schreiben, der diese Arbeit erledigt. Quell- und Ziel-DB sollen dabei als Außenbeschaltung (IN, INOUT, etc.) angegeben werden.
Hab dazu schon mit PEEK & POKE, MOVE_BLK und den Datentypen DB_ANY sowie VARIANT rumgespielt.

Zwischen zwei optimierten DBs klappt es wunderbar (PEEK & POKE)
Zwischen zwei Standard DBs klappt es wunderbar (MOVE_BLK)
Nur zwischen optimierten und Standard DB krieg ich es zum verrecken nicht hin.

Kann mir hier mal einer vielleicht einen guten Tipp geben?
Bin für jede Hilfe dankbar.

mfg mephisto
 
ne Schleife und das Array durchkopieren?

Aus der DB-Nummer dann die Variable zusammenzubauen sollte doch irgendwie gehen? Bei Step 7 Classic ging das jedenfalls noch.

Gruß.
 
Vielleicht ist den alternative Verfahren (mit SCL) akseptabel, wenn man sieht wie einfach es geht.
Selbst wenn man in KOP oder FUP programmiert, dann kann man heute ein einzelne SCL Zeile in ein KOP oder FUP Baustein reinmachen. Das finde ich genial, genau für solche Aufgaben (*).
Dann braucht man nicht über PEEK/POKE/MOVE_BLK o.Ä zu kümmern.

Und UDTs ist mMn. eigentlich Pflicht wenn man zwischen unterschiedliche Bausteine Daten hin und her senden will, ob Array oder kein Array.

*: Bemerk, Lob an TIA (!).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
falls der optimierte DB die "Remanenzeinstellung "Im IDB setzen"" hat, sollte eigentlich auch "Pointern" in AWL gehen...

aber ich würd eigentlich auch einfach den 3 Zeiler im normalen Programm unterbringen, also ohne Kopier-FB...

Gruß.
 
letzte Idee: Array-DBs verwenden mit dem Befehl ReadFromArrayDB - WriteToArrayDB. aber keine Ahnung ob der bei optimiert und nichtoptimiert funktioniert

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zwischen zwei optimierten DBs klappt es wunderbar (PEEK & POKE)
Zwischen zwei Standard DBs klappt es wunderbar (MOVE_BLK)
Nur zwischen optimierten und Standard DB krieg ich es zum verrecken nicht hin.
Ich habe auch keine Erfahrung mit Kopieren zwischen DB mit unterschiedlicher Zugriffsart, doch hier hast Du irgendwie was durcheinander gebracht: PEEK & POKE arbeiten mit Adressen - das kann gar nicht mit "optimierten" DB funktionieren.
MOVE_BLK oder MOVE_BLK_VARIANT müsste nach meiner Vorstellung auch mit "optimierten" DB und auch gemischt gehen wenn man gleiche Datentypen symbolisch angibt (ich habe es nicht ausprobiert). Probleme bekommt man doch immer nur, wenn man unsymbolisch quer im Speicher rumstochern will. Musst Du wirklich Ziel oder Quelle aus DB-Nummern zusammenbasteln? Vergiss doch diese Nummern. Kann man nicht zwei IN_OUT-Parameter machen:
- SRC_Array : ARRAY [0..99] OF BYTE
- DEST_Array : ARRAY [0..99] OF BYTE
und dann direkt die Arrays symbolisch dranschalten? Wäre auch viel einfacher nachzuvollziehen.

Harald
 
Das wurde schon beschrieben ;)
Er möchte jedoch nach DB-Nummer referenzieren. Daher klappt die Methode leider nicht.

Mal so out of the Box gedacht.
Geht nicht in TIA noch der klassische Block Move?
Damit würde es gehen.
 
Hallo!

Zunächst mal vielen Dank für die vielen Inspirationen!
Leider ist mir die Struktur der nicht optimierten DBs vorgegeben.
Mit UDTs arbeiten ist ebenfalls keine Option da die Bausteine für den Kunden geschrieben werden und dessen Programmierer eher Implementierer sind und sich mit UDTs nicht auskennen (wollen).

Ich bin jetzt zu folgender Lösung gekommen:
Ich lese die Variablen nur noch aus den nicht optimierten DB in meinem SCL-FB ein.
Dazu übergebe ich die DB Nummer als DB_ANY.
Ich laufe nun alle relevanten Einträge des DB mittels PEEK in einer Schleife durch und kopiere sie mir in den STAT Bereich meines iDBs.
Mit diesen Werten kann ich dann arbeiten, mit HMI und anderen Bausteinen drauf zugreifen etc.
Nach der Bearbeitung kopiere ich die Variablen wieder mittels POKE und einer Schleife von meinem STAT Bereich in die DBs.

Das funktioniert soweit ganz gut.

Werd auch gleich noch eine Hand voll Danke verteilen
 
Ich muss kommentieren, obwohl das es dir gelungen ist mit PEEK und POKE und DB-Nr usw.

Leider ist mir die Struktur der nicht optimierten DBs vorgegeben.
Mit UDTs arbeiten ist ebenfalls keine Option da die Bausteine für den Kunden geschrieben werden
UDTs sorgt einfach 'nur' für ein gemeinsame Struktur. Ein klaren Vorteil wenn Programme von mehrere Personen entwickelt werden muss.

[..] und dessen Programmierer eher Implementierer sind und sich mit UDTs nicht auskennen (wollen).
Dann sind sie Idioten, und dürfen eigentlich nicht mit TIA arbeiten. Laut Siemens Programmierletfaden, darf man z.B. kein Struktur (inkl. Arrays) als Baustein Eingabe-parameter machen. Alle nicht-einfache Daten müssen mittels UDTs definiert werden.
Wenn du z.B auch vermeiden will das direkt in ein IDB von aussen geschrieben wird, dann den Struktur als FB Ein/Ausgabe-Parameter einrichten (*). Dann kannst du die PEEKs und POKEs sparen.

*: Das geht ohne oder mit UDT, aber mMn. wäre es schöner/besser/sicherer mit UDT.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mephisto,

.. Ich lese die Variablen nur noch aus den nicht optimierten DB in meinem SCL-FB ein.
Dazu übergebe ich die DB Nummer als DB_ANY.
Ich laufe nun alle relevanten Einträge des DB mittels PEEK in einer Schleife durch und kopiere sie mir in den STAT Bereich meines iDBs.
Mit diesen Werten kann ich dann arbeiten, mit HMI und anderen Bausteinen drauf zugreifen etc.
Nach der Bearbeitung kopiere ich die Variablen wieder mittels POKE und einer Schleife von meinem STAT Bereich in die DBs. ..

Könntest du mir mal ganz kurz erklären, wofür ein solcher Aufwand notwendig ist?
 
:confused:
Versteh' ich auch nicht, warum man das nicht symbolisch macht.
Die Arrays müssen nicht mal einem udt entstammen. Die gleiche Struktur reicht vollkommen, damit Jespers einfache Methode funktioniert.
Der udt schützt nur noch vor einseitiger Veränderung der Arrays.
 
Zurück
Oben