Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Darkwolf
Beiträge: 5
Registriert: 23.07.2010 09:10

Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von Darkwolf »

Hallo liebe Purebasic-Freunde,

Ich habe eine Steuersoftware für das VELLEMAN K8055 USB EXPERIMENT INTERFACE BOARD geschrieben. Vielleicht kennt ja der ein oder andere diese Platine. Gibt es bereits seit 2003, habe sie zufällig auf dem Dachboden wiedergefunden.

Ich bin Elektrotechniker und möchte damit ein selbstgebautes Lichteffektgerät ansteuern.
Folgender Quellcode (v0.3) funktioniert soweit schon ganz gut, so dass ich die digitalen Ausgänge) 8 LED´s ein und ausschalten kann.

Jedoch brauche ich ein wenig Unterstützung, denn die Lauflicht-Funktion stürzt bei mir während des viertes Durchlaufs ab. Ich benutze Windows 7. Habe das gleiche problem auch auf einem Windows XP Rechner, dort bricht das Programm bereits nach 2 Durchläufen ab.

Mein Purebasic Programm benutzt die K8055D.DLL, welche dem Board beigefügt war.

Herstellerseite mit Downloads für das K8055:
http://www.vellemanprojects.eu/distribu ... &id=351346

Und nun mein Quellcode:

Vielleicht fällt jemanden ja ein Fehler auf :-)
Gruß, Darkwolf

Code: Alles auswählen

;
;*******************************************************
;***           --- K8055PURE v0.3.220710 ---         ***
;***    ERSTELLT MIT PUREBASIC v4.40 VON DARKWOLF    ***
;*******************************************************
;*** BEISPIEL-PROGRAMM ZUR ANSTEUERUNG DES VELLEMAN  ***
;***  K8055 USB-INTERFACE BOARDS MITTELS PUREBASIC   ***
;***  HINWEIS: DIE K8055D.DLL MUSS IMMER DABEI SEIN  ***
;*******************************************************
;***          VERWENDETE KARTEN-ADRESSE = 0          ***
;***     (STECKBRÜCKEN SK5 UND SK6 SIND GESETZT)     ***
;*******************************************************

; ****** EINBINDEN DER K8055D.DLL UND INITIALISIERUNG DER K8055-PLATINE ******

OpenLibrary(0, "K8055D.dll")
CallCFunction(0, "OpenDevice",0)

; ****** ERSTELLUNG DES PROGRAMM-FENSTERS ******

