Seite 1 von 1

Externe DLL einbinden

Verfasst: 27.09.2010 20:58
von Thoene
Ich benutze schon länger Power-Basic und möchte auch in Pure-Basic einsteigen.
Ich möchte ein funktionierendes Programm in PB konvertieren und habe Problem mit Aufruf der DLL
für die externen USB Device
Wie binde ich eine DLL einer Externen Komponente in Pure Basic ein???
Benutze von Code Mercenaries ein USB I/O-Controller IO-Warrior40
Ich will die Funktionen – Subs Deklarieren:
Unten die Declarationen in VB 6.0 und Power-Basic für Öffnen, Schließen, Schreiben und Lesen
Wie ist die Syntax in PB?? Ich benutze PB 4.51
---------------------------------------------------------------------------------------------------------
In VB 6.0 Device Öffnen
Public Declare Function IowKitOpenDevice Lib "iowkit" () As Long

In Power Basic
DECLARE FUNCTION IowKitOpenDevice LIB "iowkit.dll" ALIAS "IowKitOpenDevice"() AS LONG
---------------------------------------------------------------------------------------------------------
In VB 6.0 Device Schließen
Public Declare Sub IowKitCloseDevice Lib "iowkit" (ByVal iowHandle As Long)

In Power Basic
DECLARE SUB IowKitCloseDevice LIB "iowkit.dll" ALIAS "IowKitCloseDevice" (BYVAL iowHandle AS_ LONG)
---------------------------------------------------------------------------------------------------------
In VB 6.0 Schreiben in Device
Public Declare Function IowKitWrite Lib "iowkit" (ByVal iowHandle As Long, _
ByVal numPipe As Long, ByRef buffer As Byte, ByVal length As Long) As Long

In Power Basic
DECLARE FUNCTION IowKitWrite LIB "iowkit.dll" ALIAS "IowKitWrite" (BYVAL iowHandle AS LONG, _
BYVAL numPipe AS LONG, BYREF buffer AS BYTE, BYVAL length AS LONG) AS LONG
---------------------------------------------------------------------------------------------------------
In VB 6.0 Lesen aus Device
Public Declare Function IowKitRead Lib "iowkit" (ByVal iowHandle As Long, _
ByVal numPipe As Long, ByRef buffer As Byte, ByVal length As Long ) As Long

In Power Basic
DECLARE FUNCTION IowKitRead LIB "iowkit.dll" ALIAS "IowKitRead" (BYVAL iowHandle AS LONG, _
BYVAL numPipe AS LONG, BYREF buffer AS BYTE, BYVAL length AS LONG) AS LONG

Programierbeispiel in Power-Basic
DIM iowHandles(16) AS GLOBAL LONG ‘ Dimensionieren“ iow Handles“ mit 16 Elementen als Long
DIM Daten(8) AS GLOBAL BYTE ‘Dimensionieren „Daten“ mit 8 Elementen als Byte
GLOBAL Res AS LONG 'Dimensionieren “Res” Rückgabewert Funktion als Long

iowHandles(0) = IowKitOpenDevice() 'IO-Warrior öffnen + Schreiben
Daten(0) = 0 : Daten(1) =23 ‘Zahl 23 als Bitmuster Port 0 ausgeben
Res = IowKitWrite(iowHandles(0), 0, Daten(0), 5)'Nach IOW schreiben ‘ 5 Byte schreiben

Daten(0) = 0 : Daten(4) = 255 ‘Port 3 als Ausgang
Res = IowKitWrite(iowHandles(0), 0, Daten(0), 5)'Nach IOW schreiben ‘ 5 Byte schreiben
Res = IowKitRead(iowHandles(0),0, Daten(0), 5) 'Von IOW lesen‘ 5 Byte lesen
Ergebnis = Daten(4) ‘Bitmuster von Port 3

Vielen Dank in voraus.

Re: Externe DLL einbinden

Verfasst: 27.09.2010 21:18
von ts-soft

Code: Alles auswählen

Prototype.l IowKitOpenDevice()
Prototype.l IowKitCloseDevice(iowHandle.l)
Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l

Global IowKitOpenDevice.IowKitOpenDevice
Global IowKitCloseDevice.IowKitCloseDevice
Global IowKitWrite.IowKitWrite

If OpenLibrary(0, "iowkit.dll")
  IowKitOpenDevice = GetFunction(0, "IowKitOpenDevice")
  IowKitCloseDevice = GetFunction(0, "IowKitCloseDevice")
  IowKitWrite = GetFunction(0, "IowKitWrite")
EndIf

Define iowHandle.l
iowHandle = IowKitOpenDevice()

