LabVIEWForum.de - Array Pointer

LabVIEWForum.de

Normale Version: Array Pointer
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo und frohe Weihnachten!

Ich hab für meinen Kamera (Artray 300MI) ein LabVIEW SDK.
Man kann die Kamera nicht über die USB Treiber vom Vision ansteuern sondern nur über die mitgelieferten VIs.
Man bekommt dan auch kein Bild sondern nur ein Array von 3145728 U32 Elementen (also ziemlich viele).
Das sind dann die Pixelwerte.

Nun mein Probelm:

Das "Snapshot.vi" braucht als Eingang ein Array in welchem es die Pixelwerte dann zurückgibt.
Ich erstell also mal in LV ein Array und häng das da an.
Weiters braucht es einen Eingang mit "size of ArrayPointer".

Soweit ich weiß gibts in Lanview aber keine Pointer auf das Array oder?

Es ginge ja recht einfach sich ein c file zu schreiben, aber wie kann ich meinen eigenen c code in LV einbinden?

Bin für jede Hilfe dankbar weil ich will mit meiner Kamera endlich mal Bilder machen!!!

mfg n00b
Dass ich das jetzt net falsch versteh
-> du hast mitgelieferte VIs vom Kamerahersteller in denen eine DLL verwendet wird und das Snapshot.vi ist eines der mitgelieferten?!

Das sollte dann ganz einfach sein:
Generier dir ein Array mit der Anzahl der benoetigten Elemente (Initialize Array) und schließ an dieses Array eine "Array Size" Funktion an.
Beide Elemente uebergist dann dem Call Libary Function Node -> in dem kannst auch einstellen um welche Uebergabe es sich handelt (bspws: Value oder Pointer to Value)
Das hast du mal richig verstanden!

Der eine Input fürs VI ist ein Pointer aufs Array, also aufs erste Element.
Der zweite Input ist die "size of ArrayPointer" also die Länge des Arrays.

Das Array hat immer genau 3145728 Elemente, alle U32.

Ich erzeug das Array mit Initialize Array und 3145728 Elementen.
Bei size of ArrayPointer häng ich jetzt den Ausgang vom Array Size an.
Im Call library function stell ich Array Data Pointer ein, weil dann is es ja ein Pointer aufs Array, oder?

Das funzt dann aber nicht weil immer irgendeine eigenartige Fehlermeldung wegen des Arrays kommt.
Da steht dann Fail in Snapshot Array.

Der Input fürs VI ist nämlich ein LPBYTE! Das ist soweit ich weiß ein 32 bit langer Pointer aufs Array.
Wie kann ich mir den Pointer in LabVIEW holen?

Das Blockdiagramm des Snpshot VIs kann ich mir leider nicht anschauen weil das Passwortgeschützt ist.

Im Array sollten dann die Pixelwerte stehen, da sind aber nur Nullen weil die Kamera kein Bild liefert solange das Array nicht stimmt, steht im "Manual".

Ist das wenn ich Array Data Pointer bei der Übergabe einstelle ein Pointer aufs erste Element, weil das sollte es sein!?
Und der Speicher fürs Array wird ja beim Initialize automatisch von LabVIEW reserviert oder?

Ich verzweifel bald weil bei der Kamera ist noch dazu jede zweite Beschreibung in japanisch!Pccrash

Vielleicht fällt dir ja noch was ein!?

Danke mal für die ersten Tipps!!!

mfg n00b
' schrieb:Der eine Input fürs VI ist ein Pointer aufs Array,
Einen Ausdruck "Input = Pointer auf Array" gibt es in LabVIEW doch gar nicht. Ob du einen Pointer (worauf auch immer) oder den Datenbereich brauchst, darum kümmert sich der Eingang in ein VI doch selbst. ich mach das immer so: "Erstelle Bedienelement am Eingang" und schon weist du was hin muss.

Zitat:Der zweite Input ist die "size of ArrayPointer" also die Länge des Arrays.
"Size of ArrayPointer" ist nicht die Länge des Arrays. Eigentlich ist "size of ArrayPointer" 32Bit. Ich tippe aber darauf, dass hier nicht die Größe des Pointer gemeint ist, sondern die größe eines Datums im Array also U32. Hast du hier mal "Erstelle Konstante am Eingang" ausprobiert? u.U. kommt da ein Enumerator, in dem auch U32 steht.

Zitat:Ich erzeug das Array mit Initialize Array und 3145728 Elementen.
Würde ich für richtig halten.

Zitat:Bei size of ArrayPointer häng ich jetzt den Ausgang vom Array Size an.
Das aber nicht. Hier tippe ich auf U32.

Zitat:Im Call library function stell ich Array Data Pointer ein, weil dann is es ja ein Pointer aufs Array, oder?
Hat das jetzt was direktes mit deiner Frage zu tun? Du hast doch ein VI und keine DLL? Dann ist diese Frage nicht relevant.

Zitat:Der Input fürs VI ist nämlich ein LPBYTE! Das ist soweit ich weiß ein 32 bit langer Pointer aufs Array.
Ein LPByte ist ein Pointer auf ein Byte, also ein U8 bzw. I8, aber kein Pointer auf ein U32/I32. LPByte beißt sich mit deiner Angabe über U23 für die Breite der Daten.

