TIA Bereich kopieren, gleiche Länge aber unterschiedlicher Datentyp?

sargan26

Level-2
Beiträge
102
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

ich habe ein Fremdgerät mit einem flexiblen Speicherplatz. Der Speicherplatz ist gleich groß aber je nachdem welche "Switching_table" (Integer) man auswählt lädt er unterschiedliche Daten in diesen Speicher (zB. Endwerte, Fensterwerte, Meldungsinformationen...):
1653303142201.png
Man sieht das die Variable "Switching_table" 10 Bytes lang ist, genauso wie "Endwerte" und "Meldung". Ich möchte je nachdem welche Switching_table angewählt ist die entsprechenden Daten kopieren.

Zum Beispiel: "Endwerte" ausgewählt
Dann soll er die Werte von Switching_table auf Endwerte kopieren damit man Kraft und Position komfortable auslesen kann.
Pseudo Code (SCL):
Endwerte := Switching_table; // Funktioniert aber nicht weil unterschiedliche Datentypen

Anmerkung:
Es funktioniert zum Beispiel mit PEEK und POKE Befehlen und Offsets allerdings relativ aufwendig und vielleicht auch schlecht von der Zykluszeit(?). Gibt es da keine einfachere Methode?
 
Mit einer Case Anwendung arbeiten und die Variablen entsprechend dem Verknüpfen was du haben möchtest?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, das Problem ist dass die Daten von das Fremdgerät eine unterschiedliche Struktur haben kann.

Mit SERIALIZE + DESERIALIZE kannst du Daten kopieren zwischen Strukturen die nicht die gleiche Deklaration haben.
Siehe Beispiel 2:

Eine andere Weg wäre einfach die einzelne Werte kopieren, Wert für Wert.
Wenn es nur um wenige Werte handelt wäre dass die einfache Lösung.
 
Es funktioniert zum Beispiel mit PEEK und POKE Befehlen und Offsets allerdings relativ aufwendig und vielleicht auch schlecht von der Zykluszeit(?). Gibt es da keine einfachere Methode?
Du könntest in TEMP alle verschiedenen Strukturen/Datentypen mit AT übereinanderlegen, und dann als ein Typ hineinkopieren und als anderer Typ herauskopieren. Ist vermutlich effizienter als Serialize/Deserialize, Du müsstest aber zweimal kopieren.

Je nachdem, welche unbekannte SPS mit welcher unbekannten TIA-Version Du verwendest, gibt es auch noch weitere Möglichkeiten. Vielleicht kannst Du mit Referenzen arbeiten, vielleicht geht ...?

Um wieviele verschiedene Datentypen/Strukturen geht es denn bei Dir?

Harald
 
Hallo, danke für die Tipps. Habe eine "CPU 1518-4 PN/DP" mit "TIA V17".

Der flexible Speicherplatz ist zwei Arrays [1..44] of Byte (jeweils IN und OUT)
Eine Table sieht zb. so aus
1653305929176.png
 
Ist leider so ein Gemisch, ist die Profinet Schnittstellen Beschreibung des Herstellers.

Möchte dass der FB der die Fügeeinheit ansteuert und damit der Instanz DB optimiert bleiben wenn möglich.
 
Du könntest in TEMP alle verschiedenen Strukturen/Datentypen mit AT übereinanderlegen, und dann als ein Typ hineinkopieren und als anderer Typ herauskopieren.
Wenn ich mir nicht irre, dann geht das AT-Sicht nur für STAT deklarierte Variabeln.
Und wenn die FB als optimiert deklariert ist, muss die Remanenz für die besagte Daten als "In IDB Setzen" eingestellt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist leider so ein Gemisch, ist die Profinet Schnittstellen Beschreibung des Herstellers.
Hat der Hersteller ne Meise? Selbst bei blöden Schnittstellen (ungerade Bytezahl in einem Modul), findet die Adressierung aber mind. in 8-Bit-Blöcken statt.
Bist Du absolut sicher, dass bei der E/A-Adressierung auf 3 Bool ein Byte folgen kann? Wie adressierst Du das Byte? Sind nicht ggf. FüllBools vergeben, so, dass man wenigstens auf 8 Bool und dann ein Byte kommt? Hat der Hersteller vielleicht "vergessen" in seiner Beschreibung die FüllBools anzugeben? Passen die Daten, die Du am E/A-Bereich abfragst?

VG

MFreiberger
 
Am besten bekommst du ein Bibliotek oder Beispielprojekt von der Hersteller, und mit die E/A als Datentypen vorkonfiguriert.

Abgesehen davon, SERIALIZE + DESERIALIZE ist nicht kompliziert.
Wenn man mit das AT-Sicht die Daten sowiso mehrmals kopieren muss, dann ist es mMn nich effizienter.
Ein Vorteil bei SERIALIZE + DESERIALIZE und wenn man die Daten in mehrere Shared-DBs haltet, dann kann man Änderungen machen ohne dass man die gesammte Daten (in die IDB) initialisieren muss. Dann kann man sogar 'bump-less' Änderungen einfügen.
 
Der flexible Speicherplatz ist zwei Arrays [1..44] of Byte (jeweils IN und OUT)
Eine Table sieht zb. so aus
Wie hat der Fremdgerät-Hersteller den Zusammenhang zwischen den Arrays und den Datenstrukturen erklärt? Sind da vielleicht Offsets und Füll-Bools enthalten, die Du in Deinen symbolischen Strukturen aber nicht mit angegeben/deklariert hast? Müsstest Du nicht sowieso (je nach Datensatz-Kennung) jedes Bit und Byte einzeln aus dem Eingangs-Array in Deine symbolischen Strukturen umkopieren? Nochmal: um wieviele verschiedene Strukturen geht es bei Dir?

Ändert sich die Bedeutung der Bits und Bytes im Eingangs-Array tatsächlich zur Laufzeit des Codes?

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Fügeeinheit (Presse) der Firma Tox.


Würdest Du bitte Deine Lösung für andere Suchende zur Verfügung stellen?
;)
Die Lösung ist "CASE ... OF" je nachdem welche Switching table ausgewählt ist. Dann mit SERIALIZE + DESERIALIZE:

1653635020026.png

Die Hilfe von Siemens die JesperMP gepostet hat war dabei sehr hilfreich auch.
 
Da gibts ja einen fertigen Baustein von TOX den man nur beschalten muss… Bei sowas mach ich immer einen Baustein „herum“ der so aussieht wie einer von unseren und intern den Hersteller-FB aufruft
 
Zurück
Oben