K8055 Board - Abfrage ob Taster gedrückt?

  • Hi Leute!
    Ich weiß ich hab schon ein Thread wo ich das als Antwort geschrieben hab, aber nochmal:
    Kann ich eine Abfrage in Autoit machen, die ein Skriptteil ausführt, wenn ich die Taster Inp1 bis Inp5 auf der Platine drücke? Also so oder änlich?:

    [autoit]


    If ReadDigitalChannel("Inp1") = 1 Then
    ;Skriptteil
    EndIf

    [/autoit]


    So funzt das aufjedenfall nicht.
    Und noch ein Problem:
    Die UDF von vivus funzt auch nicht, folgende Meldung kommt:

    Spoiler anzeigen


    D:\AutoIt3\Include\k8055udf.au3 (59) : ==> Subscript used with non-Array variable.:
    If $result[0] = $address Then
    If $result^ ERROR
    ->17:00:40 AutoIT3.exe ended.rc:1


    Was stimmt mit der UDF nicht und wie kann ich diese Abfrage programmieren?

    Mfg button421

    Meine fertigen Projekte:
    VirtualCash
    Monopoly Digital

    Daran arbeite ich gerade:
    Einem Skript, womit man ohne Programmierkentisse eigene Programme machen kann (habe ich selber früher gesucht :D ) Stand: ||||||||||||||||||||||||| 6%

  • Moin,

    technisch gesehen ist das alles möglich wie du es dargestellt hast.
    Ich habe etwas ähnliches vor, allerdings ist in meinem Fall der Pc der Sender.
    Wie auch immer, du brauchst - ich denke mal die Kommunikation läuft über COM - eine Com-Verbindung in Autoit.
    Daran ist es bei mir immer gescheitert, da ich ein 64bit-System verwende und bisher noch keine COM-UDF ans laufen bekommen habe.
    In Putty waren meine Bemühungen aber fruchtbar, die Kommunikation mit meinem Mikrokontroller funktioniert wunderbar über COM.
    Als nächstes muss du halt deinen Mikrokontroller so programmieren, dass er bei dem entsprechenden Ereigniss eine für Autoit verwertbare Meldung liefert.

    Ich würde jedoch einen Arduino empfehlen, da es m.M.n. mit diesem einfacher ist und man dennoch mehr Möglichkeiten hat.

  • Normalerweise kommt der Fehler nur, wenn DLLCall fehlschlägt. Sprich @error sollte irgendwas ungleich 0 sein. Mach vor die Zeile, in der der Fehler auftritt einfach eine MsgBox oder besser noch ConsoleWrite und lass dir dadurch @error ausgeben.

    Edit: Ok der UDF Fehler lag bei ihm an dem falschen Ort der DLL Datei. Nach dem verschieben gings. Ansonsten war seine DLL scheinbar eine ältere, sodass eine Funktion nicht existierte. Nach ein paar Änderungen klappte es endlich.
    Mit dem anderen Problem konnte ich ihm aber leider nicht helfen.

    Einmal editiert, zuletzt von Carsten8 (25. Juli 2010 um 18:37)

  • hi ..

    hier fiel mein Name ?

    wo liegt den das Problem ?

    von meiner UDF kommt ein Array zurück, dass du auch als solches auswerten musst.

    sonnst kommt natürlich ein Fehler ..

    bye

  • hier noch die neue UDF ( mit Adressierung )

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.0.0
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    handles the k8055d.dll 2009.10.19

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------
    ;#include <k8055d_multi.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Func USB_DLLOpen()
    DllOpen(@ScriptDir & "\" & "k8055D_multi.dll") ; öffnen der DLL
    EndFunc ;==>USB_DLLOpen

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func USB_DLLClose()
    DllClose(@ScriptDir & "\" & "k8055D_multi.dll") ; öffnen der DLL

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>USB_DLLClose

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func initial_board($address)

    [/autoit] [autoit][/autoit] [autoit]

    Local $begin, $result, $dif

    [/autoit] [autoit][/autoit] [autoit]

    $begin = TimerInit()
    Do
    $result = USBOpenDevice($address)
    Sleep(250)

    [/autoit] [autoit][/autoit] [autoit]

    $dif = TimerDiff($begin)

    [/autoit] [autoit][/autoit] [autoit]

    If $dif > "4000" Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    Until $result = 1

    [/autoit] [autoit][/autoit] [autoit]

    ClearAllDigital($address)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(250)

    [/autoit] [autoit][/autoit] [autoit]

    SetDigitalChannel($address, "8")

    [/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(0,"k8055d_multi",$result)

    [/autoit] [autoit][/autoit] [autoit]

    If $result = 1 Then
    Return "1"

    [/autoit] [autoit][/autoit] [autoit]

    Else
    ;MsgBox(0,"k8055d_multi", "fehler bei initialisierung des USB board's" & $address)
    ;MsgBox(0, "k8055d_multi", "Programm wird beendet! mit " & $result)
    ;Exit
    Return "-1"

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>initial_board

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func USBOpenDevice($address)

    [/autoit] [autoit][/autoit] [autoit]

    Local $result

    [/autoit] [autoit][/autoit] [autoit]

    $result = DllCall("k8055D_multi.dll", "long", "OpenDevice", "long", $address)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $result[0] = $address Then
    Return "1"

    [/autoit] [autoit][/autoit] [autoit]

    Else
    ;MsgBox(0, "k8055d_multi", "Keine Verbindung zu USB BOARD ADRESSE " & $address & " !!", 2)
    ;exit
    Return "0"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>USBOpenDevice

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func CloseAllDevice()

    [/autoit] [autoit][/autoit] [autoit]

    Local $result
    $result = DllCall("k8055D_multi.dll", "none", "CloseDevice")
    USB_DLLClose()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>CloseAllDevice

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func SearchDevices()

    [/autoit] [autoit][/autoit] [autoit]

    Local $result
    $result = DllCall("k8055D_multi.dll", "long", "SearchDevices")

    [/autoit] [autoit][/autoit] [autoit]

    Return $result[0]

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>SearchDevices

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func USBCloseDevice($address)
    Local $result

    [/autoit] [autoit][/autoit] [autoit]

    SetCurrentDevice($address)
    $result = DllCall("k8055D_multi.dll", "none", "CloseDevice")
    ;Return ;;$result[0]
    EndFunc ;==>USBCloseDevice

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func ClearAllDigital($address)

    [/autoit] [autoit][/autoit] [autoit]

    Local $result
    SetCurrentDevice($address)
    $result = DllCall("k8055D_multi.dll", "int", "ClearAllDigital")
    EndFunc ;==>ClearAllDigital

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func SetCurrentDevice($address)
    Local $result, $begin, $dif, $ret

    [/autoit] [autoit][/autoit] [autoit]

    $begin = TimerInit()
    Do

    [/autoit] [autoit][/autoit] [autoit]

    $result = DllCall("k8055D_multi.dll", "long", "SetCurrentDevice", "int", $address)

    [/autoit] [autoit][/autoit] [autoit]

    ;ToolTip($address&"="&$result[0],0,0)
    $dif = TimerDiff($begin)

    [/autoit] [autoit][/autoit] [autoit]

    If $dif > "4000" Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    Until $address = $result[0]

    [/autoit] [autoit][/autoit] [autoit]

    ;ToolTip("",0,0)

    [/autoit] [autoit][/autoit] [autoit]

    If $address = $result[0] Then
    ;nix
    Else
    MsgBox(0, "k8055d_multi", "adresse = " & $address & " result = " & $result[0],3)
    $ret = MsgBox(1,"k8055d_multi","Hardware Fehler , Prüfgerät wird neu gestartet in 5 sec",5)
    If $ret = "-1" or $ret = "1" Then
    Shutdown(5)

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return "-1"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>SetCurrentDevice

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func SetDigitalChannel($address, $channel)
    SetCurrentDevice($address)
    DllCall("k8055D_multi.dll", "none", "SetDigitalChannel", "int", $channel)
    EndFunc ;==>SetDigitalChannel

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func ClearDigitalChannel($address, $channel)
    SetCurrentDevice($address)
    DllCall("k8055D_multi.dll", "none", "ClearDigitalChannel", "int", $channel)
    EndFunc ;==>ClearDigitalChannel

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func ReadAnalogChannel($address, $channel)
    Local $result

    [/autoit] [autoit][/autoit] [autoit]

    SetCurrentDevice($address)
    $result = DllCall("k8055D_multi.dll", "int", "ReadAnalogChannel", "int", $channel)
    Return $result[0]
    EndFunc ;==>ReadAnalogChannel

    [/autoit] [autoit][/autoit] [autoit]

    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func ReadAllDigital($address)
    Local $result, $alldigit

    [/autoit] [autoit][/autoit] [autoit]

    SetCurrentDevice($address)
    $alldigit = DllCall("k8055D_multi.dll", "int", "ReadAllDigital")
    Return $alldigit[0]
    EndFunc ;==>ReadAllDigital
    ;---------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func ReadDigitalChannel($address, $sellect)

    [/autoit] [autoit][/autoit] [autoit]

    Local $wert
    Local $channel[6]
    $channel[1] = 0
    $channel[2] = 0
    $channel[3] = 0
    $channel[4] = 0
    $channel[5] = 0

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $wert = ReadAllDigital($address)

    [/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(0,"k8055d_multi",$alldigit[0] & " " & $wert)
    Select

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 0
    $channel[1] = 0
    $channel[2] = 0
    $channel[3] = 0
    $channel[4] = 0
    $channel[5] = 0

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 1
    ;I1
    $channel[1] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 2
    ;I2
    $channel[2] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 3
    ;I1 + I2
    $channel[1] = 1
    $channel[2] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 4
    ;I3
    $channel[3] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 5
    ;I3 + I1
    $channel[1] = 1
    $channel[3] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 6
    ;I3 + I2
    $channel[2] = 1
    $channel[3] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 7
    ;I3 + I2 + I1
    $channel[1] = 1
    $channel[2] = 1
    $channel[3] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 8
    ;I4
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 9
    ;I4 + I1
    $channel[1] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 10
    ;I4 + I2
    $channel[2] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 11
    ;I4 + I2 + I1
    $channel[1] = 1
    $channel[2] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 12
    ;I4 + I3
    $channel[3] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 13
    ;I4 + I3 + I1
    $channel[1] = 1
    $channel[3] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 14
    ;I4 + I3 + I2
    $channel[2] = 1
    $channel[3] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 15
    ;I4 + I3 * I2 + I1
    $channel[1] = 1
    $channel[2] = 1
    $channel[3] = 1
    $channel[4] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 16
    ;I5
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 17
    ;I1
    $channel[1] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 18
    ;I2
    $channel[2] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 19
    ;I1 + I2
    $channel[1] = 1
    $channel[2] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 20
    ;I3
    $channel[3] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 21
    ;I3 + I1
    $channel[1] = 1
    $channel[3] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 22
    ;I3 + I2
    $channel[2] = 1
    $channel[3] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 23
    ;I3 + I2 + I1
    $channel[1] = 1
    $channel[2] = 1
    $channel[3] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 24
    ;I4
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 25
    ;I4 + I1
    $channel[1] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 26
    ;I4 + I2
    $channel[2] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 27
    ;I4 + I2 + I1
    $channel[1] = 1
    $channel[2] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 28
    ;I4 + I3
    $channel[3] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 29
    ;I4 + I3 + I1
    $channel[1] = 1
    $channel[3] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 30
    ;I4 + I3 + I2
    $channel[2] = 1
    $channel[3] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case $wert = 31
    ;I4 + I3 * I2 + I1
    $channel[1] = 1
    $channel[2] = 1
    $channel[3] = 1
    $channel[4] = 1
    $channel[5] = 1

    [/autoit] [autoit][/autoit] [autoit]

    Case Else

    [/autoit] [autoit][/autoit] [autoit]

    $channel[1] = 0
    $channel[2] = 0
    $channel[3] = 0
    $channel[4] = 0
    $channel[5] = 0

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    If $channel[$sellect] = 1 Then
    ; MsgBox(0,"k8055d_multi","return 1")
    Return 1
    Else
    ; MsgBox(0,"k8055d_multi","return 0")
    Return 0

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>ReadDigitalChannel
    ;----------------------------------------------------------------------------

    [/autoit]

    .. ich würde gerne noch die DLL anhängen .. kann aber nix hochladen .. sorry ..
    gib mir ne email-adresse, dann schick ich se dir zu ..