LabVIEWForum.de
array of cluster? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: array of cluster? (/Thread-array-of-cluster--19860)



array of cluster? - THL - 31.08.2011 09:58

Hallo,

ich habe eine leider sehr schlecht dokumentierte DLL vorliegen, bei der ich bei einem Funktionsaufruf nicht weiterkomme und hoffe, dass mir hier jemand auf die Sprünge helfen kann (bin leider nicht so firm in C). Aus der DLL-Dokumentation:
Code:
PositionerCheck
Determines number of connected positioners and their respective hardware ids.
Parameter
   Return value [out] Number of available positioners.
   PositionerInfo [out] Array of structure PositionerInfo. It contains the hardware id for unlocked devices.
                        Connected devices are marked as locked.
Ist natürlich sehr vielsagend... darum mal weiter in der Dokumentation gewühlt und das folgende in der .h-Datei gefunden:
Code:
struct PositionerInfo{
  int id;
  bool locked;
};

NCB_API Int32 PositionerCheck( PositionerInfo** posInfo );
Sieht für mich (in LabView-Terminologie) nach einem Array of Cluster aus - aber wie übergibt man so etwas an eine DLL?

Bei dem Gerät war auch ein *hust* LabView-Treiber dabei, der nichts weiter als eine Library der DLL-Aufrufe beinhaltete. Leider sieht dieser Treiber sehr nach "mit der heissen Nadel gestrickt" aus: Ich habe da schon (bei anderen Aufrufen) einige gravierende Fehler entdeckt, so dass ich denke, dass die Implementierung dieses Funktionsaufrufes ebenfalls falsch ist (siehe Bild unten). Dort wird ja nur 1 Cluster übergeben, was ja anscheinend der oben aufgeführten Dokumentation widerspricht.

Jemand eine Idee, was nun richtig ist?


RE: array of cluster? - BeFu - 31.08.2011 13:57

(31.08.2011 09:58 )THL schrieb:  Hallo,
...
Parameter
Return value [out] Number of available positioners.
PositionerInfo [out] Array of structure PositionerInfo. It contains the hardware id for unlocked devices.
Connected devices are marked as locked.
[/code]
Ist natürlich sehr vielsagend... darum mal weiter in der Dokumentation gewühlt und das folgende in der .h-Datei gefunden:
Code:
struct PositionerInfo{
  int id;
  bool locked;
};

NCB_API Int32 PositionerCheck( PositionerInfo** posInfo );
Sieht für mich (in LabView-Terminologie) nach einem Array of Cluster aus - aber wie übergibt man so etwas an eine DLL?
...

Hallo THL,

gemäß dem Tutorial http://www.labviewforum.de/DLL-einbindung-t5504.html musst Du in LabVIEW den Speicher allokieren, der von der aufgerufenen DLL-Funktion benötigt wird. Also in Deinem Fall ein 1D-Arry mit ausreichend out für value[out] vom Typ int.

Nach meiner Meinung kannst Du die Aufgabe wie folgt lösen.

1. Laut dem oben genannten Tutorium musst Du z.B. in C eine Wrapper-Funktion schreiben, welche die Datentypen des zurückgelieferten Funktionsparamenters struct PositionerInfo in int id[out] und bool (unsigned int) locked[out] zerlegt.

2. Von LabVIEW aus kannst Du dann mittels "Knoten zum Aufruf externer Bibliotheken" mit in LabVIEW initialisierten 1D-Feldern int id[out] und unsigned int locked[out] auf die von der Wrapper-Funktion gelieferten Felder zugreifen.

Ich hoffe, mein Ansatz und das beigefügte VI (LV 8.5 <-- wird nun automatisch erkanntRolleyes) zur Allokation des benötigten Speicherplatzes in LV sind nicht ganz verkehrt.

Schöne Grüße,

BeFu


RE: array of cluster? - THL - 01.09.2011 08:44

Danke für die Antwort. Sowas wie einen Wrapper hatte ich befürchtet und gehofft, dass es irgendwie direkt mit LabView-Bordmitteln geht, da ich hier keinen C-Compiler zur Verfügung habe.


RE: array of cluster? - BeFu - 01.09.2011 12:11

(01.09.2011 08:44 )THL schrieb:  Danke für die Antwort. Sowas wie einen Wrapper hatte ich befürchtet und gehofft, dass es irgendwie direkt mit LabView-Bordmitteln geht, da ich hier keinen C-Compiler zur Verfügung habe.

Hallo THL,

von Kollegen wurde mir der kostenlose (auf GNU-Compiler aufsetzende) MS Windows taugliche Compiler von http://www.mingw.org empfohlen.

Viel Erfolg damit,

BeFu