Seite 1 von 1

Velleman EDU05

Verfasst: 7. Mai 2015 10:31
von GGStefan
Hallo an alle,

ich würde gerne mein EDU05 (https://www.velleman.eu/products/view/?id=405282) verwenden und dazu mir ein eigenes Programm mit QT 5.4 erstellen. Bisher hatte ich immer von den Herstellern zum Einbinden eine LIB-Datei und die entsprechenden Header-Dateien. Velleman liefert ja nur eine DLL mit. Funktioniert es auch mit der DLL? Wenn ja wie?

GGStefan

Re: Velleman EDU05

Verfasst: 7. Mai 2015 17:48
von Christian81
Header, Libs und eine API-Dokumentation sollten schon mitgeliefert werden, aber was hat das mt Qt zu tun?

Re: Velleman EDU05

Verfasst: 7. Mai 2015 19:42
von veeman
Offensichtlich gibt es keine richtigen Header und Lib Dateien zu der Dll. Jedoch sind die Prototypen der Funktion bekannt, von daher kannst du diese Dynamisch laden und ausführen.

Re: Velleman EDU05

Verfasst: 9. Mai 2015 18:19
von GGStefan
Hallo Christian81,

das dachte ich auch, ist aber leider nicht so. Antwort von Support Velleman "I'm sorry, only the DLL available for the EDU05." Mit QT hat das nichts direkt zu tun!

Hallo veeman,

wie komme ich an die Prototypen und wie macht man das mit dem Dynamisch laden? Hast Du eventuell ein Beispiel dafür?

Gruß GGStefan

Re: Velleman EDU05

Verfasst: 10. Mai 2015 14:32
von veeman
In dem zur Verfügung gestellten Package findet man zum Beispiel folgende importtabelle die in Pascal geschrieben ist:

Code: Alles auswählen

function OpenDevice: integer; stdcall; external 'EDU05D.dll';
procedure CloseDevice; stdcall; external 'EDU05D.dll';
function Connected: boolean; stdcall; external 'EDU05D.dll';
function ReadAnalogChannel(Channel: integer):integer; stdcall; external 'EDU05D.dll';
function ReadAllDigital: integer; stdcall; external 'EDU05D.dll';
procedure SetPWM(Channel: integer; Data: integer); stdcall; external 'EDU05D.dll';
procedure InOutMode(IOMode: integer);stdcall;  external 'EDU05D.dll';
procedure OutputAllDigital(Data: integer);stdcall;  external 'EDU05D.dll';
procedure ClearAllDigital; stdcall; external 'EDU05D.dll';
procedure SetAllDigital; stdcall; external 'EDU05D.dll';
procedure ClearDigitalChannel(Channel: integer); stdcall; external 'EDU05D.dll';
procedure SetDigitalChannel(Channel: integer); stdcall; external 'EDU05D.dll';
procedure LCDInit; stdcall; external 'EDU05D.dll';
procedure LCDClear; stdcall; external 'EDU05D.dll';
procedure LCDWriteString(Data: PChar; Position: integer); stdcall; external 'EDU05D.dll';
procedure StartupDemo(onoff: integer); stdcall; external 'EDU05D.dll';
function ReadBackStartupDemo: boolean; stdcall; external 'EDU05D.dll';
Mit Hilfe dieser kannst du nun deine Funktionspointer in C/++ definieren und mittels LoadLibrary und GetProcAddress die Bibliothek laden.

Re: Velleman EDU05

Verfasst: 10. Mai 2015 18:09
von GGStefan
Hallo veeman,

danke für deine Hilfe, scheint aber für mich wohl ein wenig zu hoch zu sein. Da habe ich wohl Pech mit dem EDU05, wird wohl in die Kiste wandern und Gut ist. Was Velleman sich da unter einem USB Tutor Modul vorstellt ist wohl nicht ganz das was ich dachte, Schade.

Gruß GGStefan

Re: Velleman EDU05

Verfasst: 10. Mai 2015 22:37
von veeman
Na so schwer ist das nicht (nicht getestet):

EDU05.h

Code: Alles auswählen

#ifndef _EDU05D_H_
#define _EDU05D_H_

bool eduInitLibrary();

int eduOpenDevice();
void eduCloseDevice();
bool eduConnected();
int eduReadAnalogChannel(int Channel);
int eduReadAllDigital();
void eduSetPWM(int Channel, int Data);
void eduInOutMode(int IOMode);
void eduOutputAllDigital(int Data);
void eduClearAllDigital();
void eduSetAllDigital();
void eduClearDigitalChannel(int Channel);
void eduSetDigitalChannel(int Channel);
void eduLCDClear();
void eduLCDWriteString(char *PData, int Position);

#endif // _EDU05D_H_
EDU05.cpp

Code: Alles auswählen

#include <Windows.h>
#include "EDU05D.h"

typedef int(__stdcall *POpenDevice)();
typedef void(__stdcall *PCloseDevice)();
typedef bool(__stdcall *PConnected)();
typedef int(__stdcall *PReadAnalogChannel)(int Channel);
typedef int(__stdcall *PReadAllDigital)();
typedef void(__stdcall *PSetPWM)(int Channel, int Data);
typedef void(__stdcall *PInOutMode)(int IOMode);
typedef void(__stdcall *POutputAllDigital)(int Data);
typedef void(__stdcall *PClearAllDigital)();
typedef void(__stdcall *PSetAllDigital)();
typedef void(__stdcall *PClearDigitalChannel)(int Channel);
typedef void(__stdcall *PSetDigitalChannel)(int Channel);
typedef void(__stdcall *PLCDClear)();
typedef void(__stdcall *PLCDWriteString)(char *PData, int Position);

POpenDevice pOpenDevice = 0;
PCloseDevice pCloseDevice = 0;
PConnected pConnected = 0;
PReadAnalogChannel pReadAnalogChannel = 0;
PReadAllDigital pReadAllDigital = 0;
PSetPWM pSetPWM = 0;
PInOutMode pInOutMode = 0;
POutputAllDigital pOutputAllDigital = 0;
PClearAllDigital pClearAllDigital = 0;
PSetAllDigital pSetAllDigital = 0;
PClearDigitalChannel pClearDigitalChannel = 0;
PSetDigitalChannel pSetDigitalChannel = 0;
PLCDClear pLCDClear = 0;
PLCDWriteString pLCDWriteString = 0;

bool eduInitLibrary()
{
   HMODULE hMod = LoadLibrary(TEXT("edu05d.dll"));

   if (hMod)
   {
      pOpenDevice = (POpenDevice)GetProcAddress(hMod, "OpenDevice");
      pCloseDevice = (PCloseDevice)GetProcAddress(hMod, "CloseDevice");
      pConnected = (PConnected)GetProcAddress(hMod, "Connected");
      pReadAnalogChannel = (PReadAnalogChannel)GetProcAddress(hMod, "ReadAnalogChannel");
      pReadAllDigital = (PReadAllDigital)GetProcAddress(hMod, "ReadAllDigital");
      pSetPWM = (PSetPWM)GetProcAddress(hMod, "SetPWM");
      pInOutMode = (PInOutMode)GetProcAddress(hMod, "InOutMode");
      pOutputAllDigital = (POutputAllDigital)GetProcAddress(hMod, "OutputAllDigital");
      pClearAllDigital = (PClearAllDigital)GetProcAddress(hMod, "ClearAllDigital");
      pSetAllDigital = (PSetAllDigital)GetProcAddress(hMod, "SetAllDigital");
      pClearDigitalChannel = (PClearDigitalChannel)GetProcAddress(hMod, "ClearDigitalChannel");
      pSetDigitalChannel = (PSetDigitalChannel)GetProcAddress(hMod, "SetDigitalChannel");
      pLCDClear = (PLCDClear)GetProcAddress(hMod, "LCDClear");
      pLCDWriteString = (PLCDWriteString)GetProcAddress(hMod, "LCDWriteString");

      if (pOpenDevice &&
          pCloseDevice &&
          pConnected &&
          pReadAnalogChannel &&
          pReadAllDigital &&
          pSetPWM &&
          pInOutMode &&
          pOutputAllDigital &&
          pClearAllDigital &&
          pSetAllDigital &&
          pClearDigitalChannel &&
          pSetDigitalChannel &&
          pLCDClear &&
          pLCDWriteString)
         return true;
   }

   return false;
}

int eduOpenDevice() 
{ 
   if (pOpenDevice)
      return pOpenDevice();
   return 0;
}

void eduCloseDevice()
{ 
   if (pCloseDevice)
      pCloseDevice();
}

bool eduConnected()
{ 
   if (pConnected)
      return pConnected();
   return false;
}

int eduReadAnalogChannel(int Channel)
{ 
   if (pReadAnalogChannel)
      return pReadAnalogChannel(Channel);
   return 0;
}

int eduReadAllDigital()
{
   if (pReadAllDigital)
      return pReadAllDigital();
   return 0;
}

void eduSetPWM(int Channel, int Data)
{ 
   if (pSetPWM)
      pSetPWM(Channel, Data);
}

void eduInOutMode(int IOMode)
{ 
   if (pInOutMode)
      pInOutMode(IOMode);
}

void eduOutputAllDigital(int Data)
{
   if (pOutputAllDigital)
      pOutputAllDigital(Data);
}


void eduClearAllDigital()
{
   if (pClearAllDigital)
      pClearAllDigital();
}


void eduSetAllDigital()
{
   if (pSetAllDigital)
      pSetAllDigital();
}


void eduClearDigitalChannel(int Channel)
{
   if (pClearDigitalChannel)
      pClearDigitalChannel(Channel);
}


void eduSetDigitalChannel(int Channel)
{
   if (pSetDigitalChannel)
      pSetDigitalChannel(Channel);
}

void eduLCDClear()
{
   if (pLCDClear)
      pLCDClear();
}


void eduLCDWriteString(char *PData, int Position)
{
   if (pLCDWriteString)
      pLCDWriteString(PData, Position);
}
Verwendung:

Code: Alles auswählen

    if (eduInitLibrary())
    {
       if (eduOpenDevice())
       {
          eduLCDWriteString("Hello World", 0);
          eduCloseDevice();
       }
    }

Re: Velleman EDU05

Verfasst: 11. Mai 2015 17:28
von GGStefan
Hallo veeman,

vielen Dank für die tolle Unterstützung, werde es so schnell wie möglich testen und berichten. Vielen Dank :D

Re: Velleman EDU05

Verfasst: 20. Mai 2015 18:18
von GGStefan
Hallo veeman,

habe endlich die Zeit gefunden es zu testen, funktioniert soweit richtig gut. Habe noch nicht alle Funktionen durch getestet aber wird schon funktionieren. Durch das einbinden von "windows." und das verwenden der DLL ich gehe ich davon aus das dieses jetzt nur unter Windows funktioniert. Gibt es auch eine Möglichkeit das unter Linux/Ubuntu benutzen zu können, aber ohne Wine oder so.

Gruß GGStefan

Re: Velleman EDU05

Verfasst: 20. Mai 2015 20:47
von veeman
Naja die DLL wirst du wohl nicht ohne weiteres unter Linux verwenden können.

Wenn du Glück hast dann wird die USB Verbindung über einen virtuellen COM Port gelöst, dann könnte man die gesendeten Daten unter Windows sniffen und eine eigene Bibliothek nachbauen.
Die Frage ist halt ob man Lust darauf hat und ob es sich der aufwand lohnt.

Re: Velleman EDU05

Verfasst: 21. Mai 2015 07:41
von GGStefan
Hallo veeman,

ich denke wohl eher nicht, hätte ich das vorher gewusst hätte ich das Teil nicht gekauft. Den als Modul zum erlernen der USB-Kommunikation taugt das eher nicht.
Aber vielen Dank noch einmal für Deine Hilfe. :P

Gruß GGStefan