LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

tchar nicht definiert bei DLL Einbindung

Hallo,

 

ich konnte das Problem lösen. Nun geht es darum dass ich die TESTOEMUSB_OpenBySerialNumber öffnen soll.

Allerdings will er diese ja wegen dem anfänglichen Problem auch nicht öffnen. Diese Datei soll die erhaltene Seriennummer einlesen, und eine Device Nummer ausgeben, die für die späteren Programme als Anhaltspunkt verwendet werden soll.

 

Wie schaffe ich es nun auch den OpenBySerialNumber zu öffnen?

 

Grüße

Fabian

0 Kudos
Message 11 of 24
(1,859 Views)

Meine Kristallkugel ist leider noch immer defekt!! Ich habe absolut keine Idee, wie diese Funktion aussieht und noch viel weniger eine Beschreibung dazu gelesen. Minimal den Prototypen müsste man halt schon kennen und meist ist das nur eingeschränkt genügend, und muss man auch eine Beschreibung der Funktion von dem Programmierer haben. Der C Prototyp teilt einem oft bei weitem nicht genug mit.

Rolf Kalbermatter
My Blog
0 Kudos
Message 12 of 24
(1,857 Views)

Also das Problem ist, das es zu mir hieß, ich solle anhand dieser DLL´s und Header Dateien eine VI ertsellen, mit dem man das Messgerät auslesen kann.

Hier ist das was in der Header Datei steht:

 

// Folgender ifdef-Block ist die Standardmethode zum Erstellen von Makros, die das Exportieren
// aus einer DLL vereinfachen. Alle Dateien in dieser DLL werden mit dem TESTOEMUSB_EXPORTS-Symbol
// kompiliert, das in der Befehlszeile definiert wurde. Das Symbol darf nicht für ein Projekt definiert werden,
// das diese DLL verwendet. Alle anderen Projekte, deren Quelldateien diese Datei beinhalten, erkennen
// TESTOEMUSB_API-Funktionen als aus einer DLL importiert, während die DLL
// mit diesem Makro definierte Symbole als exportiert ansieht.
#ifdef TESTOEMUSB_EXPORTS
#define TESTOEMUSB_API __declspec(dllexport)
#else
#define TESTOEMUSB_API __declspec(dllimport)
#endif

#if defined(__cplusplus)
  extern "C" {          /* Make sure we have C-declarations in C++ programs */
#endif

// error return codes
#define RESULTEMUSB_OK                    0
#define RESULTEMUSB_INVALID_PARAM      -101   // parameter out of range
#define RESULTEMSUB_CONNECT_FAILED     -102   // connection to USB device failed
#define RESULTEMUSB_WRITE_FAILED       -103   // write to device failed

#define DEFAULT_TIMEOUT             2000 // default timeout for read operation in msec

// ProductID of testo (is always 0x128D)
#define PRODUCT_ID_TESTO            0x128D

// VendorID for testo 350_2010 and testo 330_2010
#define VENDOR_ID_TESTO350_CU       0x000E
#define VENDOR_ID_TESTO350_MB       0x000F
#define VENDOR_ID_TESTO330_FL       0x0014
#define VENDOR_ID_TESTO350_CU_DEV   0x100E
#define VENDOR_ID_TESTO350_MB_DEV   0x100F
#define VENDOR_ID_TESTO330_FL_DEV   0x1014

// enumeration
TESTOEMUSB_API int WINAPI TESTOEMUSB_GetNumberOfDevices( unsigned short usVendorID, unsigned int *puDevices );
TESTOEMUSB_API int WINAPI TESTOEMUSB_GetSerialNumber( unsigned int uDeviceNumber, TCHAR* szSerialNumber, unsigned int dwMaxLength );

// open / close connection
TESTOEMUSB_API int WINAPI TESTOEMUSB_OpenBySerialNumber( TCHAR* szSerialNumber, unsigned int* puDeviceID );
TESTOEMUSB_API int WINAPI TESTOEMUSB_Close( unsigned int uDeviceID );
TESTOEMUSB_API int WINAPI TESTOEMUSB_Purge( unsigned int uDeviceID );

TESTOEMUSB_API int WINAPI TESTOEMUSB_SetTimeout( unsigned int uDeviceID, unsigned int dwTimeout );

// read / write
TESTOEMUSB_API int WINAPI TESTOEMUSB_Write( unsigned int uDeviceID, const void * pWrBuffer, int iBytesToWrite );
TESTOEMUSB_API int WINAPI TESTOEMUSB_Read( unsigned int uDeviceID, void *  pRdBuffer, int iBytesToRead, int* piBytesRead );


#if defined(__cplusplus)
  }     /* Make sure we have C-declarations in C++ programs */
