TIA Schlauchstehen. Arrays in Strukturen unterschiedlicher Grösse kopieren

vollmi

Level-3
Beiträge
5.436
Reaktionspunkte
1.410
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen

Ich steh grad etwas aufm Schlauch.

Gegeben ist ein Array
Code:
      Bauteile : Array[1..10] of Byte;

Das möchte ich jetzt in eine Struktur kopieren
Und diese sind aber immer kürzer als das Array aber doch verschieden lang
Code:
      Sowas : Struct
         int1 : Int;
         realwert : Real;
      END_STRUCT;
Code:
      Sowas_2 : Struct
         int1 : Int;
         realwert : Real;
         dintwert : Dint;
      END_STRUCT;

Ich dachte erst mit Deserialize, aber da darf das Array nur so lange sein das es in die Struktur passt.
Ich möchte aber einfach das er nur soviel kopiert wie reinpasst.

Ziel und Quelle sind in nem optimierten Bereich

mfG René
 
Ich würde das mit einem VARIANT machen machen. Erst die Struktur ermitteln bzw. deren Länge und dann mit einer for Schleife kopieren.
 
Kannst du nicht mit ner Schleife ermitteln wie lange dein Struct ist und dann mittels BLKMOV die Daten reinschreiben? Oder habe ich deine Frage falsch verstanden?

Die Strukturlänge ist bekannt. blockmove funktioniert halt nur im nicht optimierten Bereich. Den wollte ich jetzt aber mal richtig nutzen.
Aber bevor ich anfange das Element für element in ner Schleife zu kopieren, verzichte ich auf die Optimierung.

mfg René
 
Die Strukturlänge ist bekannt. blockmove funktioniert halt nur im nicht optimierten Bereich. Den wollte ich jetzt aber mal richtig nutzen. Aber bevor ich anfange das Element für element in ner Schleife zu kopieren, verzichte ich auf die Optimierung.

mfg René

Bietet die 1500er deshalb nicht die "neue" Funktion MOVE_BLK_VARIANT?

Code:
MOVE_BLK_VARIANT(
SRC := <Operand>,
COUNT := <Operand>,
SRC_INDEX := <Operand>,
DEST_INDEX := <Operand>,
DEST => <Operand>);
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das dachte ich mir auch
Aber krieg ich auch nicht gebacken.
Ich bekomme im Status immer ein
Code:
80B4 : Die Datentypen stimmen nicht überein. Verwenden Sie statt eines ARRAY of <Struct> ein ARRAY of <PLC-Datentyp(UDT)>.

Als source habe ich aber das array und als ziel die Struktur.
Code:
#Status := MOVE_BLK_VARIANT(SRC:= #Rec.Empfangsbereich,                 COUNT:=1,
                 SRC_INDEX:=0,
                 DEST_INDEX:=0,
                 DEST=>"Signalliste".Signal[100].Act_Signalstatus);
 
Ähhh ...
nach meiner Meinung kann dein Vorhaben (erstmal grundsätzlich) sowieso nur im nicht optimierten Bereich - optimiert hast du doch gar keine wirkliche Kontrolle darüber, wie deine Struktur wirklich im Speicher einsortiert ist / wird.
Somit ist das Vorhaben auf der Basis m.E. gar nicht umsetzbar und würde, falls es doch irgendwie funktioniert, bei geringfügigen Änderungen des Datenbereichs möglicherweise gar kein reproduzierbares Ergebnis bringen können ...

Gruß
Larry
 
Ich würde miasmas Vorgehen verwenden:
Ich würde das mit einem VARIANT machen machen. Erst die Struktur ermitteln bzw. deren Länge und dann mit einer for Schleife kopieren.

Halt erst aus der Struktur mit "Serialize" ein Array aus dem UDT machen, dann die Länge davon ermitteln (mit UPPER_BOUND und LOWER_BOUND) und dementsprechend die exakt richtige Anzahl an Bytes kopieren.
 
So ich machs jetzt mit BLKMOV
Code:
#Status :=BLKMOV(SRCBLK := #Rec.Empfangsbereich, DSTBLK => "Signalliste".Signal[100].Act_Signalstatus);

Dazu muss der DB halt nicht optimiert sein, aber die Instanz des ArbeitsFBs darf optimiert sein, ausser hier #Rec Diesen muss ich auf Remanenz im IDB setzen stellen.
So funktionierts tadellos.
So kann ich den grösseren ARRAYBLOCK auf den UDT kopieren. Das was nicht reinpasst wird ignoriert, wie man es sich vom BLKMOV ja gewohnt ist.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es dann nicht einen Unterschied wie die Daten in deinem Array abgelegt werden?
Ich meine bezüglich Bytereihenfolge und Füllbytes bei n.o. und o. DBs.

Ich hätte mir glaub ich pro UDT eine Funktion geschrieben, der die UDT in ein Bytearray ab einer angegebenen Position schreibt. Da hat man dann auch die volle Kontrolle in welcher Reihenfolge die Daten abgelegt werden.
 
Gibt es dann nicht einen Unterschied wie die Daten in deinem Array abgelegt werden?
Ich meine bezüglich Bytereihenfolge und Füllbytes bei n.o. und o. DBs.

Nein das scheint alles wie nicht optimiert abgelegt zu sein. Aber wie gesagt nur wenn man beim Optimierten Bereich angiebt, remanenz im IDB setzen. Dann wird offenbar dieser Teil nicht mehr optimiert abgelegt.

mfG René
 
Zurück
Oben