Zitat:Ist das wenn ich Array Data Pointer bei der Übergabe einstelle ein Pointer aufs erste Element, weil das sollte es sein!?
Ich würde ja sagen, solange LV das Programm überhaupt starten kann und solange da kein Konvertierungspunkt vorhanden ist, muss der Datentyp richtig sein.

Zitat:Und der Speicher fürs Array wird ja beim Initialize automatisch von LabVIEW reserviert oder?
Genau so soll es sein.
Also erst mal danke für die ausführliche Antwort!

Das mit VI und DLL hab ich vielleicht ein bisschen durcheinander gebracht:

Es gibt das ganze als VI, das war beimTreiber dabei. Ich ruf die Funktion aber mit Call library function node auf weil mir das übersichltlicher erscheint und ich da mehr Möglichkeiten hab.
Also ich rede die ganze Zeit von einer Call Library function node. Sorry!

Mit "Input" mein ich einen Eingang am Call library function node, also einen Parameter den ich übergebe. Ich hab das mal als Input bezeichnet weils ja rein kommt.

Das mit dem size of ArrayPointer ist definitiv die Länge des Arrays, weil ich das hetzt in einem anderen Manual so gefunden hab.
Die japanisch - englisch Übersetzung ist echt gewöhnungsbedürftig.

Das mit dem Pointer hat schon was mit meiner Frage zu tun:

Es ist ja eine Call library function node und da kann man als Parameter ein Numeric Array einstellen. Weiters kann man dann wählen ob man Data Pointer oder Pointer to handle usw. übergeben will. Ich brauch da einen Pointer (LPBYTE) auf mein Array.
Das ist auch der einzige Eingang (Parameter) an dem es noch scheitert.
Bei dem size of ArrayPointer bin ich mir schon sicher dass das so stimmt!
Ich muss also dort irgendwie mein vorher erstelltes Array übergeben, in Form eines LPPBYTE und das is ja irgendeine Art von Pointer, oder?

Ich brauch also da ein LPByte auf mein Array bzw. auf mein erstes Byte vom Array. Da geb ich dir aber recht dass das sehr eigenartig ist wenn das Array aus U32 Werten besteht. Aber das Manual zu der Kamera ist sehr lückenhaft und widersprüchlich.

Ich weiß nur sicher:

Es ist ein Array aus U32 Werten
Jeder Wert (jedes Array Element) ist ein Pixelwert
Das Array das rauskommt sollte einem Bitmap entsprechen (da passts ja das jedes Pixel einen Wert hat)
Und der Eingang ist ein Pointer auf den Beginn des Arrays
In einem anderen Manual steht dann noch das der Arraypointer ein LPByte ist. (was auch immer das jetzt genau ist)!

Ich scheitere daran dem Call library function node das Array in richtiger Form zu übergeben.

Im manual steht:

Argument
HACAM // hACam //Handle for camera identification
LPBYTE //lpImage // Address of arrangement for receiving image data
LONG //Size // Arrangement length of lpImage
BOOL // TopDown //Determination of ups and down of image

Ich werd da draus nicht mehr schlau!

Hoffentlich kann mir von euch wer helfen!!!!!!!

mfg und danke n00b
' schrieb:Ich ruf die Funktion aber mit Call library function node auf weil mir das übersichltlicher erscheint und ich da mehr Möglichkeiten hab.
Also DLL - alles klar.

Zitat:Weiters kann man dann wählen ob man Data Pointer oder Pointer to handle usw. übergeben will. Ich brauch da einen Pointer (LPBYTE) auf mein Array.
Ich würde hier mal "Array-Datenpointer" nehmen.

Zitat:HACAM // hACam //Handle for camera identification
Ich gehe mal davon aus, dass dieser Parameter stimmt. Der wenn falsch wäre, ginge schon mal gar nichts.

Zitat:LPBYTE //lpImage // Address of arrangement for receiving image data
Hier muss also das Array angeschossen werden mit Einstellung "Array-Datenzeiger". Ein mit 3145728 Elemente erstelltes U32-Array scheint mir richtig.

Zitat:LONG //Size // Arrangement length of lpImage
Hier kann es aber sein, dass nicht 3145728, sondern 4*3145728 stehen muss. Der Pointer heißt LPByte und nicht LPDWord - das macht mich etwas stutzig.
Danke für die Tipps!!!

Ich hab mal das mit dem create control am Eingang des !!!!!!!VIs!!!!! probiert. Weil in dem fertigen VI ist ja im Prinzip nicht viel anderes drinnen als eine call llibrary function node. Wenn man da eine Control beim Array anhängt, schlägt er ein U8 Array vor.

Damit das ganze dann funktioniert hab ich natürlich 4 mal soviele Elemente (also wie du gerade vermutet hast: die Länge muss 4*3145728 sein.) Wenn ich das mit nem U8 Array mache krieg ich schon Werte!! Die muss ich jetzt nur noch auf U32 zusammenstoppeln damit das mal ein Bild wird!!

Ich denke das sollt ich in nächster Zeit hinkriegen.

Und die Moral von der Geschicht: 3 Manuals gelesen, alle waren eigenartig übersetzt und in jedem stand der selbe Blödsinn,
nämlich [U32]!

In Zukunft probier ich wieder alles mit "try and error"! Schade um die Zeit die man liest.Grrr

Danke nochmal für die Umfagreichen und hilfreichen Tipps!!!!Big Grin

mfg n00b
Referenz-URLs