#endif

 

Viel herauslesen kann ich da nicht, da ich keine Ahnung von C habe.

 

 

Grüße

Fabian

0 Kudos
Message 13 of 24
(1,853 Views)

Dieser Header ist zwar schon etwas aber grundsätzlich nicht genügend um ihn in welcher Form dann auch (ja auch von einem C Programm aus) ohne viel Trial und Error anzusprechen. Und damit meine ich Trial and Error das im Error Fall meist brutal crasht.

 

Ein paar Beispiele:

 

- Der TCHAR Typ wie schon eher erwähnt ist völlig undefiniert. Nirgends ist ersichtlich dass er von den Windows API Headern importiert wird noch mit welchen Define er evaluiert werden sollte.

 

- Der int Rückgabewert der Funktionen ist nirgends dargelegt. Ist das eine Zahl die 0 ist im Erfolgsfall und alles andere ist ein Errorcode, oder ist es gerade so dass ungleich 0 Erfolg angibt und 0 einen Fehler oder ist es noch irgendwas anderes?

 

- Es gibt auch noch etliche andere Dinge die zwar für jemanden mit Erfahrung in diesem Bereich mit etwas Vermuten ziemlich sicher herzuleiten sind, aber ohne Erfahrung ganz schön in die Hosen gehen kann.

 

Mir scheint es dass hier ein Hardwarehersteller (Testo) gerne einen LabVIEW Treiber für ihr Gerät mit DLL Treiber haben möchte aber es unsinnig erachtet um da jemanden mit Verstand von LabVIEW UND C drauf anzusetzen. Das Resultat solcher Treiber ist grundsätzlich immer dasselbe: Macht sich gut im Verkaufskatalog des Gerätes aber der Kunde der das Gerät unter anderem wegen diesem Treiber kauft wird wahrscheinlich niemals mehr ein Gerät bei diesem Hersteller kaufen und eventuel in verschiedenen Foren um Support fragen weil der Treiber manchmal/oft/immer komische Dinge tut, wie abstürzen und dann auch noch laut verkünden dass sowohl LabVIEW als auch der entsprechende Gerätetreiber nur Müll sind.

Rolf Kalbermatter
My Blog
Message 14 of 24
(1,850 Views)

Okay ich verstehe. Darauf habe ich aber eine Frage: Wenn ein funktionsfähiges Programm bestehen würde, kann es trotzdem vorkommen, dass letzendlich beim Kunden Systemabstürze stattfinden? Also ist es prinzipiell eine schlechte Idee überr DLLs die Messdaten durch LabVIEW auszulesen?

 

Ich habe im Anhang einmal alle Header Dateien hinzugepackt. Das alles besteht prinzipiell, allerdings kann ich damit nur wenig anfangen, da ich ja die Programmiersprache nicht verstehe.

 

Grüße

Fabian

0 Kudos
Message 15 of 24
(1,847 Views)

Nun wenn Du ein bestehendes Programm hast das einmal zuverlässig läuft ist es grundsätlich so dass das immer laufen msollte. Aber:

 

LabVIEW VIs sind dazu da um selber Programme zu schreiben. Und auch der erfahrenste Programmierer kann nicht alle möglichen Anwendungsfälle von späteren Benützern antizipieren und testen. Bei gebastelten Treibern führt das aber schnell mal dazu dass es dann plötzlich doch crasht da bestimmte Funktionen mit Parametern aufgerufen werden die unsinnig sind. Bei einem sauber programmierten Treiber hingegen sind solche Dinge abgefangen und verursachen eine (hoffentlich) sinnvolle Laufzeitfehlermeldung (in LabVIEW typischerweise in einem Errorcluster) die dem Benützer einen Hinweis gibt über den aufgetretenen Fehler, aber ohne das LabVIEW Programm ins Land der Exceptions (crash) zu beförderen.

 

Dieser Treiber ist vom Interface an sich noch einer der einfacheren (obwohl ich mal davon ausgehe dass das Komplizierte eigentlich noch kommen muss, nämlich welche Datenbytes mit Read und Write übertragen werden) aber die ganze Headersammlung in Deinem Post macht das Ganze schon extrem kompliziert. Scheinbar hat dieses Gerät mindestens 3 verschiedene Interfaces die alle verschiedenen APIs haben und Du hast Dich hier auf das USB Interface beschränkt. Ist es vorgesehen um die anderen Interfaces auch noch anzusprechen?

 

