Olympus SDK – GetNextProperty – Labview

Datum: 25.08.2008 Uhrzeit: 17:52:00 Martin Schaffer Hallo liebe Hobbyentwickler unter den Oly-Freunden, nachdem ich erfolgreich die SDK samt mocha.dll erworben habe, wollte ich sofort ein Programm schreiben, um meine Kamera E-510 fernzusteuern. Meine Versionen: Mocha 5.1.1.0 OlyDriverCtrl 2.2.0.2 OlyFirCtrl 2.2.0.2 Vodka 3.2.1.5 Ich habe fröƒÂ¼her Delphi programmiert und bin jetzt aus beruflichen GröƒÂ¼nden LabView-Programmschreiber geworden. Wie so oft ist dabei das Einbinden von DLL’s eine langwierige Sache. Ich habe bereits die Verbindung zur Mocha.dll geschafft. Auch die Abfrage der verbundenen Kameras samt Namensanzeige öƒÂ¼ber Cameramodell funktioniert. Auch weitere Befehle wie der Connect funktionieren. Jetzt wollte ich mit einer Schleife, wie in der Documentation empfohlen, die Parameter der Camera abrufen. die DLL schreibt: 8.3. GetNextProperty Retrieves information about the next property supported by the camera. VC++: void GetNextProperty(ULONG32 lCam, ULONG32 ulIndex, PMOCHA_PROPERTY pInfo) Parameters: ULONG32 lCam ö¢â‚¬â€œ 0 based index of the camera. ULONG32 ulIndex ö¢â‚¬â€œ 0 based index in the list of supported properties. PMOCHA_PROPERTY pInfo ö¢â‚¬â€œ Pointer to a MOCHA_PROPERTY structure. Return: None. Remarks: Loop on this command to retrieve information on all supported commands. Mein Problem ist der Pointer to a MOCHA_Property…“. Eine MOCHA_Property ist laut pdf: 11.1. MOCHA_PROPERTY typedef struct __MOCHA_PROPERTY { const char* strName; INT16 iOpCode; // see appendix INT16 iDataType; // see sec. 5.1 INT16 iFormType; // see sec 5.2 MOCHA_VALUE DefaultValue; UINT16 uiNumValues; } MOCHA_PROPERTY *PMOCHA_PROPERTY; und die dort verwendete Struktur MOCHA_value ist laut pdf: 11.2. MOCHA_VALUE typedef union __MOCHA_VALUE { INT8 i8Value; UINT8 ui8Value; INT16 i16Value; UINT16 ui16Value; LONG32 lValue; ULONG32 ulValue; INT64 i64Value; UINT64 ui64Value; const wchar_t* wstrValue; const char* strValue; } MOCHA_VALUE *PMOCHA_VALUE; Was kommt den bei der DLL-Einbindung im Labview hinten raus. Ist so eine Struktur ein Cluster ? Ich habe es mit einem „Adapt to Type“ probiert und einen Cluster erstellt der genau obigen Anforderungen entspricht. Man sieht die Prozessstruktur in http://img168.imageshack.us/my.php?image=bild1aj2.jpg Das angelegte Cluster sieht man in http://img92.imageshack.us/my.php?image=bild2jb2.jpg Dabei ist MOCHA_Value wieder ein Cluster im Cluster. AnschlieöƒÅ¸end beim AusföƒÂ¼hren des Programm kommt dein ein klares http://img176.imageshack.us/my.php?image=bild3fv2.jpg Kann mir jemand sagen was ich evtl. falsch mache oder wie ich anders die Funktion GetNextProperty aus Labview aufrufe. Ich wöƒEURre föƒÂ¼r jeden Hinweis dankbar. Auch wenn jemand in einer anderen Programmiersprache evtl. bereits mit GetNextProperty gearbeitet hat. Im Voraus Danke Martin“ —————————————————————————————————————————————— Datum: 25.08.2008 Uhrzeit: 19:53:46 Helge Suess Hallo Martin! > … und bin jetzt aus beruflichen > Gründen LabView-Programmschreiber geworden. Also erst einmal vorweg. Ich bin LabView Spezialist. Ich weiss wie man es buchstabiert 🙂 Als Ausgleich dafür kann ich die C++ Syntax korrekt interpretieren. Gemeinsam schaffen wir das schon. > Wie so oft ist dabei das Einbinden von DLL’s eine langwierige > Sache. Das Problem liegt immer in der Beschreibung der Parameter. Die meisten Beispiele zeigen nur recht einfache Aufrufe und wenn’s ans Eingemachte geht hift das Beispiel in der Regel wenig 🙁 > 8.3. GetNextProperty > void GetNextProperty(ULONG32 lCam, ULONG32 ulIndex, > PMOCHA_PROPERTY pInfo) > Parameters: > ULONG32 Ein an sich trivialer Parameter, mit einem 32bit Ganzzahlwert (nur positiver Wertebereich). Wenn nur positiv nicht drin ist dann muss man dran denken dass ganz grosse Zahlen als negative Werte abgebildet werden. Wichtig ist erst einmal 32bit. > PMOCHA_PROPERTY pInfo = “ Pointer to a MOCHA_PROPERTY > structure. So weit noch klar? Hier handelt es sich um eine Referenz auf einen Datenbereich also die Adresse des Bereiches. Die Funktion füllt diesen Speicherbereich mit Daten. > Mein Problem ist der „Pointer to a MOCHA_Property…“. Pointer sind sehr oft ein Problem wenn eine Sprache sowas nicht direkt unterstützt. Dann muss man mit Tricks arbeiten. Um das aufzulö¶sen brauchen wir mehrere Dinge. Erst einmal einen Speicherbereich der die Struktur selbst abbildet. Dieser besteht aus den in der Deklaration genannten Komponenten. > 11.1. MOCHA_PROPERTY > typedef struct __MOCHA_PROPERTY { > const char* strName; ein 32bit Pointer auf eine ANSI Zeichenkette (mit einem 0 byte abgeschlossen). > INT16 iOpCode; // see appendix 16bit Ganzzahl > INT16 iDataType; // see sec. 5.1 16bit Ganzzahl > INT16 iFormType; // see sec 5.2 16bit Ganzzahl > MOCHA_VALUE DefaultValue; trickreich. Das ist ein 64bit Wert der je nach dem Wert von iDataType eine andere Bedeutung und Interpretation hat. Die Aufzählung als „union“ bedeutet nur dass alle hier vereinigten Datentypen den gleichen Speicherplatz verwenden. DIe Grö¶sse richtet sich nach dem maximalen Platzbedarf einer Einzelkomponente und das ist hier 64bit. Hat so ein Wert eine 16bit oder 32bit Bedeutung dann ist das immer vom niederwertigsten Bit her abgelegt. Ein Pointer auf „DefaultValue“ trifft also immer den Wert. Es gelten halt einmal 16 32 oder 64bit. Der Wert kann auch ein Pointer auf eine ANSI oder Unicode Zeichenkette sein. Diese ist mit einem Zeichenwert von 0 8bit bei ANSI und 16bit bei Unicode abgeschlossen. > UINT16 uiNumValues; Das ist ein Zähler der unterschiedliche Bedeutung hat. > } MOCHA_PROPERTY *PMOCHA_PROPERTY; Jetzt sind wir in Summe auf einem Datenbereich von zumindest 18 byte. Steht weniger zur Verfügung wird der Bereich danach einfach überschrieben. Das kann fatal sein. Ich nehme einmal an dass ein CLUSTER eine zusammengehö¶rige Sammlung von Daten ist. Wenn das stimmt dann ist ein Cluster hier richtig. Ein ganz kleines Problem haben wir eventuell noch. Die Ausrichtung von seinen Elementen an bestimmten Speicheradresssgrenzen. Das ist nämlich nicht immer und überall gleich. Unter dem Begriff „alignment“ findest du eventuell dazu Infos. Viele Prozessoren arbeiten effizienter wenn Daten auf bestimmte Adressgrenzen ausgerichtet sind (gerade Adressen durch 4 16 etc. teilbare Adressen). Das kann bei kleineren Variablen zu unsichtbaren Lö¶chern zwischen den Daten führen. Die Folge: die DLL schreibt wo hin und LabView liest woanders obwohl es so aussieht als ob beide das Gleiche meinen. Umgehen kann man sowas nur indem man ein byte-array (zusammenhängende Menge von byte-grossen Variablen) definiert. Diese sind in der Regel in einem zusammengehö¶rigen Speicherblock dicht gepackt abgelegt. Den Zugriff muss man dann selbst erledigen. Einzelne mehrbyte-Werte aus den Bytes zusammenbasteln. > und die dort verwendete Struktur MOCHA_value ist laut pdf: > 11.2. MOCHA_VALUE > typedef union __MOCHA_VALUE { das ist wie gesagt nur eine 64bit Variable. Je nach Bedeutung ist sie als einer der Datentypen zu interpretieren. > INT8 i8Value; 8bit im Bereich -127 bis 128 > UINT8 ui8Value; 8bit von 0 .. 255 > INT16 i16Value; 16bit von -32767 bis 32768 > UINT16 ui16Value; 16bit von 0 .. 65535 > LONG32 lValue; 32bit von -2147483647 .. 2147483648 > ULONG32 ulValue; 32bit von 0 .. 4294967295 > INT64 i64Value; > UINT64 ui64Value; …. u.s.w. > const wchar_t* wstrValue; Pointer auf eine Unicode Zeichenkette (16bit pro Zeichen) > const char* strValue; Pointer auf eine ANSI Zeichenkette (8bit pro Zeichen) > } MOCHA_VALUE *PMOCHA_VALUE; Alles zusammen nur 64bit. > Was kommt den bei der DLL-Einbindung im Labview hinten raus. Ist so > eine Struktur ein Cluster? Ich nehme das einmal an. Du musst aber Speicherplatz dafür reservieren. Die DLL bekommt die Adresse des Speicherplatzes als Parameter und weiss somit wohin das Ergebnis geschrieben werden muss. Wie das „als Adresse übergeben“ in LabView funktioniert weiss ich nicht. Es kann sein dass du den Parameter dazu als „pointer to value“ kennzeichnen musst. Das solltest du in der Hilfe finden. > Ich habe es mit einem „Adapt to Type“ probiert und einen Cluster > erstellt der genau obigen Anforderungen entspricht. Das kann ins Auge gehen weil LabView eventuell noch Zusatzinfos zum Typ ablegt. Lieber einfach die Daten nachher selbst nach Typ unterschiedlich behandeln. > Dabei ist MOCHA_Value wieder ein Cluster im Cluster. Anschließend > beim Ausführen des Programm kommt dein ein klares … Bis auf den Cluster im Cluster sollte es passen. Für den Anfang ein einfaches „unsigned quad“ und es sollte keinen Ärger geben. > Kann mir jemand sagen was ich evtl. falsch mache oder wie ich > anders die Funktion GetNextProperty aus Labview aufrufe. Der wichtige Punkt ist die Übergabe der Adresse des Clusters und nicht des Clusters selbst. > … Auch wenn jemand in einer > anderen Programmiersprache evtl. bereits mit GetNextProperty > gearbeitet hat. Aus C++ heraus habe ich das schon erfolgreich getan. Wichtig ist auch dass du den Index (2. Parameter) nur bis zum Ergebnis von GetNumProperties() laufen lässt. Diese Funktion liefert die Anzahl der Properties. Der hö¶chste erlaubte Index ist also 1 weniger. Wirklich spassig werden aber erst die Bilder. Kann LabView eigentlich mit TWAIN Bildquellen umgehen? Dann kö¶nntest du einfach meinen TWAIN Treiber für E-System Kameras verwenden und hast einigen Ärger umgangen. Helge ;-)=) 9 posted via https://oly-e.de“ ——————————————————————————————————————————————