If OpenWindow(0, 0, 0, 500, 300, "K8055PURE v0.3 (dArKwOLf!)", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | 

#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

; ****** DIE RAHMEN, SCHALTER, AUSWAHLFELDER ETC. WERDEN ERSTELLT ******

  Frame3DGadget(10,10,10,110,120,"Verbindung K8055")
  Frame3DGadget(11,130,10,110,120,"Digitale Ausgänge")
  
  ButtonGadget(1,140,30,80,20,"Alle ein")
  ButtonGadget(2,140,60,80,20,"Alle aus")
  ButtonGadget(3,140,90,80,20,"Lauflicht")

  CheckBoxGadget(4, 20, 30, 80 , 20, "Jumper SK5")
  CheckBoxGadget(5, 20, 50, 80 , 20, "Jumper SK6")
  ButtonGadget(6,20,80,80,20,"Verbinden")

; ****** DAS DATEI-MENÜ DES PROGRAMM-FENSTERS WIRD ERSTELLT ******

  If CreateMenu(0, WindowID(0))
    MenuTitle("Datei")
      MenuItem(1, "Verbinden")
      MenuItem(2, "Trennen")
      MenuBar()
      MenuItem(3, "Schließen")
    MenuTitle("Hilfe")
      MenuItem(4, "K8055PURE Hilfe")
      MenuBar()
      MenuItem(5, "Über K8055PURE")
  EndIf

; ****** ENDLOS-SCHLEIFE, BIS DAS PROGRAMM DURCH SCHLIEßEN BEENDET WIRD ******

  Repeat
    EventID = WaitWindowEvent()
   
    Select EventID
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            CallCFunction(0, "SetAllDigital")
          Case 2
            CallCFunction(0, "ClearAllDigital")
           Case 3
            CallCFunction(0, "WriteAllDigital",1)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",2)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",4)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",8)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",16)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",32)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",64)
            Delay(100)
            CallCFunction(0, "WriteAllDigital",128)
            Delay(100)
            CallCFunction(0, "ClearAllDigital")
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1
            MessageRequester("Information", "01 - Command not implented error", 0)
          Case 2
            MessageRequester("Information", "02 - Command not implented error", 0)
          Case 3
            Quit=1
          Case 4
            If OpenWindow(1, 0, 0, 350, 180, "K8055PURE Hilfe", #PB_Window_ScreenCentered)
              TextGadget (41, 10, 10, 350 , 20, "Die Hilfefunktion dieser Software steht leider noch nicht zur 

Vefügung!")
              ButtonGadget(42,130,150,80,20,"OK")
              Repeat : Until WaitWindowEvent () = #PB_Event_Gadget
              CloseWindow(1)
            Else
              MessageRequester("Fehler", "Kann Fenster nicht Initialisieren...", 0)
            EndIf
          Case 5
            If OpenWindow(2, 0, 0, 350, 180, "Über K8055PURE", #PB_Window_ScreenCentered)
              TextGadget (51, 10, 10, 340 , 20, "K8055PURE v0.3 - erstellt im Juli 2010 von dArKwOLf!")
              TextGadget (52, 10, 40, 340 , 20, "Die K8055D.DLL (von Velleman) ist zum Betrieb erforderlich!")
              TextGadget (53, 10, 70, 340 , 40, "Die Benutzung meiner Programme erfolgt trotz gewissenhafter 

Programmierung auf eigene Gefahr.")
              TextGadget (54, 10, 110, 340 , 40, "Das Programm darf kostenlos verwendet und weitergegeben werden. 

Verbesserungen an dem Quellcode dieser Software sind erwünscht.")              
              ButtonGadget(55,130,150,80,20,"OK")
              Repeat : Until WaitWindowEvent () = #PB_Event_Gadget
              CloseWindow(2)
            Else
              MessageRequester("Fehler", "Kann Fenster nicht Initialisieren...", 0)
            EndIf
        EndSelect
      Case #PB_Event_CloseWindow      
        Quit=1
    EndSelect

  Until Quit=1

; ****** TRENNEN DER VERBINDUNG ZUR K8055-PLATINE UND ENTLADEN DER K8055D.DLL ******

  CloseWindow(0)
  CallCFunction(0, "CloseDevice")
  CloseLibrary(0)

; ****** ALTERNATIVE MELDUNG, FALLS PROGRAMM-FENSTER NICHT ERSTELLT WERDEN KANN ******  

Else
  MessageRequester("Fehler", "Kann Fenster nicht Initialisieren...", 0)
EndIf
End
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von 7x7 »

Schon mal höhere Delay's probiert? Vielleicht ist die Responsetime der Karte zu hoch (die evtl.in der DLL abgefragt wird).
Das Problem dabei ist, dass die Delays in der Windows Event-Behandlung liegen. Ich würde die Kartenansteuerung in Thread's auslagern.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Darkwolf
Beiträge: 5
Registriert: 23.07.2010 09:10

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von Darkwolf »

Hallo,

Habe noch vergessen zu erwähnen, das Teile des Progammes noch nicht verwendet werden, z.B. die Buttons für die Kartenadresse und Verbinden/Trennen.

Derzeit muss die Karte auf Adresse 0 einegstellt sein.
Später soll dann die Adresse 0...3 bequem im Progarmm ausgewählt werden.

Aber ich will jetzt erstmal Ergenbisse sehen...
Übrigens ist das mein erstes PureBasic Projekt, außer "HALLO-WELT" etc.

An den Delay´s kann das theoretisch nicht liegen, die DEMO-Software der Platine steuert die Áusgänge (LED´s) teilweise noch schneller an - ich werde diese aber mal versuchsweise erhöhen.

Spezifikation von Hersteller: Konvertierungszeit pro Befehl: 20ms
Die Delay´s im Programm betragen zurzeit 100ms.

Außerdem soll das Gerät ja ein Lichteffekt steuern, da kann ich keinen langsamen Takt (1 Lampe pro Sekunde oder so ähnlich) gebrauchen . :-)

MFG Darkwolf
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von alter Mann »

was mir auf die Schnelle aufgefallen ist :

Du nutzt CallCFunction lädst aber die K8055D.dll und nicht die K8055D_C.dll
Win11 64Bit / PB 6.0
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von NicTheQuick »

Versuch dich mal mit Prototypes bzw. Import. Einfach mal in der PB-Hilfe danach schauen.
Bild
Darkwolf
Beiträge: 5
Registriert: 23.07.2010 09:10

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von Darkwolf »

Moin,

also, ich habe am WE ein wenig weiter gebastelt.

Es lag daran, dass ich CallCFunction verwendet hatte,
hatte zuerst auch die K8055D_C.dll verwendet, doch da passierte
überhaupt nichts. Dann die K8055D.dll genommen, und plötzlich klappte es.

Nun, mit der richtigen "CallFunction" klappt es auch so, wie ich es mir vorstellte.

habe zwischenzeitlich auch weitere Sicherheiten in das Programm eingebaut,
z.B. Abfrage, ob die K8055D.dll überhaupt vorhanden ist etc.

Macht richtig Spaß, wieder zu programmieren :-)
Habe früher viel programmiert, aber auf dem PC mit Windows hatte ich die Lust daran veloren, wenn ich C++ / Delphi sehe... Kotz

Werde mir die Befehle "Import" etc. trotzdem mal genauer ansehen.

Gruß, Darkwolf
Darkwolf
Beiträge: 5
Registriert: 23.07.2010 09:10

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von Darkwolf »

Hallo zusammen,

nun, mein Projekt ist weiter vorangeschritten und das Progamm wurde um viele Funktionen erweitert, viele Fehler (der Absturz, siehe oben) behoben, weitere Sicherheits-Checks eingebaut...

Für die, die Interesse an diesem Programm haben,
stelle ich nun das aktuelle Progamm K8055PURE v0.8.2 hier ein !

Wer noch weitere Ideen zu Lauflichtmustern hat, bitte melden. 8 Muster stehen im Progamm zur Verfügung, 4 sind noch nicht belegt (programmiert).

Gruß, Darkwolf

Code: Alles auswählen

;
; ************************************************************************************************
; ***   K8055PURE v0.8.2 (LAST CHANGE: 18 AUGUST 2010) - WRITTEN WITH PUREBASIC BY DARKWOLF!   ***
; ************************************************************************************************
;
; INTRODUCTION:
; THE ORIGINAL PURPOSE WAS TO CREATE A TOOL TO CONTROL MY SELF-MADE LIGHTING CONSOLE,
; BUT THE RESULT WAS A LITTLE TOOLKIT TO INTERFACE YOUR COMPUTER WITH "YOUR WORLD" USING THE
; VELLEMAN K8055 USB-INTERFACE BOARD. THIS PROGARM IS FULLY WRITTEN IN PUREBASIC v4.40 AND THE
; SOURCE-CODE IS INCLUDED TO PROVIDE BEGINNERS AN INSIGHT HOW TO ACCESS THE K8055 - SO THEY
; CAN INCREASE THEIR SKILLS BY CODING NEW PROGRAMS BASED ON MY BASIC TOOL.
;
; AT THE MOMENT ONLY DIGITAL OUT IS INCLUDED, BUT OF COURSE ALL OTHER FUNCTIONS CAN BE ADDED,
; IF YOU LIKE. FEEL FREE TO COMPLETE THIS PROGRAM BY ADDING THESE FUNCTIONS - JUST DOWNLOAD THE
; ASSEMBLING INSTRUCTIONS AND/OR THE K8055D.DLL REFERENCE FROM THE VELLEMAN WEBSITE (LINK BELOW).
;
; THE LIBRARY K8055D.DLL (DELIVERED WITH YOUR K8055, ALSO AVAILABLE IN THE INTERNET) IS
; NECESSARY TO USE THIS PROGRAM. NOTE: IF YOU ARE USING WINDOWS VISTA OR HIGHER, MAKE SURE
; THAT YOU ARE USING REV. 3.0.2.0, OTHERWISE THIS PROGRAM CANNOT WORK PROPERLY.
;
; IMPORTANT:
; THIS PROGRAM COMES WITH ABSOLUTELY NO WARRANTY, FEEL FREE TO DISTRIBUTE THIS COPY TO YOUR
; FRIENDS, AND LAST BUT NOT LEAST: HAVE FUN WITH CRATING YOU OWN PROJECTS USING THIS EXAMPLE !
;
; LINK TO VELLEMAN: http://www.velleman.eu/distributor/products/view/?country=be&lang=en&id=351346
;
; ************************************************************************************************

; ENUMERATION FOR OBJECT-ID´S -> NAMES ARE EASIER TO HANDLE THAN NUMBERS :-)
Enumeration
  #DLL_K8055

  #WINDOW_MAIN
  #WINDOW_HELP
  #WINDOW_ABOUT
  #WINDOW_ERROR

  #MENU_MAIN
  #MENU_CONNECT
  #MENU_DISCONNECT
  #MENU_CLOSE
  #MENU_HELP
  #MENU_ABOUT
  
  #STATUSBAR_MAIN

  #FRAME_CONFIG
  #FRAME_DIGITAL_OUT
  #FRAME_INDICATION
  #FRAME_DELAY

  #CHECKBOX_JUMPER_SK5
  #CHECKBOX_JUMPER_SK6
  #CHECKBOX_INDICATOR_1
  #CHECKBOX_INDICATOR_2
  #CHECKBOX_INDICATOR_3
  #CHECKBOX_INDICATOR_4
  #CHECKBOX_INDICATOR_5
  #CHECKBOX_INDICATOR_6
  #CHECKBOX_INDICATOR_7
  #CHECKBOX_INDICATOR_8

  #BUTTON_CONNECT
  #BUTTON_DISCONNECT
  #BUTTON_ALL_ON
  #BUTTON_ALL_OFF
  #BUTTON_BLINKING
  #BUTTON_RANDOM
  #BUTTON_PATTERN_1
  #BUTTON_PATTERN_2
  #BUTTON_PATTERN_3
  #BUTTON_PATTERN_4
  #BUTTON_PATTERN_5
  #BUTTON_PATTERN_6
  #BUTTON_PATTERN_7
  #BUTTON_PATTERN_8
  #BUTTON_MANUAL_SET
  #BUTTON_MANUAL_RESET
  #BUTTON_INCREASE
  #BUTTON_DECREASE

  #BUTTON_HELP_OK
  #BUTTON_ABOUT_OK
  #BUTTON_ERROR_OK

  #TEXT_HELP_1
  #TEXT_ABOUT_1
  #TEXT_ABOUT_2
  #TEXT_ABOUT_3
  #TEXT_ABOUT_4
  #TEXT_ERROR_1
  #TEXT_ERROR_2
  #TEXT_ERROR_3
  #TEXT_ERROR_4
  
EndEnumeration

; FLAGS FOR THE MAIN WINDOW: CENTERED, INCLUDE CLOSE AND MINIMIZE-BUTTONS
#FLAGS = #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget

; DECLARATION OF GLOBAL VARIABLES
Global QUIT.b = #False       ; VARIABLE FOR EXIT-CONDITION OF MAIN LOOP
Global CONNECTED.b = #False  ; VARIABLE FOR STATUS OF K8055 CONNECTION
Global WAIT_TIME.l = 100     ; VARIABLE FOR DELAY TIME IN MILLISECONDS
Global CardAddress.l = 0     ; VARIABLE FOR CARD-ADDRESS
Global ProgramVersion.s = "v0.8.2" ; STRING FOR PROGRAM VERSION

; INCLUDING AN EXTERNAL PUREBASIC-FILE (CONTAINING THE PROCEDURES)
IncludeFile "Procedures.pbi" ; EXTERNAL PUREBASIC-FILE (CONTAINING THE PROCEDURES)

; TRY TO OPEN THE "K8055D.DLL" LIBRARY, IF THIS FILE IS MISSING, SHOW A MESSAGE AND QUIT PROGRAM
If OpenLibrary(#DLL_K8055, "K8055D.dll") = #False
  Show_Window_DLL_ERROR() ; THIS PROCEDURE OPENS A WINDOW AND REPORTS THAT K8055.DLL IS MISSING
  End
EndIf

; TRY TO CREATE THE MAIN WINDOW, ELSE SHOW A MESSAGE AND QUIT PROGRAM
If OpenWindow(#WINDOW_MAIN, 0, 0, 410, 320, "K8055PURE " + ProgramVersion + " (by DaRkWoLf!)",#FLAGS)

  Frame3DGadget(#FRAME_CONFIG,10,10,100,140,"K8055 Config")

  CheckBoxGadget(#CHECKBOX_JUMPER_SK5, 20, 30, 80 , 20, "Jumper SK5") ; JUMPER FOR K8055-ADDRESS
  CheckBoxGadget(#CHECKBOX_JUMPER_SK6, 20, 50, 80 , 20, "Jumper SK6")
  SetGadgetState(#CHECKBOX_JUMPER_SK5,1) ; ACTIVATE CHECKBOXES BY DEFAULT
  SetGadgetState(#CHECKBOX_JUMPER_SK6,1)
  ButtonGadget(#BUTTON_CONNECT,20,80,80,20,"Connect")
  ButtonGadget(#BUTTON_DISCONNECT,20,110,80,20,"Disconnect")

  Frame3DGadget(#FRAME_DIGITAL_OUT,120,10,280,140,"Digital Outputs - Automatic Control")

  ButtonGadget(#BUTTON_ALL_ON,130,30,80,20,"All On")
  ButtonGadget(#BUTTON_ALL_OFF,130,60,80,20,"All Off")
  ButtonGadget(#BUTTON_BLINKING,130,90,80,20,"Blinking")
  ButtonGadget(#BUTTON_RANDOM,130,120,80,20,"Random")
  ButtonGadget(#BUTTON_PATTERN_1,220,30,80,20,"Pattern 1")
  ButtonGadget(#BUTTON_PATTERN_2,220,60,80,20,"Pattern 2")
  ButtonGadget(#BUTTON_PATTERN_3,220,90,80,20,"Pattern 3")
  ButtonGadget(#BUTTON_PATTERN_4,220,120,80,20,"Pattern 4")
  ButtonGadget(#BUTTON_PATTERN_5,310,30,80,20,"Pattern 5")
  ButtonGadget(#BUTTON_PATTERN_6,310,60,80,20,"Pattern 6")
  ButtonGadget(#BUTTON_PATTERN_7,310,90,80,20,"Pattern 7")
  ButtonGadget(#BUTTON_PATTERN_8,310,120,80,20,"Pattern 8")

  Frame3DGadget(#FRAME_INDICATION,10,160,390,50,"Digital Output Channels - Manual Control")

  CheckBoxGadget(#CHECKBOX_INDICATOR_1, 20, 180, 25 , 20, "1"); CHECKBOXES FOR MANUAL CONTROL
  CheckBoxGadget(#CHECKBOX_INDICATOR_2, 50, 180, 25 , 20, "2")
  CheckBoxGadget(#CHECKBOX_INDICATOR_3, 80, 180, 25 , 20, "3")
  CheckBoxGadget(#CHECKBOX_INDICATOR_4, 110, 180, 25 , 20, "4")
  CheckBoxGadget(#CHECKBOX_INDICATOR_5, 140, 180, 25 , 20, "5")
  CheckBoxGadget(#CHECKBOX_INDICATOR_6, 170, 180, 25 , 20, "6")
  CheckBoxGadget(#CHECKBOX_INDICATOR_7, 200, 180, 25 , 20, "7")
  CheckBoxGadget(#CHECKBOX_INDICATOR_8, 230, 180, 25 , 20, "8")
  ButtonGadget(#BUTTON_MANUAL_SET,260,180,60,20,"Set Ch.")
  ButtonGadget(#BUTTON_MANUAL_RESET,330,180,60,20,"Reset All")
  
  Frame3DGadget(#FRAME_DELAY,10,220,210,50,"Delay Settings (Automatic Control)")
  ButtonGadget(#BUTTON_INCREASE,20,240,90,20,"Increase Speed")
  ButtonGadget(#BUTTON_DECREASE,120,240,90,20,"Decrease Speed")
      
  If CreateMenu(#MENU_MAIN, WindowID(#WINDOW_MAIN)); TRY TO CREATE THE MAIN WINDOWS MENU

    MenuTitle("File")
    MenuItem(#MENU_CONNECT, "Connect K8055")
      MenuItem(#MENU_DISCONNECT, "Disconnect K8055")
      MenuBar(); THIS COMMAND CREATES A SEPARATOR
      MenuItem(#MENU_CLOSE, "Quit" + #TAB$ + "Ctrl+Q"); A MENU ENTRY WITH SHORTCUT

; CREATES A SHORTCUT TO CLOSE THE PROGRAM WITH CTRL+Q
      AddKeyboardShortcut(#WINDOW_MAIN,#PB_Shortcut_Control|#PB_Shortcut_Q,#MENU_CLOSE)

    MenuTitle("Help")
    MenuItem(#MENU_HELP, "K8055PURE Help" + #TAB$ + "F1")
      MenuBar()
      MenuItem(#MENU_ABOUT, "About K8055PURE")
      AddKeyboardShortcut(#WINDOW_MAIN,#PB_Shortcut_F1,#MENU_HELP)

  EndIf

  If CreateStatusBar (#STATUSBAR_MAIN, WindowID(#WINDOW_MAIN))
    AddStatusBarField (90)
    AddStatusBarField (110)
    AddStatusBarField (#PB_Ignore)
  EndIf

  StatusBarText (#STATUSBAR_MAIN, 1, " Actual Delay: " + Str(WAIT_TIME))
  StatusBarText (#STATUSBAR_MAIN, 2, " Digital Output Indicator: 0 0 0 0 0 0 0 0 ")
    
; BEGIN OF THE MAIN-LOOP
  Repeat

; DE-/ACTIVATION OF BUTTONS & TEXT ACCORDING TO THE STATUS OF K8055 CONNECTION
    If CONNECTED = #True ; CONDITION, IF CONNECTED TO K8055
    StatusBarText (#STATUSBAR_MAIN, 0, " Connected ! ")

    DisableGadget (#BUTTON_CONNECT, 1)
    DisableGadget (#BUTTON_DISCONNECT, 0)

    DisableGadget (#BUTTON_ALL_ON, 0)
    DisableGadget (#BUTTON_ALL_OFF, 0)
    DisableGadget (#BUTTON_BLINKING, 0)
    DisableGadget (#BUTTON_RANDOM, 0)
    DisableGadget (#BUTTON_PATTERN_1, 0)
    DisableGadget (#BUTTON_PATTERN_2, 0)
    DisableGadget (#BUTTON_PATTERN_3, 0)
    DisableGadget (#BUTTON_PATTERN_4, 0)
    DisableGadget (#BUTTON_PATTERN_5, 0)
    DisableGadget (#BUTTON_PATTERN_6, 0)
    DisableGadget (#BUTTON_PATTERN_7, 0)
    DisableGadget (#BUTTON_PATTERN_8, 0)
    
    DisableGadget (#CHECKBOX_INDICATOR_1, 0)
    DisableGadget (#CHECKBOX_INDICATOR_2, 0)
    DisableGadget (#CHECKBOX_INDICATOR_3, 0)
    DisableGadget (#CHECKBOX_INDICATOR_4, 0)
    DisableGadget (#CHECKBOX_INDICATOR_5, 0)
    DisableGadget (#CHECKBOX_INDICATOR_6, 0)
    DisableGadget (#CHECKBOX_INDICATOR_7, 0)
    DisableGadget (#CHECKBOX_INDICATOR_8, 0)

    DisableGadget (#BUTTON_MANUAL_SET, 0)
    DisableGadget (#BUTTON_MANUAL_RESET, 0)
    
    DisableGadget (#BUTTON_INCREASE, 0)
    DisableGadget (#BUTTON_DECREASE, 0)
    
    DisableMenuItem (#MENU_MAIN, #MENU_CONNECT, 1)
    DisableMenuItem (#MENU_MAIN, #MENU_DISCONNECT, 0)

  Else                    ; CONDITION, IF NOT CONNECTED TO K8055
    StatusBarText (#STATUSBAR_MAIN, 0, " Disconnected ! ")

    DisableGadget (#BUTTON_CONNECT, 0)
    DisableGadget (#BUTTON_DISCONNECT, 1)

    DisableGadget (#BUTTON_ALL_ON, 1)
    DisableGadget (#BUTTON_ALL_OFF, 1)
    DisableGadget (#BUTTON_BLINKING, 1)
    DisableGadget (#BUTTON_RANDOM, 1)
    DisableGadget (#BUTTON_PATTERN_1, 1)
    DisableGadget (#BUTTON_PATTERN_2, 1)
    DisableGadget (#BUTTON_PATTERN_3, 1)
    DisableGadget (#BUTTON_PATTERN_4, 1)
    DisableGadget (#BUTTON_PATTERN_5, 1)
    DisableGadget (#BUTTON_PATTERN_6, 1)
    DisableGadget (#BUTTON_PATTERN_7, 1)
    DisableGadget (#BUTTON_PATTERN_8, 1)
    
    DisableGadget (#CHECKBOX_INDICATOR_1, 1)
    DisableGadget (#CHECKBOX_INDICATOR_2, 1)
    DisableGadget (#CHECKBOX_INDICATOR_3, 1)
    DisableGadget (#CHECKBOX_INDICATOR_4, 1)
    DisableGadget (#CHECKBOX_INDICATOR_5, 1)
    DisableGadget (#CHECKBOX_INDICATOR_6, 1)
    DisableGadget (#CHECKBOX_INDICATOR_7, 1)
    DisableGadget (#CHECKBOX_INDICATOR_8, 1)
                    
    DisableGadget (#BUTTON_MANUAL_SET, 1)
    DisableGadget (#BUTTON_MANUAL_RESET, 1)
        
    DisableGadget (#BUTTON_INCREASE, 1)
    DisableGadget (#BUTTON_DECREASE, 1)
    
    DisableMenuItem (#MENU_MAIN, #MENU_CONNECT, 0)       
    DisableMenuItem (#MENU_MAIN, #MENU_DISCONNECT, 1)
  
  EndIf
    
; WAITING FOR AN EVENT
  EventID.l = WaitWindowEvent()
   
; PROCESSING THE WINDOW-EVENT WITH NESTED SELECT-CASE COMMANDS
    Select EventID

      Case #PB_Event_Gadget

; CODE-SEGMENT FOR GADGET EVENTS (BUTTONS)
        Select EventGadget()

          Case #BUTTON_CONNECT
            CardAddress = 3 - (GetGadgetState(#CHECKBOX_JUMPER_SK5) + (GetGadgetState(#CHECKBOX_JUMPER_SK6) *2))
            Connect_Result = CallCFunction(#DLL_K8055, "OpenDevice",CardAddress)
            Select Connect_Result
             Case 0,1,2,3
               CONNECTED = #True
               MessageRequester("Information", "Card " + Str(CardAddress) + " successfully connected !", 0)
             Case -1
                MessageRequester("Error", "Card " + Str(CardAddress) + " not found !", 0)
             EndSelect

          Case #BUTTON_DISCONNECT
            If CallFunction(#DLL_K8055, "CloseDevice",0)
              CONNECTED = #False
              MessageRequester("Information", "Successfully disconnected !", 0)
            Else
              MessageRequester("Error", "Problems while disconnecting !", 0)
            EndIf

          Case #BUTTON_ALL_ON
            CallFunction(#DLL_K8055, "SetAllDigital")

          Case #BUTTON_ALL_OFF
            CallFunction(#DLL_K8055, "ClearAllDigital")

          Case #BUTTON_BLINKING
            ;For count.l = 0 To 4
            CallFunction(#DLL_K8055, "SetAllDigital") : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "ClearAllDigital") : Delay(WAIT_TIME)
            ;Next count

          Case #BUTTON_RANDOM
            CallFunction(#DLL_K8055, "ClearAllDigital")
            ;For count.l = 0 To 16
              CallFunction(#DLL_K8055, "WriteAllDigital",Random (254) + 1) : Delay(WAIT_TIME)
              CallFunction(#DLL_K8055, "ClearAllDigital") : Delay(WAIT_TIME)
            ;Next count

          Case #BUTTON_PATTERN_1
            CallFunction(#DLL_K8055, "WriteAllDigital",1) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",2) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",4) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",8) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",16) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",32) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",64) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",128) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "ClearAllDigital")

          Case #BUTTON_PATTERN_2
            CallFunction(#DLL_K8055, "ClearAllDigital")
            For count.l = 0 To 8
              CallFunction(#DLL_K8055, "SetDigitalChannel",count) : Delay(WAIT_TIME)
              CallFunction(#DLL_K8055, "ClearDigitalChannel",count) : Delay(WAIT_TIME)
            Next count

          Case #BUTTON_PATTERN_3
            CallFunction(#DLL_K8055, "SetAllDigital")
            For count.l = 0 To 8
              CallFunction(#DLL_K8055, "SetDigitalChannel",count) : Delay(WAIT_TIME)
              CallFunction(#DLL_K8055, "ClearDigitalChannel",count) : Delay(WAIT_TIME)
            Next count

          Case #BUTTON_PATTERN_4
            CallFunction(#DLL_K8055, "WriteAllDigital",1) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",3) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",6) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",12) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",24) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",48) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",96) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",192) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "WriteAllDigital",128) : Delay(WAIT_TIME)
            CallFunction(#DLL_K8055, "ClearAllDigital")

          Case #BUTTON_PATTERN_5
            MessageRequester("Information", "Not implented error !", 0)             

          Case #BUTTON_PATTERN_6
            MessageRequester("Information", "Not implented error !", 0)           

          Case #BUTTON_PATTERN_7
            MessageRequester("Information", "Not implented error !", 0)           

          Case #BUTTON_PATTERN_8
            MessageRequester("Information", "Not implented error !", 0)           

          Case #BUTTON_MANUAL_SET
            MessageRequester("Information", "Not implented error !", 0)            

          Case #BUTTON_MANUAL_RESET
            CallFunction(#DLL_K8055, "ClearAllDigital")
            SetGadgetState(#CHECKBOX_INDICATOR_1,0)
            SetGadgetState(#CHECKBOX_INDICATOR_2,0)
            SetGadgetState(#CHECKBOX_INDICATOR_3,0)
            SetGadgetState(#CHECKBOX_INDICATOR_4,0)
            SetGadgetState(#CHECKBOX_INDICATOR_5,0)
            SetGadgetState(#CHECKBOX_INDICATOR_6,0)
            SetGadgetState(#CHECKBOX_INDICATOR_7,0)
            SetGadgetState(#CHECKBOX_INDICATOR_8,0)

         Case #BUTTON_INCREASE
         WAIT_TIME - 10
         If WAIT_TIME < 0
           WAIT_TIME = 0
         EndIf
         StatusBarText (#STATUSBAR_MAIN, 1, " Actual Delay: " + Str(WAIT_TIME))
         
         Case #BUTTON_DECREASE
         WAIT_TIME + 10
         StatusBarText (#STATUSBAR_MAIN, 1, " Actual Delay: " + Str(WAIT_TIME))
        
        EndSelect

      Case #PB_Event_Menu

; CODE-SEGMENT FOR MENU EVENTS
        Select EventMenu()

          Case #MENU_CONNECT
            CardAddress = 3 - (GetGadgetState(#CHECKBOX_JUMPER_SK5) + (GetGadgetState(#CHECKBOX_JUMPER_SK6) *2))
            Connect_Result = CallCFunction(#DLL_K8055, "OpenDevice",CardAddress)
            Select Connect_Result
             Case 0,1,2,3
               CONNECTED = #True
               MessageRequester("Information", "Card " + Str(CardAddress) + " successfully connected !", 0)
             Case -1
                MessageRequester("Error", "Card " + Str(CardAddress) + " not found !", 0)
             EndSelect

          Case #MENU_DISCONNECT
            If CallFunction(#DLL_K8055, "CloseDevice",0)
              CONNECTED = #False
              MessageRequester("Information", "Successfully disconnected !", 0)
            Else
              MessageRequester("Error", "Problems while disconnecting !", 0)
            EndIf

          Case #MENU_CLOSE
            QUIT= #True

          Case #MENU_HELP
            Show_Window_Help()

          Case #MENU_ABOUT
            Show_Window_About()

        EndSelect

    EndSelect

; EXIT CONDITION FOR MAIN LOOP
  Until EventID = #PB_Event_CloseWindow Or QUIT = #True

; RESETTING AND DISCONNECTING THE K8055, CLOSE THE LIBRARY AND THE MAIN WINDOW
  CallFunction(#DLL_K8055, "ClearAllDigital") ; RESETS THE DIGITAL OUTOUTS TO INITIAL CONDITION
  CallFunction(#DLL_K8055, "CloseDevice") ; CLOSED THE CONNECTION TO THE K8055
  CloseLibrary(#DLL_K8055) ; REMOVES THE "K8055D.DLL" LIBRARY FROM MEMORY
  CloseWindow(#WINDOW_MAIN) ; CLOSES THE MAIN WINDOW

; THIS SEGMENT WILL BE EXECUTED, IF THERE OCCURS AN ERROR WHILE CREATING THE MAIN WINDOW
Else
  MessageRequester("Error", "Can't initialize main window !", 0)
EndIf

; PROGRAM END
End
Darkwolf
Beiträge: 5
Registriert: 23.07.2010 09:10

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von Darkwolf »

und natürlich die Procedures.pbi dazu...

um das Progamm zu starten, baucht ihr natürlich auch die K8055.DLL (z.B. von der Velleman Website)

Code: Alles auswählen

;
; ***************************************************************
; *** THIS FILE CONTAINS THE PRODECURES REQUIRED BY K8055PURE ***
; ***************************************************************

Procedure Show_Window_About()
  If OpenWindow(#WINDOW_ABOUT, 0, 0, 350, 190, "Über K8055PURE", #PB_Window_ScreenCentered)
    TextGadget (#TEXT_ABOUT_1, 10, 10, 340 , 20, "K8055PURE " + ProgramVersion + " - erstellt am 18.08.2010 von DaRkWoLf")
    TextGadget (#TEXT_ABOUT_2, 10, 40, 340 , 40, "Die K8055D.DLL (von Velleman) ist zum Betrieb erforderlich. Ab Windows Vista wird die K8055.DLL Rev. 3.0.2.0 benötigt !")
    TextGadget (#TEXT_ABOUT_3, 10, 80, 340 , 40, "Die Benutzung meiner Programme erfolgt trotz gewissenhafter Programmierung auf eigene Gefahr.")
    TextGadget (#TEXT_ABOUT_4, 10, 120, 340 , 40, "Das Programm darf kostenlos verwendet und weitergegeben werden. Verbesserungen an dem Quellcode dieser Software sind erwünscht.")              
    ButtonGadget(#BUTTON_ABOUT_OK,130,160,80,20,"OK")
    Repeat : Until WaitWindowEvent () = #PB_Event_Gadget
    CloseWindow(#WINDOW_ABOUT)
  Else
    MessageRequester("Fehler", "Kann Programmfenster nicht Initialisieren...", 0)
  EndIf
EndProcedure

Procedure Show_Window_Help()
  If OpenWindow(#WINDOW_HELP, 0, 0, 350, 180, "K8055PURE Hilfe", #PB_Window_ScreenCentered)
  TextGadget (#TEXT_HELP_1, 10, 10, 350 , 20, "Die Hilfefunktion dieser Software steht leider noch nicht zur Verfügung!")
  ButtonGadget(#BUTTON_HELP_OK,130,150,80,20,"OK")
  Repeat : Until WaitWindowEvent () = #PB_Event_Gadget
  CloseWindow(#WINDOW_HELP)
  Else
  MessageRequester("Fehler", "Kann Programmfenster nicht Initialisieren...", 0)
  EndIf
EndProcedure

Procedure Show_Window_DLL_ERROR()
  If OpenWindow(#WINDOW_ERROR, 0, 0, 350, 190, "Fehlermeldung", #PB_Window_ScreenCentered)
  TextGadget (#TEXT_ERROR_1, 10, 10, 340 , 20, "Die K8055D.DLL (von Velleman) wurde nicht gefunden!")
  TextGadget (#TEXT_ERROR_2, 10, 40, 340 , 40, "Die K8055D.DLL (von Velleman) wurde nicht gefunden!")
  TextGadget (#TEXT_ERROR_3, 10, 80, 340 , 40, "Die K8055D.DLL (von Velleman) wurde nicht gefunden!")
  TextGadget (#TEXT_ERROR_4, 10, 120, 340 , 40, "Die K8055D.DLL (von Velleman) wurde nicht gefunden!")              
  ButtonGadget(#BUTTON_ERROR_OK,130,160,80,20,"OK")
  Repeat : Until WaitWindowEvent () = #PB_Event_Gadget
  CloseWindow(#WINDOW_ERROR)
  Else
  MessageRequester("Fehler", "Die K8055D.DLL (von Velleman) wurde nicht gefunden!", 0)
  EndIf
EndProcedure
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Re: Programm zur Anstreuerung des VELLEMAN K8055 USB BOARD

Beitrag von SoS »

Wenn Du die K8055D.DLL benutzt, dann benutze auch CallFunction denn mit Call C Function so wie bei Dir, wird das nix. ;)

Hab auch mal schnell was blinkendes zusammengezimmert.

Code: Alles auswählen

; Source generiert durch DLL2PBLib
; Copyright 2005 by Thomas Schulz (TS-Soft)


; Globale Variablen deklaration
Global ClearAllAnalog.l
Global ClearAllDigital.l
Global ClearAnalogChannel.l
Global ClearDigitalChannel.l
Global CloseDevice.l
Global OpenDevice.l
Global OutputAllAnalog.l
Global OutputAnalogChannel.l
Global ReadAllAnalog.l
Global ReadAllDigital.l
Global ReadAnalogChannel.l
Global ReadCounter.l
Global ReadDigitalChannel.l
Global ResetCounter.l
Global SearchDevices.l
Global SetAllAnalog.l
Global SetAllDigital.l
Global SetAnalogChannel.l
Global SetCounterDebounceTime.l
Global SetCurrentDevice.l
Global SetDigitalChannel.l
Global Version.l
Global WriteAllDigital.l

; Init-Funktion
ProcedureDLL K8055DDLL_Init()
  Shared K8055DDLL.l
  K8055DDLL = LoadLibrary_("K8055D.DLL")
  If K8055DDLL
    ClearAllAnalog = GetProcAddress_(K8055DDLL, "ClearAllAnalog")
    ClearAllDigital = GetProcAddress_(K8055DDLL, "ClearAllDigital")
    ClearAnalogChannel = GetProcAddress_(K8055DDLL, "ClearAnalogChannel")
    ClearDigitalChannel = GetProcAddress_(K8055DDLL, "ClearDigitalChannel")
    CloseDevice = GetProcAddress_(K8055DDLL, "CloseDevice")
    OpenDevice = GetProcAddress_(K8055DDLL, "OpenDevice")
    OutputAllAnalog = GetProcAddress_(K8055DDLL, "OutputAllAnalog")
    OutputAnalogChannel = GetProcAddress_(K8055DDLL, "OutputAnalogChannel")
    ReadAllAnalog = GetProcAddress_(K8055DDLL, "ReadAllAnalog")
    ReadAllDigital = GetProcAddress_(K8055DDLL, "ReadAllDigital")
    ReadAnalogChannel = GetProcAddress_(K8055DDLL, "ReadAnalogChannel")
    ReadCounter = GetProcAddress_(K8055DDLL, "ReadCounter")
    ReadDigitalChannel = GetProcAddress_(K8055DDLL, "ReadDigitalChannel")
    ResetCounter = GetProcAddress_(K8055DDLL, "ResetCounter")
    SearchDevices = GetProcAddress_(K8055DDLL, "SearchDevices")
    SetAllAnalog = GetProcAddress_(K8055DDLL, "SetAllAnalog")
    SetAllDigital = GetProcAddress_(K8055DDLL, "SetAllDigital")
    SetAnalogChannel = GetProcAddress_(K8055DDLL, "SetAnalogChannel")
    SetCounterDebounceTime = GetProcAddress_(K8055DDLL, "SetCounterDebounceTime")
    SetCurrentDevice = GetProcAddress_(K8055DDLL, "SetCurrentDevice")
    SetDigitalChannel = GetProcAddress_(K8055DDLL, "SetDigitalChannel")
    Version = GetProcAddress_(K8055DDLL, "Version")
    WriteAllDigital = GetProcAddress_(K8055DDLL, "WriteAllDigital")
	EndIf
EndProcedure
; End-Funktion
ProcedureDLL K8055DDLL_End()
  Shared K8055DDLL.l
  FreeLibrary_(K8055DDLL)
EndProcedure
; Allgemeine Funktionen
ProcedureDLL.l ClearAllAnalog()
  ProcedureReturn CallFunctionFast(ClearAllAnalog)
EndProcedure

ProcedureDLL.l ClearAllDigital()
  ProcedureReturn CallFunctionFast(ClearAllDigital)
EndProcedure

ProcedureDLL.l ClearAnalogChannel(a.l)
  ProcedureReturn CallFunctionFast(ClearAnalogChannel,a)
EndProcedure

ProcedureDLL.l ClearDigitalChannel(a.l)
  ProcedureReturn CallFunctionFast(ClearDigitalChannel,a)
EndProcedure

ProcedureDLL.l CloseDevice()
  ProcedureReturn CallFunctionFast(CloseDevice)
EndProcedure

ProcedureDLL.l OpenDevice(a.l)
  ProcedureReturn CallFunctionFast(OpenDevice,a)
EndProcedure

ProcedureDLL.l OutputAllAnalog(a.l,b.l)
  ProcedureReturn CallFunctionFast(OutputAllAnalog,a,b)
EndProcedure

ProcedureDLL.l OutputAnalogChannel(a.l,b.l)
  ProcedureReturn CallFunctionFast(OutputAnalogChannel,a,b)
EndProcedure

ProcedureDLL.l ReadAllAnalog(a.l,b.l)
  ProcedureReturn CallFunctionFast(ReadAllAnalog,a,b)
EndProcedure

ProcedureDLL.l ReadAllDigital()
  ProcedureReturn CallFunctionFast(ReadAllDigital)
EndProcedure

ProcedureDLL.l ReadAnalogChannel(a.l)
  ProcedureReturn CallFunctionFast(ReadAnalogChannel,a)
EndProcedure

ProcedureDLL.l ReadCounter(a.l)
  ProcedureReturn CallFunctionFast(ReadCounter,a)
EndProcedure

ProcedureDLL.l ReadDigitalChannel(a.l)
  ProcedureReturn CallFunctionFast(ReadDigitalChannel,a)
EndProcedure

ProcedureDLL.l ResetCounter(a.l)
  ProcedureReturn CallFunctionFast(ResetCounter,a)
EndProcedure

ProcedureDLL.l SearchDevices()
  ProcedureReturn CallFunctionFast(SearchDevices)
EndProcedure

ProcedureDLL.l SetAllAnalog()
  ProcedureReturn CallFunctionFast(SetAllAnalog)
EndProcedure

ProcedureDLL.l SetAllDigital()
  ProcedureReturn CallFunctionFast(SetAllDigital)
EndProcedure

ProcedureDLL.l SetAnalogChannel(a.l)
  ProcedureReturn CallFunctionFast(SetAnalogChannel,a)
EndProcedure

ProcedureDLL.l SetCounterDebounceTime(a.l,b.l)
  ProcedureReturn CallFunctionFast(SetCounterDebounceTime,a,b)
EndProcedure

ProcedureDLL.l SetCurrentDevice(a.l)
  ProcedureReturn CallFunctionFast(SetCurrentDevice,a)
EndProcedure

ProcedureDLL.l SetDigitalChannel(a.l)
  ProcedureReturn CallFunctionFast(SetDigitalChannel,a)
EndProcedure

ProcedureDLL.l Version()
  ProcedureReturn CallFunctionFast(Version)
EndProcedure

ProcedureDLL.l WriteAllDigital(a.l)
  ProcedureReturn CallFunctionFast(WriteAllDigital,a)
EndProcedure

K8055DDLL_Init()
h=OpenDevice(0)
Debug h
For xy=0 To 10
  For x=1 To 8
    ClearAllDigital()
    SetDigitalChannel(x)
    SetDigitalChannel(9-x)
    Delay(5)
	Next
Next
;SetAllDigital()
ClearAllDigital()
If h>=0
  Delay (2000)
  CloseDevice()
EndIf
Antworten