(Notfalltaster) Progamm über "input pin" am Parallelport beenden

  • Ich habe folgendes Problem, ich brauch ein Script, dass den Parallelport überwachen soll.
    Das Script soll folgendes machen:
    PIN 11 und PIN 12 sind jeweils, über "ground"(PIN 25), an ein Relais angeschlossen.
    Wenn das erste Relais schliesst, soll z.B. ein laufendes Programm beendet werden.
    Wenn das zweite Relais schliesst, soll z.B. der Computer herunterfahren.
    Ich weiss, dass ich es über eine dll (inpout32.dll) aufrufen muss:

    [autoit]


    DllCall("inpout32.dll", "int", "indp32", "int", 0x378)

    [/autoit]


    oder

    [autoit]


    DllCall( "inpout32.dll", "int", "Out32", "int", 0x378)

    [/autoit]

    Damit überwache ich den Parallelport, aber wie kann ich einzelne PIN's überwachen?

    6 Mal editiert, zuletzt von tohu74 (18. Juli 2011 um 23:16)

  • Danke BugFix

    So lernt man nebenbei noch Spanisch. :D
    Hab mal rauskopiert, was ich für mein Projekt brauche. Ich hoffe ich hab alles gekriegt.
    Muss noch die Variablen umbenennen, damit das ganze verständlicher wird.
    Aber für einen ersten Test reicht es aus.
    Wenn ich das Script starte und der Wert, der zurück gegeben wird "1" ist, soll ja nichts passieren, sodern erst wenn der Wert "0" ist.
    Dies funktioniert auch, aber das Script wird im RAM immer grösser!
    Hab ich was vergessen? ( If $GamaDeEstadoDelRegistro[4] = "0" Then)

    Spoiler anzeigen
    [autoit]


    ;************************************************
    ;Hier beginnen die internen Funktion
    ;************************************************
    ;Variablen setzen
    $DLLyRuta = @ScriptDir & "\inpout32.dll";löschen @ ScriptDir, wenn Sie die DLL im System-Verzeichnis halten wollen, um zu vermeiden,dass das die Dll im gleiche Verzeichnis ist, wie das Skript
    $DireccionDelPuerto = "0x378"; die Standard-LPT1 in den meisten Maschinen
    ;berechnet die Adressregistrierung
    Dim $EstadoDelRegistroDeDirecciones, $ControlDeDireccionDelPuerto
    CalcularRegistroDeDirecciones($DireccionDelPuerto)

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

    While 1
    Sleep ( 10 )
    ;Liesst das Statusregister
    $GamaDeEstadoDelRegistro = LeerEstadoDelPuerto($EstadoDelRegistroDeDirecciones)
    $VisorDeCadenasDelRegistro = "Registro de estado @ " & $EstadoDelRegistroDeDirecciones & "Bit4 = " & $GamaDeEstadoDelRegistro[4] & " (Pin 13)"
    If $GamaDeEstadoDelRegistro[4] = "0" Then
    MsgBox(0, "Test","Das ist ein Test")
    Exit

    EndIf
    WEnd
    Exit

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

    ;Funktionen Parallel-Port -> XD wo die Action ist!
    Func LeerEstadoDelPuerto($LeerDireccion)
    ;Liesst das Register (gibt BCD)
    $EstadoActualDelPuerto = DllCall($DLLyRuta, "int", "Inp32", "int", $LeerDireccion)
    $EstadoParaDecodificar = $EstadoActualDelPuerto[0]
    ;macht das Start bit und zeichnet Serie auf
    Dim $LeerBits[9]; [0] -> [7] decodiert die Bits, [8] Rohwert BCD
    $LeerBits[8] = $EstadoActualDelPuerto[0]
    $BitActual = 128
    For $ContraBit = 7 To 0 Step - 1
    If $EstadoParaDecodificar >= $BitActual Then
    $LeerBits[$ContraBit] = 1
    $EstadoParaDecodificar = $EstadoParaDecodificar - $BitActual
    Else
    $LeerBits[$ContraBit] = 0
    EndIf
    $BitActual = $BitActual / 2
    Next
    ;testet, ob korrekte Dekodierung erreicht wird
    ; If $EstadoParaDecodificar <> 0 Then
    ; MsgBox(0, "Decoding-Fehler", "Fehler Decoding-Port '" & $DireccionDelPuerto & "' Register '" & $LeerDireccion & " Status '" & $EstadoActualDelPuerto[0] & "' bits. ;Verlassen Sie sich nicht auf die Ergebnisse.")
    ; EndIf
    Return $LeerBits
    EndFunc ;==>LeerEstadoDelPuerto

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

    Func CalcularRegistroDeDirecciones($DireccionBase)
    ;berechnet den Zustand der Adresse Registrierung
    $RawHex = Hex(Dec(StringTrimLeft($DireccionBase, 2)) + 1)
    While 1
    If StringLeft($RawHex, 1) = "0" Then
    $RawHex = StringTrimLeft($RawHex, 1)
    Else
    ExitLoop
    EndIf
    WEnd
    $EstadoDelRegistroDeDirecciones = "0x" & $RawHex
    EndFunc ;==>CalcularRegistroDedirecciones

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Auf dem PC, wo ich das Script getestet habe, habe ich auch keinen Parallelport. Ich probier das Script mal auf einem anderen PC mit Parallelport.
    Muss sowieso zuerst einen Schalter basteln um das Script richtig testen zu können.
    Habe vorher nur den Wert von

    [autoit]


    If $GamaDeEstadoDelRegistro[4] = "0" Then

    [/autoit]


    von Hand auf 1 gestellt, um zu schauen was passiert.
    So, wenn der Wert 1 zurückgegeben wird, wird die devinierte Funktion also als Bsp:

    [autoit]


    MsgBox(0, "Test","Das ist ein Test")
    Exit

    [/autoit]


    ausgeführt.

    Danke Dir für die schnelle Anwort. :thumbup:

  • So, hab das Script auf einem PC mit Parallelport getestet. Dort bläht sich das Script nicht auf. :rolleyes:
    Jetzt heisst es ab zu Conrad, um einen Schalter für den Parallelport zu basteln....

  • Mit zwei Kabeln wäre es ein bisschen umständlich. :P
    Nein, Spass beiseite...
    Habe es mit zwei Litzen probiert und es funktionierte. :rock:

    Danke Euch..

    Einmal editiert, zuletzt von tohu74 (18. Juli 2011 um 16:24)

  • Hier noch das Script von der spanischen Sprache befreit. ;)

    Spoiler anzeigen
    [autoit]


    ;************************************************
    ;Hier beginnen die internen Funktion des scipt
    ;************************************************
    ;Variablen setzen
    $DLLroute = @ScriptDir & "\inpout32.dll";löschen @ ScriptDir, wenn Sie die DLL im System-Verzeichnis halten wollen, um zu vermeiden,dass das die Dll im gleiche Verzeichnis ist, wie das Skript
    $portadresse = "0x378"; die Standard-LPT1 in den meisten Maschinen
    ;berechnet die Adressregistrierung
    Dim $adressenregistry, $controllportadresse
    berechnen_der_adressregistry($portadresse)

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

    While 1
    Sleep ( 10 )
    ;Liesst das Statusregister
    $arealregistry = PortStatus($adressenregistry)
    $vierwerregistrystring = "registrierungsstatus @ " & $adressenregistry & "Bit4 = " & $arealregistry[4] & " (Pin 13)"
    If $arealregistry[4] = "0" Then
    MsgBox(0, "Test","Das ist ein Test") ;hier die Funktion definieren die man möchte
    Exit

    EndIf
    WEnd
    Exit

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

    ;Funktionen Parallel-Port -> XD wo die Action ist!
    Func PortStatus($adressread)
    ;Liesst das Register (gibt BCD)
    $aktuellerportstatus = DllCall($DLLroute, "int", "Inp32", "int", $adressread)
    $codestandort = $aktuellerportstatus[0]
    ;macht das Start bit und zeichnet Serie auf
    Dim $readbits[9]; [0] -> [7] decodiert die Bits, [8] Rohwert BCD
    $readbits[8] = $aktuellerportstatus[0]
    $currentbit = 128
    For $bitcounter = 7 To 0 Step - 1
    If $codestandort >= $currentbit Then
    $readbits[$bitcounter] = 1
    $codestandort = $codestandort - $currentbit
    Else
    $readbits[$bitcounter] = 0
    EndIf
    $currentbit = $currentbit / 2
    Next
    ;testet, ob korrekte Dekodierung erreicht wird
    ;If $codestandort <> 0 Then
    ; MsgBox(0, "Decoding-Fehler", "Fehler Decoding-Port '" & $portadresse & "' Register '" & $adressread & " Status '" & $aktuellerportstatus[0] & "' bits. Verlassen Sie sich nicht auf die Ergebnisse.")
    ;EndIf
    Return $readbits
    EndFunc ;==>PortStatus

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

    Func berechnen_der_adressregistry($basisadresse)
    ;berechnet den Zustand der Adresse Registrierung
    $RawHex = Hex(Dec(StringTrimLeft($basisadresse, 2)) + 1)
    While 1
    If StringLeft($RawHex, 1) = "0" Then
    $RawHex = StringTrimLeft($RawHex, 1)
    Else
    ExitLoop
    EndIf
    WEnd
    $adressenregistry = "0x" & $RawHex
    EndFunc ;==>berechnen_der_adressregistry

    [/autoit]

    So liesst es sich einbisschen einfacher.