TIA Move_blk_variant falscher parameter in count?

vollmi

Level-3
Beiträge
5.700
Reaktionspunkte
1.635
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Ich wollte das erste mal die Funktion MOVE_BLK_VARIANT nutzen, krieg das irgendwie nicht hin.


Code:
#Status := MOVE_BLK_VARIANT(SRC := #comCouple.Rec.Empfangsbereich, COUNT := #Tel_lenght_move, SRC_INDEX := #rec_index * 20, DEST_INDEX := 0, DEST => "Signalliste".Signal[#index].last_recv[0].Tel);

Status = int
#comCouple.Rec.Empfangsbereich = array[0.257 of byte]
#Tel_lenght_move = Constant UDINT = 8
rec_index = int
"Signalliste".Signal[#index].last_recv[0].Tel = struct in nicht optimiertem bereich. 10 Byte lang

Als status kriege ich 16#8281 was ja auf einen fehler in der längenangabe hinweist. Aber ich sehe da grade keinen fehler. die länge ist ja sogar kürzer. es ist ein UDINT wie in der hilfe angegeben.
die variable als temp und initialisiert bringt denselben fehler. Habt ihr da ne idee?
 
Hallo Vollmi,

ich habe den Baustein auch noch nie verwendet, ich hab also auch nur die Hilfe gelesen.

8281 heißt ja dass der Wert bei COUNT falsch ist. In der Hilfe steht bei COUNT:
Geben Sie dem Parameter COUNT den Wert "1", wenn am Parameter SRC oder am Parameter DEST kein ARRAY angegeben ist.

Jetzt könnte man sagen, dass du bei DEST kein Array angegeben hast (ist ja nur ein Element). Wie du dann die 8 Byte in dein Struct bekommen sollst ist mir dann allerdings auch schleierhaft...

gruß Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das scheint tatsächlich so zu sein das beide seiten dann ein Array sein müssen. Das ist ja wieder lustig.
Hab jetzt mal drumrumgebastelt.
Code:
                        #Status := MOVE_BLK_VARIANT(SRC := #comCouple.Rec.Empfangsbereich, COUNT := 10, SRC_INDEX := #rec_index * 20, DEST_INDEX := 0, DEST => #Telegramm);
                        #status_2 :=  BLKMOV(SRCBLK := #Telegramm, DSTBLK => "Signalliste".Signal[#index].Act_Signalstatus);

Telegram ist jetzt ein 10 Byte Temp Array. das ich mit BLKMOV kopieren kann.

Also ist MOVE_BLK_VARIANT wohl nur dazu gedacht irgendwo aus einem array irgendwohin in ein Array zu kopieren.
gibts ne elegantere Möglichkeit irgenwo aus einem Array eine menge an daten zu holen und in ein Struct zu verfrachten?

mfG René
 
Moin vollmi,
um ein Byte-Array in eine Struktur zu kopieren gibt es ja den Deserialize.
Naja ich will halt aus einem array of bytes. an einer errechneten stelle 10 bytes rausholen und in eine struktur kopieren.
also eigentlich das was ich zuvor mit Pointern gemacht habe. Ich wollte es jetzt aber vollsymbolisch umsetzen damit die Querverweisliste sinn macht idealerweise hätte ich es gerne komplett optimiert gemacht.

also aus einem Array[0.256] of bytes. Ab Byte 20, 10 bytes am stück holen und in Struktur x kopieren. Sowohl Array wie auch Struktur x im optimierten Speicherbereich.
 
wenn mich nicht alles täuscht, dann kannst du doch beim Deserialize den Eingang POS mit einem errechneten Wert beschalten :confused:

Da bin ich noch nicht so ganz dahintergestiegen wie das funktioniert. POS ist ja ein INOUT also müsste der ja auch was zurückbringen (also kann es ja nicht nur der startpunkt sein den ich vorgebe, da würde ja ein IN langen). Soll ich dann einen wert errechnen diesen auf ne Temp schreiben damit ich sie an INOUT hängen kann? Was kann ich mit dem wert lesend machen?

mfG rené
 
Hinein gibst du den Start-Index ab dem du kopieren willst und heraus kommt der Index bis zu dem deserialisiert wurde. Das ist quasi die Laufvariable die im Baustein verwendet wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hui cool. Das funktioniert. schade das man dafür trotzdem ne zweite codezeile und ne temporäre variable braucht um POS zu beschalten. die indexvariable meiner while schleife kann ich ja auch nicht nehmen, weil deserialize dann diese verändern würde.

find ich n bisschen doof. aber seih's drum.
 
Zurück
Oben