Steuerbefehle für "IO-Warrior" zum Aktivieren von Relais in USB-Relaiskarte

  • VB6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Steuerbefehle für "IO-Warrior" zum Aktivieren von Relais in USB-Relaiskarte

    Vorab-Hinweis: Diese Frage ist eigentlich nur zu beantworten, wenn man den "IO-Warrior" kennt bzw. die Programmierung mit der "iowkit.dll" (ich verwende davon Version 1.5.0).

    Zu meinem Anliegen:

    Ich habe eine USB-Relaiskarte ("RK10-USB" der Firma "GWR-Elektronik"). Darin ist der Controller "IO-Warrior24" der Firma "Code Mercenaries" verbaut.

    Mit der Relaiskarte steuere ich einen Motor an. Das 1. Relais startet/stoppt den Motor und das 2. Relais dient zur Bestimmung der Laufrichtung (links- oder rechtsrum).

    Code Mercenaries bietet ein recht umfangreiches SDK an. Sogar mit Beispielen für Visual Basic 6 (so wie ich's benötige).

    Leider wird eine Sache aber nicht ganz klar, und das ist meine jetzige Frage:

    Welche Befehle, also welchen Wert, muss ich zur separaten Schaltung der beiden Relais an den IO-Warrior senden?

    Ursprünglich hatte ich einfach "0" für "Aus" und "1" für "An" getestet (was nicht ging). Nun stellte ich aber fest, dass es streng genommen 255 für Aus und 0 für An sein muss. Aber das klappt auch nicht. Das 2. Relais lässt sich gar nicht schalten und das erste funktioniert mit den korrekten Werten auch nicht bzw. nur teilweise.

    Wenn ich allerdings in einem beiliegenden Beispielprogramm (auch in VB6 geschrieben) "FF" (für 255) bzw. "00" zum IO-Warrior sende, so schaltet sich der Motor korrekt an und aus. Allerdings kann ich das 2. Relais gar nicht ansteuern!

    Es liegt im SDK ein Beispielprogramm bei, für das es leider keinen Quellcode gibt. Die Datei heißt "Simple IO.exe". Damit kann ich den Motor beliebig an- und ausschalten und auch die Laufrichtung ändern. Nur was sendet dieses Programm? Das müsste ich wissen.

    Hat jemand Ahnung davon? Ich habe mich schon im Herstellerforum (von Code Mercenaries) registriert, leider muss dort eine Freischaltung manuell erfolgen und das dauert...
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    slice schrieb:

    Hast du es mal mit "F0" und "0F" probiert?

    Werde ich gleich mal testen.

    ThuCommix schrieb:

    Schau doch einfach mal den Code im ILSpy an?

    Da ich das Programm nicht kannte, habe ich kurz gegoogelt. Handelt es sich um einen .NET-Decompiler? Das Programm, welches korrekt arbeitet, wurde in C++ geschrieben.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Bisher habe ich es nicht hinbekommen. Ich habe nun aber entdeckt, dass bei den vielen Beispielprogrammen im SDK auch ein funktionierendes mit Code dabei ist, geschrieben in Delphi. Zwar kenne ich eigentlich Delphi, da ich damit von 2001 bis 2006 täglich programmiert habe, aber trotzdem habe ich eine Umsetzung in VB6 bisher nicht hinbekommen.

    Die einzige wirklich relevante Stelle im Delphi-Quellcode ist das hier:

    Quellcode

    1. procedure TMainForm.LEDClick(Sender: TObject);
    2. var
    3. LEDByte: Integer;
    4. I: Integer;
    5. Report: IOWKIT56_IO_REPORT;
    6. begin
    7. if not Assigned(IOWarrior) then
    8. Exit;
    9. // initialize report to not interfere with input
    10. FillChar(Report, IOWKIT56_IO_REPORT_SIZE, $FF);
    11. Report.ReportID := 0;
    12. // the LEDs are connected to different ports
    13. case Pid of
    14. IOWKIT_PID_IOW40:
    15. LEDByte := 3;
    16. IOWKIT_PID_IOW24:
    17. LEDByte := 0;
    18. IOWKIT_PID_IOW56:
    19. LEDByte := 6;
    20. else
    21. LEDByte := 0;
    22. end;
    23. for I := Low(LEDs) to High(LEDs) do
    24. // translate SpeedButton state into correct bit in the byte
    25. // IO-Warrior uses negative logic
    26. if LEDs[I].Down then
    27. // set the bit to 0 to switch the LED on
    28. Report.Bytes[LEDByte] := Report.Bytes[LEDByte] and not (1 shl I)
    29. else
    30. // set the bit to 1 to switch the LED off
    31. Report.Bytes[LEDByte] := Report.Bytes[LEDByte] or (1 shl I);
    32. // write the bits to the IO-Warrior
    33. case Pid of
    34. IOWKIT_PID_IOW40:
    35. IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT40_IO_REPORT_SIZE);
    36. IOWKIT_PID_IOW24:
    37. IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT24_IO_REPORT_SIZE);
    38. IOWKIT_PID_IOW56:
    39. IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT56_IO_REPORT_SIZE);
    40. end;
    41. end;


    Ganz konkret die Zeilen Report.Bytes[LEDByte] := Report.Bytes[LEDByte] and not (1 shl I) fürs Einschalten der Relais und Report.Bytes[LEDByte] := Report.Bytes[LEDByte] or (1 shl I); zum Ausschalten. Mein VB6-Pendant dazu sieht wie folgt aus:

    Visual Basic-Quellcode

    1. Private Sub iowWrite(ByVal motor As Byte, ByVal richtung As Byte)
    2. ' Write value
    3. Dim Res As Long
    4. Dim N As Long
    5. Dim Pid As Long
    6. Pid = IowKitGetProductId(iowHandles(0))
    7. If Pid = IOWKIT_PID_IOW24 Then
    8. N = 3
    9. Else
    10. If Pid = IOWKIT_PID_IOW40 Then
    11. N = 5
    12. Else
    13. If Pid = IOWKIT_PID_IOW56 Then
    14. N = 8
    15. End If
    16. End If
    17. End If
    18. ' Report ID 0
    19. data(0) = 0
    20. If motor = 0 Then
    21. data(1) = data(1) Or (ShiftLeft(1, 0))
    22. Else
    23. data(1) = data(1) And Not (ShiftLeft(1, 0))
    24. End If
    25. If richtung = 0 Then
    26. data(2) = data(2) Or (ShiftLeft(1, 1))
    27. Else
    28. data(2) = data(2) And Not (ShiftLeft(1, 1))
    29. End If
    30. ' Write to IOW
    31. Res = IowKitWrite(iowHandles(0), IOW_PIPE_IO_PINS, data(0), N)
    32. ' Handle error
    33. If Res <> N Then
    34. ' You can get error code from GetLastError()
    35. MsgBox "ioWarrior: Write to IOW failed!", 0, "Error"
    36. End If
    37. End Sub


    Konkret die Zeilen unter data(0) = 0. Den Motor ein- und ausschalten kann ich nun, aber das 2. Relais, zur Steuerung der Drehrichtung, lässt sich partout nicht umschalten. Das ShiftLeft ist übrigens von hier: vb-tec.de/bitshift.htm#left
    Die Werte data(1..7) wurden mit &HFF initialisiert.

    Ich muss zugeben, dass ich mich mit Bit"schubsereien" nicht wirklich auskenne.

    Hat jemand eine Idee? Ich kann gerne weitere Quellcodes nachreichen, falls diese zu einer Lösung führen können.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Da ich jetzt das Delphi-Programm habe, brauche ich das C-Programm nicht mehr dekompilieren. Nur bekomme ich es ja trotzdem nicht hin. ;)

    EDIT: Mittlerweile wurde ich im erwähnten Hersteller-Forum freigeschaltet und konnte dort meine Frage stellen. Bisher habe ich auch dort keine Lösung gefunden. Hier geht's zum Thread: forum.codemercs.com/viewtopic.php?f=2&t=1794
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich habe nun endlich eine Lösung! Bekommen habe ich die hier (schon gestern, aber heute habe ich die erst kapiert): forum.codemercs.com/viewtopic.php?f=2&t=1794

    Trotzdem danke!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()