Iow24-56 mit PureBasic und PowerBasic

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Iow24-56 mit PureBasic und PowerBasic

Post by Thoene »

Hallo habe mal die Declaration der DLL, Lib des IO-Warrior 24-56 mit PureBasic und PowerBasic ausprobiert und als
Anregung mit 2 Programmbeispielen hier ins Forum gesetzt.
Als Neuling habe ich am Anfang viel Zeit benötigt um den Durchblick zu erhalten.
Am einfachsten ist es wenn man ein kleines funktionierendes Programm hat bei dem die Grundsätzlichen Funktionen
vorhanden sind um darauf aufzubauen.
Bei Fragen im Forum bekommt man meistens nur kurze Teilprogramme die sofort die nächsten Fragen aufwerfen.

Hier Programm für Pure-Basic: ;Beispielprogramm für IO-Warrior 40
;Abfrage Bit 0 Port 3 als Eingang
;Setzen, Resetten Bit 1 Port 3 als Ausgang

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) ; Standart Font auf Arial größe 16 setzen
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) ; Standart Font auf default setzen
SetGadgetFont(#PB_Default, FontID(1)) ; geladenen Courier 10 Zeichensatz als neuen Standard festlegen
EndIf

Import "iowkit.lib" ; IOW40 Library zum Benutzen declarieren
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 ; Array für Datenübergabe an Library erzeugen
buffer1.c ; Array byte 0 auf Byte setzen
buffer2.c ; Array byte 1 auf Byte setzen
buffer3.c ; Array byte 2 auf Byte setzen
buffer4.c ; Array byte 3 auf Byte setzen
buffer5.c ; Array byte 4 auf Byte setzen
buffer6.c ; Array byte 5 auf Byte setzen
buffer7.c ; Array byte 6 auf Byte setzen
buffer8.c ; Array byte 7 auf Byte setzen
EndStructure

Define.bufferByte buffer ; Array für Datenübergabe
Define.l ioHandle ; Variable IOW - Kennung
Define.l Zaehler ; Zähler für Zykluszeit berechnen
Define.b Ausgabe ; Ausgabebyte für Bit 1 (setzen-Reset)

numPipe = 0 ; IOW = Kanal 0 = Normalmodus
length = 5 ; Schreiben lesen 5 bytes
buffer\buffer1 = 0 ; Datenbyte 0 auf Normalmodus
buffer\buffer5 = 255 ; Byte 4 Port 3 auf Eingang

IowKitOpenDevice() ; IOW öffnen
ioHandle = IowKitGetDeviceHandle(1) ; IOW-Kennung abfragen

Repeat ; Endlosschleife
event = WaitWindowEvent(1)
If event = 0
buffer\buffer5 | 1 ;Bit 1 Setzen = Eingang
IowKitWrite(ioHandle, numPipe,buffer,length) ; Array byte 0-4 an IOW schreiben

numPipe = 1 ; IOW = Kanal 1 = Spezialmodus
length = 8 ; Schreiben lesen 8 bytes
buffer\buffer1 = 255 ; IOW-Spezialmodus = Eingangspegel direkt abfragen

IowKitWrite(ioHandle, numPipe,buffer,length) ; Spezialmodus nach IOW schreiben
IowKitRead(ioHandle, numPipe,buffer,length) ; Im Spezialmodus alle 4 Ports pegel abfragen

SetGadgetText(1, StrU(buffer\buffer5, #PB_Byte)) ; Eingangsport 3 anzeigen
SetGadgetText(2, StrU(Zaehler, #PB_Long)) ; Zykluszeit Zähler anzeigen
Zaehler = Zaehler + 1 ; Zykluszeit um 1 erhöhen

numPipe = 0 ; IOW = Kanal 0 = Normalmodus
length = 5 ; Schreiben lesen 5 bytes
buffer\buffer1 = 0 ; Datenbyte 0 auf Normalmodus
If buffer\buffer5 & 1 = 1 ; Test Port 3 Bit 0 = 1
buffer\buffer5 | 2 ; Setzen Port 3 Bit 1
EndIf
If buffer\buffer5 & 1 = 0 ; Test Port 3 Bit 0 = 0
buffer\buffer5 & 253 ; Reset Port 3 Bit 1
EndIf
IowKitWrite(ioHandle, numPipe,buffer,length) ; Status Port 3 Bit 1 nach IOW schreiben

EndIf
Until event=#PB_Event_CloseWindow ; Abbruch Endlosschleife durch Button (x) Systemmenue

IowKitCloseDevice(iohandle) ; IOW 40 schließen

End

Hier Programm für Power-Basic für Windows:
#PBFORMS CREATED V2.01
'Grundlegendes Testprogramm zum Betrieb des IO-Warior40 (Ein-Ausgangsports)
'Abgefragt wird Bit 0 Port3 als Eingang und als Byte angezeigt
'Ausgegeben wird Bit 1 Port3 als Ausgang; wird entsprechend des Eingang Bit 0 geschaltet
'Angezeigt wird auch der Zählerwert des Zykluszählers
'Start mit Button "Start" und Stop mit Button "Stop"
'Abbruch und Ende mit Systembutton "x" oben rechts im Dialog
' ** Für IOW 24 **
'Daten(0) = Modus, Daten(1) + Daten(2) = Port 0-1
'Res = IowKitWrite(iowHandles(0), 0, Daten(0), 3)'Schreiben im Normalmodus
'Res = IowKitWrite(iowHandles(0), 1, Daten(0), 8)'Schreiben im Spezialmodus
'Res = IowKitRead(iowHandles(0), 0, Daten(0), 3) 'Lesen im Normalmodus
'Res = IowKitRead(iowHandles(0), 1, Daten(0), 8) 'Lesen im Spezialmodus
' ** Für IOW 56 **
'Daten(0) = Modus, Daten(1) - Daten(7) = Port 0-6
'Res = IowKitWrite(iowHandles(0), 0, Daten(0), 8)'Schreiben im Normalmodus
'Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'Schreiben im Spezialmodus
'Res = IowKitRead(iowHandles(0), 0, Daten(0), 8) 'Lesen im Normalmodus
'Res = IowKitRead(iowHandles(0), 1, Daten(0), 64) 'Lesen im Spezialmodus

#COMPILE EXE
#DIM ALL
' ** Includes ** ----------------------------------------------------------
#PBFORMS BEGIN INCLUDES
#RESOURCE "Forum.pbr"
%USEMACROS = 1
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "COMMCTRL.INC"
#INCLUDE ONCE "PBForms.INC"
#PBFORMS END INCLUDES
' ** Constants ** ----------------------------------------------------------
#PBFORMS BEGIN CONSTANTS
%IDD_DIALOG1 = 101
%IDC_LABEL1 = 1001
%IDC_LABEL2 = 1002
%IDC_BUTTON1 = 1003
%IDC_BUTTON2 = 1004
%IDC_LABEL3 = 1005
%IDC_LABEL4 = 1006
%id_timer = 1007 'Manuell eintragen bei Benutzung PB-Forms
#PBFORMS END CONSTANTS
' ** Declarations ** --------------------------------------------------------
DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
'------------------------------- IO-Warrior ---------------------------------------
DECLARE FUNCTION GetLastError LIB "kernel32" ALIAS "GetLastError" () AS LONG
DECLARE FUNCTION IowKitOpenDevice LIB "iowkit.dll" ALIAS "IowKitOpenDevice"() AS LONG
DECLARE SUB IowKitCloseDevice LIB "iowkit.dll" ALIAS "IowKitCloseDevice" (BYVAL iowHandle AS LONG)
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
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
DECLARE FUNCTION IowKitReadNonBlocking LIB "iowkit.dll" ALIAS "IowKitReadNonBlocking" (BYVAL iowHandle AS LONG, _
BYVAL numPipe AS LONG, BYREF buffer AS BYTE, BYVAL length AS LONG) AS LONG
DECLARE FUNCTION IowKitReadImmediate LIB "iowkit.dll" ALIAS "IowKitReadImmediate" _
(BYVAL iowHandle AS LONG, BYREF Value AS LONG) AS LONG
' Get number of IOW devices
DECLARE FUNCTION IowKitGetNumDevs LIB "iowkit.dll" ALIAS "IowKitGetNumDevs" () AS LONG
DECLARE FUNCTION IowKitGetDeviceHandle LIB "iowkit.dll" ALIAS "IowKitGetDeviceHandle" _
(BYVAL numDevice AS LONG) AS LONG
DECLARE FUNCTION IowKitSetLegacyOpenMode LIB "iowkit.dll" ALIAS "IowKitSetLegacyOpenMode" _
(BYVAL openMode AS LONG) AS LONG
DECLARE FUNCTION IowKitGetProductId LIB "iowkit.dll" ALIAS "IowKitGetProductId" (BYVAL iowHandle AS LONG) AS LONG
DECLARE FUNCTION IowKitGetRevision LIB "iowkit.dll" ALIAS "IowKitGetRevision" (BYVAL iowHandle AS LONG) AS LONG
DECLARE FUNCTION IowKitGetThreadHandle LIB "iowkit.dll" ALIAS "IowKitGetThreadHandle" _
(BYVAL iowHandle AS LONG) AS LONG
DECLARE FUNCTION IowKitGetSerialNumber LIB "iowkit.dll" ALIAS "IowKitGetSerialNumber" _
(BYVAL iowHandle AS LONG, BYREF serialNumber AS BYTE) AS LONG
DECLARE FUNCTION IowKitSetTimeout LIB "iowkit.dll" ALIAS "IowKitSetTimeout" _
(BYVAL iowHandle AS LONG, BYVAL TIMEOUT1 AS LONG) AS LONG
DECLARE FUNCTION IowKitSetWriteTimeout LIB "iowkit.dll" ALIAS "IowKitSetWriteTimeout" _
(BYVAL iowHandle AS LONG, BYVAL TIMEOUT1 AS LONG) AS LONG
DECLARE FUNCTION IowKitCancelIo LIB "iowkit.dll" ALIAS "IowKitCancelIo" _
(BYVAL iowHandle AS LONG, BYVAL numPipe AS LONG) AS LONG
#PBFORMS DECLARATIONS
' ** Variablen ** ---------------------------------------------------------
GLOBAL hTimer AS LONG
GLOBAL hdlg AS LONG
' GLOBAL Res AS LONG 'Rückgabewert Funktion IOW - x
GLOBAL numIows AS LONG
GLOBAL Flag AS LONG '

' ** Main Application Entry Point ** ----------------------------------------
FUNCTION PBMAIN()
DIM Daten(64) AS GLOBAL BYTE
DIM iowHandles(16) AS GLOBAL LONG

PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR _
%ICC_INTERNET_CLASSES)

ShowDIALOG1 %HWND_DESKTOP
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
' ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ShowDIALOG1Proc()

SELECT CASE AS LONG CB.MSG
CASE %WM_INITDIALOG
' Initialization handler
hTimer = setTimer(CB.HNDL, %id_timer, 10, BYVAL %null)

CASE %WM_NCACTIVATE
STATIC hWndSaveFocus AS DWORD
IF ISFALSE CB.WPARAM THEN
' Save control focus
hWndSaveFocus = GetFocus()
ELSEIF hWndSaveFocus THEN
' Restore control focus
SetFocus(hWndSaveFocus)
hWndSaveFocus = 0
END IF

CASE %WM_COMMAND
' Process control notifications
SELECT CASE AS LONG CB.CTL
CASE %IDC_BUTTON1 ' Button-Start
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
Flag = 0 'Flag für Abbruch Sub löschen
IOW40 CBHNDL
END IF

CASE %IDC_BUTTON2 ' Button-Stop
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
Flag = 2 'Flag für Abbruch Sub
END IF
END SELECT
CASE %WM_DESTROY 'Abfrage Systembutton "x" oben rechts im Dialog
killTimer (CB.HNDL, hTimer)
hTimer = 0
IowKitCloseDevice (iowHandles(0))'IO-Warrior
DIALOG END CB.HNDL, 0
FUNCTION = 0
END SELECT
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
' ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
LOCAL lRslt AS LONG

#PBFORMS BEGIN DIALOG %IDD_DIALOG1->->
LOCAL hDlg AS DWORD
LOCAL hFont1 AS DWORD
LOCAL hFont2 AS DWORD

DIALOG NEW hParent, "Dialog1", 70, 70, 480, 260, %WS_POPUP OR %WS_BORDER _
OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX _
OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK _
OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR _
%WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "", 50, 35, 45, 15, %WS_CHILD OR _
%WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, %WS_EX_LEFT OR _
%WS_EX_LTRREADING
CONTROL SET COLOR hDlg, %IDC_LABEL1, -1, RGB(255, 255, 128)
CONTROL ADD LABEL, hDlg, %IDC_LABEL2, " ", 50, 80, 45, 15, %WS_CHILD OR _
%WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, %WS_EX_LEFT OR _
%WS_EX_LTRREADING
CONTROL SET COLOR hDlg, %IDC_LABEL2, -1, RGB(255, 255, 128)
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "Start", 165, 15, 40, 15
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON2, "Stop", 165, 40, 40, 15
CONTROL ADD LABEL, hDlg, %IDC_LABEL3, "Eingang Port-3", 35, 15, 75, 15, _
%WS_CHILD OR %WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, _
%WS_EX_LEFT OR %WS_EX_LTRREADING
CONTROL SET COLOR hDlg, %IDC_LABEL3, -1, RGB(219, 219, 219)
CONTROL ADD LABEL, hDlg, %IDC_LABEL4, "Zyklus-Zeit", 35, 60, 75, 15, _
%WS_CHILD OR %WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, _
%WS_EX_LEFT OR %WS_EX_LTRREADING
CONTROL SET COLOR hDlg, %IDC_LABEL4, -1, RGB(219, 219, 219)

FONT NEW "MS Sans Serif", 12, 1, %ANSI_CHARSET TO hFont1
FONT NEW "MS Sans Serif", 10, 1, %ANSI_CHARSET TO hFont2

CONTROL SET FONT hDlg, %IDC_LABEL1, hFont1
CONTROL SET FONT hDlg, %IDC_LABEL2, hFont1
CONTROL SET FONT hDlg, %IDC_BUTTON1, hFont2
CONTROL SET FONT hDlg, %IDC_BUTTON2, hFont2
CONTROL SET FONT hDlg, %IDC_LABEL3, hFont2
CONTROL SET FONT hDlg, %IDC_LABEL4, hFont2
#PBFORMS END DIALOG

DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt

#PBFORMS BEGIN CLEANUP %IDD_DIALOG1
FONT END hFont1
FONT END hFont2
#PBFORMS END CLEANUP

FUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------
SUB IOW40(BYVAL hdlg AS LONG)
LOCAL Res AS LONG 'Rückgabewert Funktionen, Subs IOW - x
LOCAL msg AS tagmsg
LOCAL Zyklus AS LONG
LOCAL Wert AS BYTE

iowHandles(0) = IowKitOpenDevice() 'IO-Warrior öffnen
IF iowHandles(0) = 0 THEN
MSGBOX "Can not open device!", 0, "Error"
END IF
Daten(4) = 255 'Port 3 Eingang

DO
getmessage(msg, %Null, 0, 0) 'Windows Message auswerten Button "Start-Stop" usw.
translatemessage msg
dispatchmessage msg
IF Flag = 2 THEN 'Abbruch Messen
EXIT LOOP
END IF

Daten(0) = 0 'Normalmodus
Daten(1) = 255 'Port 0 Eingang
Daten(2) = 255 'Port 1 Eingang
Daten(3) = 255 'Port 2 Eingang
BIT SET Daten(4), 0 'Bit0 als Eingang
Res = IowKitWrite(iowHandles(0), 0, Daten(0), 5)'Nach IOW schreiben

Daten(0) = 255 'Spezialmodus direkt lesen
Res = IowKitWrite(iowHandles(0), 1, Daten(0), 8)'Nach IOW schreiben
Res = IowKitRead(iowHandles(0), 1, Daten(0), 8) 'Pin direkt von IOW lesen
INCR Zyklus
CONTROL SET TEXT Hdlg, %idc_Label1, STR$(Daten(4)) 'Port3 Byte anzeigen
CONTROL SET TEXT Hdlg, %idc_Label2, STR$(Zyklus) 'Zykluszähler anzeigen
IF BIT(Daten(4), 0) = 1 THEN BIT SET Daten(4), 1 'Abfragen Bit 0 und Bit 1 ein
IF BIT(Daten(4), 0) = 0 THEN BIT RESET Daten(4), 1 'Abfragen Bit 0 und Bit 1 aus
Daten(0) = 0 'Normalmodus
Daten(1) = 255 'Port 0 Eingang
Daten(2) = 255 'Port 1 Eingang
Daten(3) = 255 'Port 2 Eingang
Res = IowKitWrite(iowHandles(0), 0, Daten(0), 5)'Nach IOW schreiben
' sleep 10
LOOP
IowKitCloseDevice (iowHandles(0))'IO-Warrior

END SUB
rmk
Posts: 7
Joined: Thu Jan 23, 2014 2:42 pm

Re: Iow24-56 mit PureBasic und PowerBasic

Post by rmk »

Hallo,

ich habe diesen Beitrag für PowerBasic gelesen. Ich habe eine entsprechende Platine mit 16 Ausgängen. Gibt es ein PowerBasicprogramm um jeden einzelnen Kanal getrennt anzusteuern.

Vielleicht haben Sie einen Tipp oder ein kleines Beispielprogramm
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: Iow24-56 mit PureBasic und PowerBasic

Post by Thoene »

Hallo.
Ich habe mehrere Programme für den IOW geschrieben.
Was haben Sie für ein Typ? IOW 24, 40 oder 56
Sollen die 16 Ausgänge Bitweise oder als Byte am Display eingegeben werden?
rmk
Posts: 7
Joined: Thu Jan 23, 2014 2:42 pm

Re: Iow24-56 mit PureBasic und PowerBasic

Post by rmk »

Hallo,

zum Testen habe ich mehr erst einmal den 24 geholt.

Ich möchte die Daten Bitweise ausgeben
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: Iow24-56 mit PureBasic und PowerBasic

Post by Thoene »

Ich habe hier im Moment ein Programm für den IOW24
Das Gerät habe ich zum Testen auch zur Verfügung.
Verwendet A/D-Wandler mit MCP3424 für den I2C-Bus
Verwendet A/D-Wandler mit ADS1246 für den SPI-Bus
2 IO-Port (Bit) kann ich Testen.
Haben Sie Powerbasic für Windows? und welche Version
Ich benutze Powerbasic für Windows Version 10.04 + PB-Forms 2.0 für die Visualisierung.
Wenn ich ihre Adresse hätte, könnte ich Ihnen das ****.bas + ****.EXE zukommen lassen.
Ansonsten poste ich ihnen hier ein kleines Programm mit den minimalsten Code
Kann aber etwas dauern weil ich das erst neu erstellen und Testen müsste.
rmk
Posts: 7
Joined: Thu Jan 23, 2014 2:42 pm

Re: Iow24-56 mit PureBasic und PowerBasic

Post by rmk »

Hallo,

ich arbeite mit PowerBasic 10..

Die *.bas Datei würde ich mir gerne anschauen.

Hier meine Email: info@kienast-online.de
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Iow24-56 mit PureBasic und PowerBasic

Post by Guido Körber »

rmk wrote:Ich möchte die Daten Bitweise ausgeben
Das ist vom Prinzip her ganz einfach: Merken was man für einen Zustand an den IO-Warrior geschrieben hat, bei Änderungen die betreffenden Bits mit Logikoperationen ändern und dann den neuen Zustand schreiben. Dabei aufpassen, dass Pins die als Eingänge funktionieren sollen immer als "1" geschrieben werden müssen.
Post Reply