TIA Teil eines UDT kopieren

mmm_ams

Well-known member
Beiträge
77
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ihr Lieben,
Euro Hilfe ist hier dringend benötigt.....
in TIA17, 1500er SPS bin ich dabei, einen universalen FB zu schreiben, der die Bauteildaten (UDT) unserer Anlagen verwalten soll. Da bei jeder Anlage unterschiedliche Bauteildaten benötigt sind, soll die Struktur in der FB-Schnittstelle als Variant deklariert werden. Um die grundlegende Funktionen einheitlich zu halten, habe ich einen sozusagen Basis-UDT deklariert, der 4 Byte lang ist und am Anfang jedes Bauteildaten-UDT vorkommen soll.
Nun ist die Herausforderung, die ersten 4 Bytes bzw. diese Basis-Struktur in dem FB in eine temporäre Variable zu kopieren, um die einzelnen Bits in der Basis-Struktur auswerten zu können (Siehe Bild 1). Die einzige Möglichkeit dafür, die ich bis jetzt gefunden habe, ist Serialize/Deserialize, es funktioniert aber immer noch nicht richtig.
Die konkreten Fragen.

1- Kennt jemand eine einfachere Möglichkeit, um das Kopieren (Part.Base --> tmpBase) zu realisieren?

2- Wenn Serialize/Deserialize den einzigen Weg darstellten, brauche ich Hilfe. Beim Testen (Bild 2) gibt die Serialize-Anweisung immer den Fehler 8253 (Erklärung auf Bild 3 ), egal wie groß das Array of Byte "Buffer" ist. Beim letzten Test war Buffer 1024 Byte lang, wobei die umzuwandelnde Struktur 14 Bytes hatte.

Danke euch und Grüße
 

Anhänge

  • 1.JPG
    1.JPG
    47,7 KB · Aufrufe: 36
  • 2.JPG
    2.JPG
    23,2 KB · Aufrufe: 35
  • 3.JPG
    3.JPG
    38,2 KB · Aufrufe: 35
Auf welchem Wert steht der Parameter POS beim Aufruf von Serialize ? Im Screenshot angeblich 1022, dann wäre ja bis 1024 wirklich nicht genügend Platz im Zielarray.
 
Auf welchem Wert steht der Parameter POS beim Aufruf von Serialize ? Im Screenshot angeblich 1022, dann wäre ja bis 1024 wirklich nicht genügend Platz im Zielarray.
Was ich nicht verstehe, Pos hat immer den Wert (Buffer-Array-Länge -2), egal wie ich die Länge ändere
 
Was ich nicht verstehe, Pos hat immer den Wert (Buffer-Array-Länge -2), egal wie ich die Länge ändere
POS ist eine InOut Variante von Serialize. Du legst mit POS am Anfang fest, ab welcher Position im Ausgangs-Array Serialize die Daten aus der Struktur schreiben soll. Anschließend gibt Serialize darin den nächsten "freien" Index zurück. Damit dein Vorhaben funktionieren kann, probiert mal aus POS vor dem Aufruf auf 0 zu schreiben. Dann müsstest du am Ende 15 drin stehen haben (natürlich nur bis zum nächsten Zyklus). Deshalb steht auch bei dir 1022 drin, weil ein paar Zyklen lang immer auf die nächsten 14 Bytes kopiert wird, und dann aber am Ende nicht mehr genug Platz frei ist, um damit weiterzumachen.
 
POS ist eine InOut Variante von Serialize. Du legst mit POS am Anfang fest, ab welcher Position im Ausgangs-Array Serialize die Daten aus der Struktur schreiben soll. Anschließend gibt Serialize darin den nächsten "freien" Index zurück. Damit dein Vorhaben funktionieren kann, probiert mal aus POS vor dem Aufruf auf 0 zu schreiben. Dann müsstest du am Ende 15 drin stehen haben (natürlich nur bis zum nächsten Zyklus). Deshalb steht auch bei dir 1022 drin, weil ein paar Zyklen lang immer auf die nächsten 14 Bytes kopiert wird, und dann aber am Ende nicht mehr genug Platz frei ist, um damit weiterzumachen.
Danke sehr. Das hat tatsächlich geholfen. Mit dem Zurücksetzen von POS funktioniert nun Serialize. Auch Deserialize gibt zwar einen Fehlercode, da ein UDT kann anscheinend nicht teilweise beschrieben werden darf, aber die Werte kommen richtig in der Zielstruktur an.
 
Danke sehr. Das hat tatsächlich geholfen. Mit dem Zurücksetzen von POS funktioniert nun Serialize. Auch Deserialize gibt zwar einen Fehlercode, da ein UDT kann anscheinend nicht teilweise beschrieben werden darf, aber die Werte kommen richtig in der Zielstruktur an.
Leider falsche Aussage von mir... Deserialize geht nicht. Die Anweisung erwartet genug Bytes im Source-Array um den ganzen UDT zu beschreiben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider falsche Aussage von mir... Deserialize geht nicht. Die Anweisung erwartet genug Bytes im Source-Array um den ganzen UDT zu beschreiben

Kannst du nicht die allen Bauteil-UDTs gleichen Daten in einem eigenen UDT zusammenfassen und diesen in allen Bauteil-UDTs als erstes einfügen ? Das wird dann mit Serialize/ Deserialize funktionieren, auch wenn ein vollsymbolischer Ansatz immernoch vorzuziehen wäre.
 
danke an alle, die geholfen haben. Aufgabe gelöst, in dem sowohl der ganze UDT als auch der Base-UDT an den Baustein separat übergeben worden. Würde mich trotzdem interessieren, ob es eine einfache Anweisung gibt, um bestimmte Anzahl an Bytes aus einem UDT zu kopieren
 
Zurück
Oben