LabVIEWForum.de - Problem bei Struct Einbindung wie in C/C++

LabVIEWForum.de

Normale Version: Problem bei Struct Einbindung wie in C/C++
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen.
Derzeit beschäftige ich mich mit Feldbuskarten der Firma Hilscher.
Über diese möchte ich einen Datenaustausch mit verschiedenen Geräten herstellen.
Eine zugehörige .dll Datei beseitze ich, die ich in LabView mit einen Call Library Function Node aufrufe.
Einige Methoden kann ich auch aufrufen, nur leider scheitert es an den structs.
Ich habe im Forum schonmal gelesen, dass dies mit Clustern realisierbar wäre.
In dem Funtion Node habe ich die Routine "xDriverGetInformation" aufgerufen und entsprechend parametrisiert. Das letzte Argument referenziert ja auf die DRIVER_INFORMATION structure. Da möchte ich nun die Daten "abDriverVersion" und "ulBoardCnt" rausziehen.
Nur leider bin ich bis jetzt zu keinem Erfolg gekommen.
Unten habe ich mal die oben erläuterte Methode die ich z.B aufrufen möchte aufgeführt.
Kann mir bei diesem Problem jemand auf die Sprünge helfen?
Vielen Dank



xDriverGetInformation
This function retrieves all driver specific information, like version number, build date, etc.

Function call:
int32_t xDriverGetInformation(CIFXHANDLE hDriver ,uint32_t ulSize, void* pvDriverInfo)

Arguments:
Argument | Data type | Description
hDriver | CIFXHANDLE | Handle returned by xDriverOpen
ulSize | uint32_t | Size of the passed structure
pvDriverInfo | void* | Pointer to a DRIVER_INFORMATION structure, to place returned values in.

Return Values:CIFX_NO_ERROR if the function succeeds.
If the function fails, a nonzero error code from chapter Error Codes from page 100 is returned. You
can use the function xDriverGetErrorDescription() to get a description of this error.

Example:
DRIVER_INFORMATION tDriverInfo = {0};
int32_t lRet = xDriverGetInformation(NULL, sizeof(tDriverInfo), &tDriverInfo);
if( lRet == CIFX_NO_ERROR)
{
}

DRIVER_INFORMATION
Argument | Data type | Description
abDriverVersion | uint8_t[32] | Human readable driver name and version
ulBoardCnt | uint32_t | Number of handled boards

lv12_img
(23.04.2013 08:19 )raverel schrieb: [ -> ]DRIVER_INFORMATION
Argument | Data type | Description
abDriverVersion | uint8_t[32] | Human readable driver name and version
ulBoardCnt | uint32_t | Number of handled boards

It's very simply. The abDriverVersion variable is a fixed size array. As such it is equivalent to a structure containing the fixed size (32) elements if uint8. So you can easily create that structure in LabVIEW by creating a cluster that contains another cluster with 32 unsigned integers of 8 bit size, followed by an unsigned integer of 32 bits. If these two parameters are all elements inside the structure you are done.

Now configure the parameter in the Call Library Node as Adapt to Type and connect a constant of this cluster to the left terminal. Now you have to convert the byte cluster inside the cluster that comes out of the right terminal into an array of bytes and then from there into a String. Do a Pattern Match on a \0 Character and display the String that is before the match and you are done.
Vielen Dank schonmal.
Ich habe es nun einmal probiert. Leider komme ich so zu keinem Erfolg.
Anbei befindet sich ein Screenshot meines Vi`s.
lv12_img
(23.04.2013 15:37 )raverel schrieb: [ -> ]Vielen Dank schonmal.
Ich habe es nun einmal probiert. Leider komme ich so zu keinem Erfolg.
Anbei befindet sich ein Screenshot meines Vi`s.
lv12_img

Und was funktioniert nicht? Crash oder einfach kein String oder was? Im Falle einse Crashes bist Du sicher dass Du die richtige Calling Convention verwendest?

Übrigens hatte ich es über \0 als Parameter zu Match Pattern. Das ist ein Backslash vor der 0 und um das so wie es gemeint is einführen zu können muss die entsprechende Stringkonstant auf "Display \-Codes" umgestellt werden.

Ausserdem sprachen wir über 32 8bit Integers, nicht 33 und es müssen 8 Bit sein, nicht irgendwas anderes (Vielleicht hast Du das richtig aber im Pict kann man das nicht sehen). Darum ist es sowieso immer sinnvoller um das VI anzuhängen statt eines Pictures.
Ja stimmt. Hab mich wohl etwas verzählt in dem ClusterBlush
Habe nunmal beide VI`s gepostet.
Einmal das VI Driver Open. Was sozusagen mein Haupt VI vorläufig sein soll und das Sub VI xDriverGetInformation was die structure enthält.
Als Fehler Meldung bekomme ich "IOControl call failed" was vermutlich andere Gründe hat. Aber mir ging es generell erstmal darum, wie es möglich ist mittels LabView ein struct auszulesen.
lv12_img
Hey.
Mit deiner Lösung hat es geklappt.
Der "IO" Fehler beruhte auf einen Fehler meinterseits bzgl. einer fehlerhaften übergabe eines Datenpointers.
Vielen Dank
Referenz-URLs