Was ist überhaupt das Ziel dieses Projekts? Muss das ein schneller Job sein für die Verwendung innerhalb des Betriebes, etwa zum Erstellen eines Testprogramms in der Fertigung, oder soll das ein Treiber werden für Benützung durch Kunden?

Im ersten Fall kann man mit Gebastel auskommen, da ja der Testingenieur innerhalb des Betriebes ist und nur er sich die Haare ausraufen muss, wenn das Ganze wieder mal crasht, aber im zweiten Fall ist gar kein Treiber besser als ein gebastelter!

Rolf Kalbermatter
My Blog
Message 16 of 24
(1,842 Views)

Ja das wurde mir anfangs auch gesagt, dass es höchstwahrscheinlich komplizierter sein wird. Und das ist nun der Fall.

Im Prinzip beinhaltet dieses TESTOEMUSB alle Header Files. Das heißt alle werden angesprochen.

Im Endeffekt sollte es so aussehen, dass im Hintergrund folgendes abgespielt wird während der Benutzer auf Start drückt:

1. Anzahl der angeschlossenen Geräte erkennen

2. Serialnumber erhalten

3. Aus dieser Serialnumber eine DeviceID erhalten (DeviceID ist für alle weiteren Vorgänge unabdingbar)

Das alles sollte im Hintergrund stattfinden, so dass der Benutzder nur auf Start drückt, und letztendlich die Messdaten vor sich sehen kann.

 

Das ganze Projekt ist für den Kunden gedacht, da eine hohe Anfrage kam ob es nicht möglich wäre, dieses Gerät mit LabVIEW auszulesen.

 

 

Grüße

Fabian

0 Kudos
Message 17 of 24
(1,839 Views)

@Fabi_testo wrote:

Ja das wurde mir anfangs auch gesagt, dass es höchstwahrscheinlich komplizierter sein wird. Und das ist nun der Fall.

Im Prinzip beinhaltet dieses TESTOEMUSB alle Header Files. Das heißt alle werden angesprochen.

Im Endeffekt sollte es so aussehen, dass im Hintergrund folgendes abgespielt wird während der Benutzer auf Start drückt:

1. Anzahl der angeschlossenen Geräte erkennen

2. Serialnumber erhalten

3. Aus dieser Serialnumber eine DeviceID erhalten (DeviceID ist für alle weiteren Vorgänge unabdingbar)

Das alles sollte im Hintergrund stattfinden, so dass der Benutzder nur auf Start drückt, und letztendlich die Messdaten vor sich sehen kann.

 

Das ganze Projekt ist für den Kunden gedacht, da eine hohe Anfrage kam ob es nicht möglich wäre, dieses Gerät mit LabVIEW auszulesen.

 

 

Grüße

Fabian


Das was Du in Punk 1 - 3 beschreibst ist grundsätzlich nicht so schwierig zu machen aber ohne etwas C Kenntnisse dürfte es doch sehr mühsam werden. Der nicht nummerierte Punkt 4 ist aber da wo ohnehin noch sehr viel Arbeit reingesteckt werden muss auch wenn das mit einem funktionierenden Treiber für die DLL vollständig in LabVIEW gemacht werden kann. Punkt 1 - 3 könnte ich tun aber der Rest ist nicht sinnvoll realisierbar da das nur mit verfügbarer Hardware und entsprechender Dokumentation der Protokolldaten machbar ist die mit der Read und Write Funktion übertragen werden.

 

Ein echter LabVIEW Treiber der alle USB Funktionen der DLL verfügbar macht würde mich vielleicht einen Tag Arbeit kosten. Danach kannst Du aber je nach Komplexität der Bytestruktur für die Datenübertragung nochmals etliche Tage investieren um die eigentlich Protokollimplementation zu realisieren.

Rolf Kalbermatter
My Blog
Message 18 of 24
(1,810 Views)

Ich verteile mal ein paar Kudos an Rolf:  Er macht einen erstklassigen Job.

0 Kudos
Message 19 of 24
(1,807 Views)

Hi, the new tobox testo can not be used "friendly" with labview.

You can not import your dll because if you import "testo350SPI.dll", it need "testoEmUSB.dll". and labview get a error "Con not found "testoEmUSB.dll".

In addition, the function are define in several headers, so, you need import the same dll but with differents headers. Lavbiwew only import one header by one dll.

Download All
0 Kudos
Message 20 of 24
(1,601 Views)