; usw.
Bitte in der Hilfe unter Library und Prototypes nachlesen!

Gruß
Thomas

Re: Externe DLL einbinden

Verfasst: 28.09.2010 23:45
von Thoene
Vielen Dank für die schnelle Hilfe. Habe das nachfolgende Programm an die Hilfestellung angepasst aber
beim Start meines nachstehenden Programm wird 255 aus dem Array Daten(4) angezeigt aber keine Eingangspegel
vom Port3.
Der Button ist nicht sichtbar und der Mauszeiger erscheint als Eieruhr. Das Programm hängt und kann nur durch
mehrmaliges drücken des Systembutton (x) abgebrochen werden.
Der Kompiler meldet sich mit: The debugged executable quit unexpectedly.
Was ich nicht verstehe in der Programmzeile "Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l)"
Was bedeutet *buffer Muss das nicht heißen Buffer.a als Byte? Es werden über das Array Daten 5 Byte an das
Device geschrieben oder gelesen.

Mein Programmcode:

Code: Alles auswählen

OpenWindow(0,0,0,1275,775,"Window",#PB_Window_SystemMenu) ;x,OL,OO,RU,UU,Text
ButtonGadget(0,20,20,140,40,"Button") 
    If LoadFont(0, "Arial", 16)
      SetGadgetFont(#PB_Default, FontID(0))   ; geladenen Arial 16 Zeichensatz als neuen Standard festlegen
    EndIf
 
TextGadget(1, 40, 140, 80, 20, "Test") 
SetGadgetColor(1, #PB_Gadget_BackColor, $00FFFF) 
    If LoadFont(1,"Courier",10, #PB_Font_Bold|#PB_Font_Underline)
      SetGadgetFont(#PB_Default, FontID(1))   ; geladenen Courier 10 Zeichensatz als neuen Standard festlegen
    EndIf
Prototype.l IowKitOpenDevice()
Prototype.l IowKitCloseDevice(iowHandle.l)
Prototype.l IowKitWrite(iowHandle.l, numPipe.l, *buffer, length.l)
Prototype.l IowKitRead(iowHandle.l, numPipe.l, *buffer, length.l)
Prototype.l IowKitReadNonBlocking(iowHandle.l, numPipe.l, *buffer, length.l)
Prototype.l IowKitReadImmediate(iowHandle.l, Value.l)
Prototype.l IowKitGetNumDevs()
Prototype.l IowKitGetDeviceHandle(numDevice.l)

Global IowKitOpenDevice.IowKitOpenDevice
Global IowKitCloseDevice.IowKitCloseDevice
Global IowKitWrite.IowKitWrite
Global IowKitRead.IowKitRead
Global IowKitReadNonBlocking.IowKitReadNonBlocking
Global IowKitReadImmediate.IowKitReadImmediate
Global IowKitGetNumDevs.IowKitGetNumDevs
Global IowKitGetDeviceHandle.IowKitGetDeviceHandle
 
Global Dim Daten.a(8)
Define iow.l
Define Res.l

If OpenLibrary(0, "iowkit.dll")
  IowKitOpenDevice = GetFunction(0, "IowKitOpenDevice")
  IowKitCloseDevice = GetFunction(0, "IowKitCloseDevice")
  IowKitWrite = GetFunction(0, "IowKitWrite")
  IowKitRead = GetFunction(0, "IowKitRead")
  IowKitReadNonBlocking = GetFunction(0, "IowKitReadNonBlocking")
  IowKitReadImmediate = GetFunction(0, "IowKitReadImmediate")
  IowKitGetNumDevs = GetFunction(0, "IowKitGetNumDevs")
  IowKitGetDeviceHandle = GetFunction(0, "IowKitGetDeviceHandle")
EndIf
  iow = IowKitOpenDevice()
 
  Repeat
     Daten(0) = 0   ;Normalmodus
     Daten(1) = 255 ;Port 0 Eingang Messdaten Einer + Zehner
     Daten(2) = 255 ;Port 1 Eingang Messdaten Hunderter + Tausender
     Daten(3) = 255 ;Port 2 Eingang Messdaten Bit0 = Zehntausender + Rest
     Daten(4) = 255 ;Port 3 Eingang Taster
;Setzen Normalmodus und Port 0-3 als Eingang     
     Res = IowKitWrite(iow, 0, Daten(0), 5)  ;5 Bytes nach IOW schreiben
     Delay(300)
;Lesen 4 Byte von Port 0-3     
     Res = IowKitRead(iow, 0, Daten(0), 5)   ;5 Bytes vom IOW lesen
;Ausgabe Wert von Byte 4 = Port3 als 0-255
     SetGadgetText(1, StrU(Daten(4), #PB_Byte))
     Delay(300)
     
Until event=#PB_Event_CloseWindow
IowKitCloseDevice(iow)
End

__________________________________________________
Code-Tags hinzugefügt
29.09.2010
RSBasic

Re: Externe DLL einbinden

Verfasst: 29.09.2010 09:28
von edel
in der Schleife musst du das Event erst abfragen

Code: Alles auswählen

 repeat
   event = waitwindowevent(1)
   
   if event = 0
      ; hier dein zeugs
   endif
  
 until event = #pb_event_closewindow

Re: Externe DLL einbinden

Verfasst: 29.09.2010 23:32
von Thoene
Hallo Problem gelöst!!! :D
Habe im IO-Warior Forum Lösung gefunden. Anbei ein Funktionierendes Testprogramm
Es wird der Pegel des Eingangsport 3 als Byte angezeigt.
Gleichzeitig werden die Zyklen gezählt, bei mir ca. 125 Messungen / Sekunde
Es werden im Spezialmode die Eingangspegel kontinuierlich gemessen.

Code: Alles auswählen

OpenWindow(0,0,0,1275,775,"Window",#PB_Window_SystemMenu)
ButtonGadget(0,20,20,140,40,"Button") 
If LoadFont(0, "Arial", 16)
  SetGadgetFont(#PB_Default, FontID(0))   ; geladenen Arial 16 Zeichensatz als neuen Standard festlegen
EndIf
 
TextGadget(1, 40, 140, 80, 20, "Test") 
SetGadgetColor(1, #PB_Gadget_BackColor, $00FFFF) 
TextGadget(2, 80, 200, 80, 20, "Test") 
SetGadgetColor(2, #PB_Gadget_BackColor, $00FFFF) 

If LoadFont(1,"Courier",10, #PB_Font_Bold|#PB_Font_Underline)
  SetGadgetFont(#PB_Default, FontID(1))   ; geladenen Courier 10 Zeichensatz als neuen Standard festlegen
EndIf

Import "iowkit.lib"
  IowKitOpenDevice() As "_IowKitOpenDevice@0"
  IowKitCloseDevice(devHandle.i) As "_IowKitCloseDevice@4"
  IowKitGetNumDevs() As "_IowKitGetNumDevs@4"
  IowKitGetDeviceHandle(devHandle.i) As "_IowKitGetDeviceHandle@4"
  IowKitRead(devHandle.i, numPipe.l, buffer.l, length.l) As "_IowKitRead@16"
  IowKitWrite(devHandle.i, numPipe.l, buffer.l, length.l) As "_IowKitWrite@16"
  IowKitGetProductId(ioHandle) As "_IowKitGetProductId@4"
  IowKitGetRevision(ioHandle) As "_IowKitGetRevision@4"
  IowKitGetSerialNumber(ioHandle, Serial.s) As "_IowKitGetSerialNumber@8"
  IowKitReadImmediate(ioHandle,buffer.s) As "_IowKitReadImmediate@8"
EndImport

Structure bufferByte
   buffer1.c
   buffer2.c
   buffer3.c
   buffer4.c
   buffer5.c
   buffer6.c
   buffer7.c
   buffer8.c
EndStructure
 
Define.bufferByte buffer
Define.l ioHandle
Define.l Zaehler

numPipe = 1
length = 8
IowKitOpenDevice()
ioHandle = IowKitGetDeviceHandle(1)

Repeat
    event = WaitWindowEvent(1)
    If event = 0
buffer\buffer1 = 255
buffer\buffer2 = 255
buffer\buffer3 = 255
buffer\buffer4 = 255
buffer\buffer5 = 255

IowKitWrite(ioHandle, numPipe,buffer,length)
IowKitRead(ioHandle, numPipe,buffer,length)

SetGadgetText(1, StrU(buffer\buffer5, #PB_Byte))
SetGadgetText(2, StrU(Zaehler, #PB_Long))
Zaehler = Zaehler + 1

    EndIf 
  Until event=#PB_Event_CloseWindow

IowKitCloseDevice(iohandle)

End

__________________________________________________
Code-Tags hinzugefügt
30.09.2010
RSBasic

Re: Externe DLL einbinden

Verfasst: 30.09.2010 07:53
von RSBasic
Hallo Thoene,


wenn du einen Quellcode posten möchtest, verwende bitte zukünftig die Code-Tags, indem du dein Code markierst und auf den folgenden Button klickst:
Bild

Sonst wird es zu unübersichtlich.