Sida 1 av 2

Velleman K8055 och VB

Postat: 7 november 2007, 06:40:13
av MSV
Vet att detta har avandlats tidigare, men jag gav nog upp innan jag fick någon klarhet i det hela.

Jag har Vellemans usb i/o-kort som jag försöker programmera med Visual Basic 2005 express ed. och lyckas inte med detta. Är det någon här som vet om det går med express versionen, eller ska man använda någon annan version?

Tacksam för alla tips!

Postat: 7 november 2007, 16:23:05
av Mathias@Åland
Ett exempel:

Kod: Markera allt

Public Class Form1

    Private Declare Function OpenDevice Lib "k8055d.dll" (ByVal CardAddress As Integer) As Integer
    Private Declare Sub CloseDevice Lib "k8055d.dll" ()
    Private Declare Function ReadAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer) As Integer
    Private Declare Sub ReadAllAnalog Lib "k8055d.dll" (ByRef Data1 As Integer, ByRef Data2 As Integer)
    Private Declare Sub OutputAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer, ByVal Data As Integer)
    Private Declare Sub OutputAllAnalog Lib "k8055d.dll" (ByVal Data1 As Integer, ByVal Data2 As Integer)
    Private Declare Sub ClearAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer)
    Private Declare Sub SetAllAnalog Lib "k8055d.dll" ()
    Private Declare Sub ClearAllAnalog Lib "k8055d.dll" ()
    Private Declare Sub SetAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer)
    Private Declare Sub WriteAllDigital Lib "k8055d.dll" (ByVal Data As Integer)
    Private Declare Sub ClearDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer)
    Private Declare Sub ClearAllDigital Lib "k8055d.dll" ()
    Private Declare Sub SetDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer)
    Private Declare Sub SetAllDigital Lib "k8055d.dll" ()
    Private Declare Function ReadDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer) As Boolean
    Private Declare Function ReadAllDigital Lib "k8055d.dll" () As Integer
    Private Declare Function ReadCounter Lib "k8055d.dll" (ByVal CounterNr As Integer) As Integer
    Private Declare Sub ResetCounter Lib "k8055d.dll" (ByVal CounterNr As Integer)
    Private Declare Sub SetCounterDebounceTime Lib "k8055d.dll" (ByVal CounterNr As Integer, ByVal DebounceTime As Integer)
    Private Declare Sub Version Lib "k8055d.dll" ()
    Private Declare Function SearchDevices Lib "k8055d.dll" () As Byte
    Private Declare Function SetCurrentDevice Lib "k8055d.dll" (ByVal CardAddress As Integer) As Byte

    Const CARD_ADDRESS As Byte = 0              'Card address = 0

    Private Sub test()

        OpenDevice(CARD_ADDRESS)                'Connect to card

        SetAllDigital()                         'All digital outputs ON
        OutputAllAnalog(50, 255)                'Analog output 1 = 50, analog output 2 = 255

        System.Threading.Thread.Sleep(1000)     'Wait 1s

        ClearAllDigital()                       'All digital outputs OFF
        ClearAllAnalog()                        'Both analog outputs OFF

        CloseDevice()                           'Disconnect

    End Sub

    Private Sub testButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles testButton.Click
        test()
    End Sub

    Private Sub exitButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles exitButton.Click
        Me.Close()
    End Sub

End Class
Velleman har den senaste DLL-filen här.

Lägg K8055D.DLL i samma mapp som programmet eller i systemmappen.

Postat: 7 november 2007, 21:05:50
av MSV
Tackar!
villken version är det skrivet i, vet du om det funkar med express?

/Micke

Postat: 7 november 2007, 22:14:14
av Mathias@Åland
Koden är skriven i VB.NET 2005 Express. :)

Postat: 8 november 2007, 01:08:19
av MSV
Nu börjar det lossna, har lyckats få det fungera mer än sist jag provade!
Har bara kört fast på en detalj, har du lust att ge mig ett exempel på att läsa en ingång t.ex. tänd utgång 5 när ingång 1 påverkas.

Postat: 8 november 2007, 01:33:23
av Khaki
Lägg till en Timer som läser av ingång1

Kod: Markera allt

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If ReadDigitalChannel(1) = True Then
            SetDigitalChannel(5)
        Else
            ClearDigitalChannel(5)
        End If

    End Sub
Nånting sånt?

Postat: 8 november 2007, 20:38:13
av MSV
Tackar, men varför timer? Får något konstigt felmeddelande när jag provar koden, vad kan det vara?

Postat: 8 november 2007, 21:19:43
av speakman
Nog för att MS är som dom är, men står det verkligen "Något konstigt felmeddelande" när du kör koden?

Postat: 8 november 2007, 21:34:51
av MSV
:lol: Förlåt mig, så här står det:
Handles clause requires a WithEvents variable defined in the containing type or one of its base types.

Vad menas??

Postat: 8 november 2007, 22:07:45
av Khaki
Har du lagt till en Timer från Toolboxen till din "Form"?
Eller har du bara lagt till koden?

Postat: 8 november 2007, 22:46:09
av MSV
Tidigare har Mathias testprogram fungerat perfekt, nu helt plötsligt så reagerar programmet jättelångsamt, det tar 5 sek fråndet att jag klickar tills utgångarna tänds. När jag avslutar programmet så får jag meddelandet "Runtime Error 210 at 00009C34"

...orkar snart inte mer..... :evil:

Postat: 8 november 2007, 23:17:55
av grubs
Jag är dålig på VB, men spontant:

Programmet reagerar långsamt för att du har satt timern för snabbt, om du kör timern på högsta hastighet så kommer programmet inte att hinna med annat än att kolla ingång 1.

Om du avslutar programmet utan att stänga av timern så kan jag tänka mig att du får något felmeddelande.

Postat: 8 november 2007, 23:54:30
av MSV
Har provat samma program i en annan dator, då fungerar det utmärkt!
Det får väl ligga till sig under natten så kanske det fungerar :?

Postat: 9 november 2007, 00:08:11
av grubs
Var det en snabbare dator du testade på sen/annan ver. på operativsystem?
Körde du en kompilerad fil eller var det i "utvecklingsmiljön" och var det samma i båda fallen?

Postat: 9 november 2007, 00:39:38
av Khaki
>Om du avslutar programmet utan att stänga av timern så kan jag tänka mig att du får något felmeddelande.

Nej, det får man inte men däremot får du felmeddelande om du inte "stänger" kontakten med kortet med hjälp av "CloseDevice()".
Lägg till en Avsluta-knapp så slipper du det irritationsmomentet i alla fall.

Kod: Markera allt

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        CloseDevice()

    End Sub