TIA Daten aus DB in anderen DB kopieren

Wolfgang14

Level-1
Beiträge
175
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich würde gern Werte aus mehreren DB‘s in einem DB kopieren, diese dann versenden und in einer anderen CPU wieder raus kopieren. Ich habe mal was von Blockmove gelesen das es wohl damit gehen soll. Was müsste ich denn da ran schreiben wenn ich Werte aus meinen DB2 der 100 Byte groß ist und Daten aus meinen DB3 200Byte in meinen DB4 kopieren möchte und dann auch wieder heraus.


Ich arbeite mit dem TIA Portal V15.1

Danke schon mal im Voraus
 
Wie sind die Daten aufgebaut? In einer Struktur? Einem Array, einem UDT? Sind die Bausteine optimiert (oder haben die Variablen Adressen)?
 
versenden und in einer anderen CPU wieder raus kopieren
Du hast 2 CPUs und willst Daten von einer zur anderen CPU senden?
Welche CPUs?
Wie sind die CPUs vernetzt (Ethernet, Profibus, ...)? Geht die Vernetzung über CP? Welche?
Sind die CPUs im selben TIA-Projekt?

Mit Blockmove kann man nur Daten innerhalb einer CPU kopieren.
Um zu einer anderen CPU zu senden, würde ich die Daten in einen Sendepuffer kopieren/einsammeln und dann den Sendepuffer zur anderen CPU senden.

Schau mal in die Linksammlung in meiner Signatur. Schau Dir schon mal das da verlinkte "Kompendium CPU-CPU Kommunikation mit SIMATIC Controllern" an.

Harald
 
Hallo PN/DP

Ja genau ich habe 2 1500er SPS´sen diese sind mittels Profinet gekoppelt. Aktuell habe ich eine Iso on TCP Verbindung am laufen und verschicken einen DB mittels T_Send_C

Jetzt haben wir aber noch weitere CPUs (1200er) an die eine gekoppelt das bedeutet ich müsste mehrere DB zwischen meinen beiden 1500ern hin und her schicken. Das habe ich aber nicht hinbekommen.

Ich hatte einfach mehrere T_Send_C Bausteine genommen und dabei haben alle DB´s überlagert und überschnitten ( die Werte haben ständig zwischen True und False gewechselt)

Deswegen dachte ich mir mit Blockmove einen Sendebaustein zu basteln und mir das in der Empfangs SPS wieder rauszukopieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Wolfgang14,

ich würde dir empfehlen dass du bei beiden Steuerungen einen Sende bzw. Empfangspuffer konfigurierst der min. so groß oder eben genau so groß ist wie alle deine Strukturen aus allen DBs zusammen.
Ich bevorzuge es im Sendepuffer immer eine in Byte-Form zu erstellen.

Wenn du z.B.: 5 Strukturen mit jeweils 50 Byte hast, dann erstelle dir einfach ein Byte-Array mit 250 Byte und gibt diesen DB dann für den Send-Block bzw. auf der anderen CPU als Receive-Block an.

Nun kannst du relativ einfach mit der "Serialize" Befehl einfach jeden Baustein serialisieren und in einen Ziel-DB kopieren (in deinem Fall der Sende-Buffer in Byte-Form).
Bei diesem Befehl ist es sehr praktisch dass du auch einen INOUT Parameter POS hast, dieser gibt an wo du im Puffer die Daten in Byte Form hinkopierst bzw. wo der Zeiger gerade steht.
Somit brauchst du nur, je nachdem wie viele Strukturen es sind ein paar mal Serialize machen und dann hast du alle Datenpunkte in einem DB als Byte-Form die du senden kannst.

Auf der Gegenseite verwendest du einen gleich großen Datenbaustein in Byte-Form und verwendest dort den "Deserialize"-Befehl, dafür solltest du eben die ganzen Structs ebenfalls auf der Gegenseite haben.

Hoffe die Info kann dir weiterhelfen.
 
Der POS Parameter dient dafür damit du weißt an welcher Position in deinem Bytes-DB du dich befindest.
Das ist für dich wichtig weil du ansonsten mit den mehreren Serialize-Aufrufen immer wieder vom Byte-Index[0] ausgehen würdest.

Kurz beschrieben:
Das erste Struct in deinem Datenbaustein hat 50 Byte.
Das zweite Struct in deinem Datenbausten hat 100 Byte.

Du würdest nun den ersten Serialize-Befehl starten und somit würde der POS-Paramter auf 49 gehen (0-basierend).
Somit wären dein erstes Struct jetzt in deinem Sendepuffer-DB mit einer Länge von 50 Byte.

Sobald du jetzt den zweiten Serialize-Befehl aufrufst und die gleiche Variable für den POS-Parameter verwendest, weiß der Baustein dass
das zweite Struct von ab diesem Byte reinkopiert werden darf.
Also würden die nächsten 100 Byte ab diesem Index in den Sendepuffer-DB geschrieben werden. Somit würde der POS-Parameter dann auf 149 ansteigen.


Frei aus dem Kopf denke ich jetzt dass der POS-Parameter ein DINT ist und meistens einfach eine temporäre Variabel verwendet wird, weil du vermutlich sowieso
beide Serialize Aufrufe direkt hintereinander machen wirst.



Für das Deserialize gilt dann so ziemlich die gleiche Prozedur, ansonsten wüsstest du nicht von welchem Byte weg du dein zweites Struct deserialisieren sollst.


Hoffe habe es einigermaßen verständlich beschrieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Rabi,

so ich habe es jetzt gerade mal versucht aber irgendwie kopiert er nichts.

Ich habe jetzt bei EN es erstmal mit True oder einem Taktmerker versucht.
Bei SRC_Variable habe ich meinen DB3 und mein Struct angegeben
Bei Pos habe ich eine Temporäre Variable gewählt
Bei Ret_Val ebenfalls eine Temporäre Variable
und bei Dest Array meinen zum Beispiel DB4 und das jeweilige Struct

Jedoch bleibt mein Pos bei 0 und Ret_Val bei-32172
 
Hallo,

wenn du in die Hilfe von TIA schaust bei dem Befehl Serialize findest du recht schnell die Fehler-Codes.

In deinem Fall, am besten du lässt dir das RET_VAL immer gleich als HEX anzeigen sonst ist es immer zum umrechnen, erhältst du folgenden Fehler:
[TABLE="class: table_default, width: 100%"]
[TR]
[TD][/TD]
[TD]8254 (=-32172) Ungültiger Datentyp am Parameter DEST_ARRAY

Hast du auch am DEST_ARRAY eine Struktur angelegt? Dort musst du jetzt, ebenfalls der Siemens Hilfe entnommen:

Zeiger auf ein ARRAY of BYTE oder ARRAY of CHAR, in dem der erzeugte Datenstrom gespeichert wird
angeben.

Ansonsten kannst du vielleicht einen kurzen Screenshot machen von deinem Serialize Befehl, ansonsten ist es etwas schwierig nachzuvollziehen.


[/TD]
[/TR]
[/TABLE]
 
Zurück
Oben