TIA Variabler Bausteineingang

Matthias_1.11

Level-2
Beiträge
51
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich versuche gerade einen universellen Baustein zum beschreiben eines Arrays zu erstellen.
Die Aufgabe dieses Bausteins ist es die Daten am Eingangsparameter in ein Array of Byte[] abzuspeichern.

Bei mir sieht es zurzeit folgendermaßen aus:
Ein FB mit einem Eingang des Datentyps Variant. Am Anfang wird abgefragt welcher Datentyp hier angehängt wurde (mit der Funktion EQ_Type).
Wenn ein gültiger Datentyp (zurzeit sämtliche Ganzzahlen-Datentypen und Real) am Eingang hängt, dann wird dieser Wert in ein DWord gemoved und
anschließend mit Hilfe des Serialize Befehls in das Array geschrieben.

Jetzt ist mir aber aufgefallen, dass wenn ich eine einfache Ganzzahl (z.B.: Int) anhänge, die ersten beiden Indexe des Arrays frei bleiben und der Wert erst an die 3 Stelle (wenn negativ) bzw. 4 Stelle und folgend geschrieben wird.
Wird ein Real drangehängt so wird die Zahl sofort in Index 0 angehängt.

Jetzt wollte ich fragen ob jemand weiß wodurch dieses Verhalten auftritt und wie ich es beheben kann (am besten ohne dass ich die Zahl zunächst in ein zweites Array speichere und die Zahl von dort aus in das richtige umspeichere).
Außerdem wollte ich nachfragen ob es einen besseren Weg gibt abzufragen, welchen Datentyp der Variant Eingang besitzt.

Anmerkung:
1200er Steuerung
TIA V17

Mit freundlichen Grüßen
Matthias
 
Was ist denn das Fehlverhalten?
Worin unterscheidet sich das gewünschte Ergebnis vom tatsächlichen Ergebnis?

Ein Int hat 16 Bit und ein DWord hat 32 Bit.
Indem du das Int in das DWord schreibst, beschreibst du in dem Fall nur die niederwertige Hälfte des DWords und die restlichen Bits bleiben 0.
Wenn du dein Int groß genug wählst(>=256), wird sicher auch dein Byte 3 beschrieben, da somit nicht nur das niederwertige Byte vom Int benutzt wird.
Mit serialize wird das komplette DWord in das Byte-Array geschrieben, was eben 4 Bytes sind.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
OK danke für die Antwort, habe daran irgendwie nicht gedacht.

Wie schaffe ich es jetzt, dass die höherwertigen Bits nicht geschrieben werden (heißt nur die Bytes, die auch wirklich verwendet werden).
Vermutlich schaffe ich das nicht mit dem Serialize Befehl oder?
 
Was ist denn der Hintergrund deines Treibens?

Was kann Serialize nicht schon von selber, was in deinem universellen Baustein nötig ist?
Du kannst an Serialize alle elementaren Datentypen, UDTs, und Arrays dieser Datentypen anhängen und schreibt es dir in das Ziel Array.
 
Zurück
Oben