(18.06.2014 15:07 )Rizek schrieb: Hallo zusammen,
mithilfe eines Motorola Scanners DS3508 möchte ich ein Bild aufnehmen (jpeg) und dieses für eine Bildverarbeitungssoftware nutzen. Dies soll mithilfe von LABVIEW realisiert werden. Bereits in Achimedes Thema (Achimedes Thema SNAPI DLL einbinden) wurden einige ähnliche Fragestellungen diskutiert.
Die Ansteuerung des Scanners funktioniert mit SNAPI, dazu gibt es bereits eine DLL.
Ich habe auch bereits die vorhandenen Beispiel VI's getestet um mich in das Thema einzuarbeiten.
Die Bildaufnahme ist mir scheinbar gelungen (wenn ich den Piepton des Scanners richtig interpretiere).
Allerdings stellt sich mir jetzt die Frage wie handhabe ich die Übergabe der Bilddaten. Bei SNAPI_SetImageBuffer erhalte ich einen Pointer auf eine Adresse. Doch wie lese ich diese Adresse aus bzw. wie erhalte ich die Datenmatrix des Bildes.
Ein Rätsel ist mir auch wie das Funktioniert mit den Windows Messages. Diese benötige ich um die Signale des Sensors zu interpretieren, wo kann ich aber genaueres dazu lesen?
Ich habe hier mal ein kleines Testprogramm welches ein Bild macht, aber leider kann ich nicht darauf zugreifen. Ich habe ein paar Dinge geändert von Achimedes Programm aber die Windows Messages und die auswertung des Zeigers weiß ich nicht wie das funktioniert.
Ich hoffe ihr könnt mir weiterhelfen!
Viele Grüße
Rizek
Erster Crashgrund: Bei DSNewPtr() allozierst Du einen Pointer mit 50 Byte aber erzählst SNAPI_SetImageBuffer() heiter fröhlich, dass der Buffer 5000 Byte gross ist!!!! Gute Nacht LabVIEW!!!!
Ebenfalls sinnvoll wäre es dann um die Initialize Array Node mit der selben Nummer anzurufen um ein entsprechen grosses Array anzulegen und auch bei MoveBlock() diese Nummer beim 3. Parameter zu verwenden, aber diese Nummer darf sicher nie mehr sein dann was Du in DSNewPtr() an Bytes alloziert hast. Danach sollte man am Ende auch DSDisposePtr() aufrufen, ansonsten produzierst Du ein Speicherleck.
Der Pointer den Du in DSNewPtr() alloziert hast sollte durchgehend in allen Call Library Nodes als Pointer sized Integer definiert sein. Im Momen liefert DSNewPtr() zwar einen Pointer sized Integer zurück aber alle anderen Funktionen verwenden I64. Das geht dann aber in LabVIEW 32 Bit nicht korrekt.
Die Windwos Message Queue Library verwendet momentan Pseudo Refnums für die window Handle (und auch die Message Queue Reference). Aber eine LabVIEW Refnum ist immer 32 Bit gross, ein Windows Handle aber 32 bit unter LabVIEW 32 Bit und 64 Bit unter LabVIEW 64 Bit. Mit der heutigen Windows Message Queue kannst Du also nur unter LabVIEW 32 Bit arbeiten, auch da ich nicht glaube dass die dazugehörende DLL bereits für 64 Bit kompiliert wurde. Aber selbst wenn Du eine 64 Bit DLL hättest ginge es wegen der Verwendung einer LabVIEW Refnum für diese Datentypen ohnehin falsch. Um diese für LabVIEW 64 ko,mpatibel zu machen muss man sowohl die DLL als 64 Bit DLL kompilieren als auch die Queue Reference und die window Handle im Frontpanel als 64 Bit Integer definieren, aber in allen Call Library Nodes überall als Pointer sized Integer definieren.
Zu guter letzt. Die SNAPI ist so gebaut dass sie Dir ein Windows Event schickt wenn ein Scan verfügbar ist. Erst bei Empfang dieser Message macht es Sinn um mit MoveBlock() die Daten aus dem Buffer im Pointer herauszukopieren. Davor ist durch die DLL nichts im Buffer abgelegt, liest Du also die ursrprünglichen Zufallswerte zurück die im Speicher nach Aufruf von DSNewPtr() bereits lagen.