Münzprüfer - Interop.cctalk.dll korrekt bedienen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von WI'ler.

    Münzprüfer - Interop.cctalk.dll korrekt bedienen

    Hallo liebe Gemeinde,

    ich bin gerade dabei ein kleines Programm zu schreiben, um meine VB-Kenntnisse zu erweitern. Ich habe vor einen Münzprüfer der Firma WH Modell 800 v6 (USB - somit cctalk) an das Programm anzubinden.

    Ich habe es geschafft, per Interop.cctalk.dll eine Verbindung aufzubauen und den Münzprüfer auf Daten abzufragen. Es werden Modell, Hersteller etc angezeigt. Leider bekomme ich es nicht hin, den Münzeinwurf abzufragen. Hat eventuell jemand Erfahrung damit?
    Herzlich willkommen im Forum. :thumbup:
    Die Interop.cctalk.dll ist eine .NET-Wrapper-DLL für die COM-DLL / das OCX cctalk.dll (oder so).
    Hast Du eine Beschreibung der DLL / des Interfaces?
    Ansonsten musst Du Dich über die IDE rantasten (sehen, was für Prozeduren mit welchen Parametern sie anbietet).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für deine Antwort.

    Ich habe hier ein Beispielcode zum Abrufen des Münzeinwurfwertes.
    Mir ist wichtig, wie ich den Parameter "Channel" an das Sub liefern kann,
    also um es anders auszudrücken den Wert vom Münzprüfer erhalten kann.

    Nachdem ich die Verbindung zum Münzprüfer aufgebaut habe, werden die Münzen akzeptiert,
    nur leider kriege ich keinen Wert angezeigt.

    VB.NET-Quellcode

    1. Private Sub cc_CoinEvent(ByVal Channel As Byte)
    2. Me.txt_cctalk_kanal.Text = Conversion.Str(Channel)
    3. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „WI'ler“ ()

    Ich kann das cc_CoinEvent nicht auslösen. Ich habe es zur Sicherheit nochmal überprüft und
    bin mir nun sicher, dass cc_CoinEvent keinen Wert durch die Property erhält.

    Der Handler scheint nicht zu funktionieren (habe ich aus einem dekompilierten Programm übernommen, ist wohl fehlerhaft).

    Wie müsste er korrekterweise aussehen?

    VB.NET-Quellcode

    1. Public Overridable Property cc As CcctalkPM
    2. Get
    3. Return Me._cc
    4. End Get
    5. Set(ByVal WithEventsValue As CcctalkPM)
    6. Dim handler As _IcctalkPMEvents_CoinEventEventHandler = New _IcctalkPMEvents_CoinEventEventHandler(AddressOf Me.cc_CoinEvent)
    7. If (Not Me._cc Is Nothing) Then
    8. Me._cc.remove_CoinEvent(handler)
    9. End If
    10. Me._cc = WithEventsValue
    11. If (Not Me._cc Is Nothing) Then
    12. Me._cc.add_CoinEvent(handler)
    13. End If
    14. End Set
    15. End Property


    cc_CoinEvent

    VB.NET-Quellcode

    1. Private Sub cc_CoinEvent(ByVal Channel As Byte)
    2. Me.txt_cctalk_kanal.Text = Conversion.Str(Channel)
    3. End Sub


    _IcctalkPMEvents

    VB.NET-Quellcode

    1. <ComImport, Guid("35623AF4-1B90-4320-9A08-E41D2021465E"), TypeLibType(CShort(&H1000)), InterfaceType(CShort(2))> _
    2. Public Interface _IcctalkPMEvents
    3. <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime), DispId(2)> _
    4. Sub CoinEvent(<[In]> ByVal Channel As Byte)


    _IcctalkPMEvents_CoinEventEventHandler

    VB.NET-Quellcode

    1. <TypeLibType(CShort(&H10)), ComVisible(False)> _
    2. Public Delegate Sub _IcctalkPMEvents_CoinEventEventHandler(<[In]> ByVal Channel As Byte)


    add & remove CoinEvent

    VB.NET-Quellcode

    1. <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)> _
    2. Sub add_CoinEvent(ByVal _IcctalkPMEvents_CoinEventEventHandler)
    3. Sub remove_CoinEvent(ByVal _IcctalkPMEvents_CoinEventEventHandler)


    Bin für jede Hilfe dankbar. Sitze schon seit einem ganzen Tag daran. :wacko: :thumbsup:

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „WI'ler“ ()

    Nimm mal bitte die rote Farbe aus Deinem letzten Post, die ist den Moderatoren vorbehalten.
    Hast Du den Thread versehentlich geschlossen? Nach Deinem nächsten Beitrag ist er wieder offen.
    Um zu testen, ob ein Handler funktioniert, musst Du lediglich einen Haltepunkt (F9) reinsetzen, da kannst Du Dir auch den Wert der Variablen ansehen (klick drauf, Shift+F9).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du musst nicht meinen ganzen Post zitieren, das wird von den Moderatoren gelöscht.
    Sieh Dir mal im unterbrochenen Zustand das Menü Debuggen im Studio an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Leider habe ich das Ganze mit dem Haltepunkt nicht hinbekommen, also mir wurde kein Wert angezeigt.

    Wo müsste ich den Haltepunkt ansetzen?

    Beim Debuggen erhalte ich keine Fehlermeldungen.

    Könntest du dir das mal anschauen, wenn ich dir die nötigen Dateien zukommen lassen würde?

    Das dürfte nur ein minimaler Fehler sein.

    VB.NET-Quellcode

    1. Private Sub cc_CoinEvent(ByVal Channel As Byte)
    2. Me.txt_cctalk_kanal.Text = Conversion.Str(Channel) ' hier drauf klicken und dann F9 drücken
    3. End Sub

    Es geht beim Debuggen nicht darum, Fehlermeldungen zu bekommen, sondern den Programmablauf zu testen und den Inhalt von Variablen zu überwachen.
    Das Debuggen setzt an, wenn die Fehlermeldungen überwunden wurden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Tut mir Leid, ich bin ein wenig verwirrt, da ich mich schon zeitlich etwas länger mit der Materie befasse.

    Also das Debugging hat mir bestätigt, dass kein Parameter an cc_CoinEvent übergeben wird.

    Zur Sicherheit habe ich nochmals cc_CoinEvent manuell einen Parameter zugeteilt. In dem Fall wird der Wert korrekt angezeigt.

    WI'ler schrieb:

    Also das Debugging hat mir bestätigt, dass kein Parameter an cc_CoinEvent übergeben wird.
    :?: :?: :?:
    Wie äußert sich das?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es wird kein Wert bei "txt_cctalk_kanal.Text = Conversion.Str(Channel)" angezeigt.

    Wenn ich den Parameter manuell zuweise, erscheint eine 1.

    EDIT:

    Um es nochmal auf den Punkt zu bringen...

    Es besteht eine laufende Verbindung zum Münzprüfer, was durch cc.connect(0) ausgelöst wird.
    Nun erwartet cc_cointevent jedoch einen Parameter, der beim Münzprüfer abgefragt werden muss.
    Und zwar den Wert, welcher Kanal angesprochen wird, wenn eine Münze durchläuft. Solange der Parameter nicht übergeben wird, startet das Sub auch nicht. Dadurch erhalte ich auch keinen Wert in "txt_cctalk_kanal".

    Die Frage ist: Wie?

    Ich habe hier ein anderes Tool, welches die selbe Aufgabe hat. Da läuft es einwandfrei.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „WI'ler“ ()

    WI'ler schrieb:

    Es wird kein Wert bei "txt_cctalk_kanal.Text = Conversion.Str(Channel)" angezeigt.

    Poste davon bitte mal einen Screenshot.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Channel hat den Wert 1.
    Die 2. Zeile kannst Du so schreiben:

    VB.NET-Quellcode

    1. kanal = Channel
    Welcher Wert da möglich und sinnvoll ist, kann ich leider nicht sagen, meine Glaskugel ist nicht für Münzerkennung geeicht. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe das Problem endlich lösen können.

    Wie vermutet hatte sich in den Handler ein Fehler eingeschlichen.

    Für alle, die es auch interessiert.

    Deklaration:

    VB.NET-Quellcode

    1. Private WithEvents cc As New CcctalkPM


    CoinEvent "wesentlicher Teil":

    VB.NET-Quellcode

    1. Private Sub cc_CoinEvent(ByVal channel As Byte) Handles cc.CoinEvent
    2. Me.BeginInvoke(Sub() ccwert.Text = Conversion.Str(channel))
    3. End Sub