RaiseEvent-Anweisung

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von West.

    RaiseEvent-Anweisung

    Hallo zusammen,

    ich brauch mal wieder eure Hilfe. Folgendes ich möchte eine ModbusTCP Verbindung aufbauen. Ich hatte eine Beispiel-Code gefunden und wollte diesen in meine Projekt integrieren und erweitern.
    Vielen Dank für eure Hilfe.

    Ich bekomme eine Fehlermeldung die ich nicht deuten kann auch schon bei Google gesucht:

    Fehler 107 "Public Event OnResponseData(id As UShort, unit As Byte, function As Byte, data() As Byte)" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen.

    Source-Code:

    Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
    Try
    ' Create new modbus master and add event functions
    MBmaster = New Master(txtIP.Text, 502)
    MBmaster.OnResponseData += New ModbusTCP.Master.ResponseData(AddressOf MBmaster_OnResponseData)
    'MBmaster.OnException += New ModbusTCP.Master.ExceptionData(AddressOf MBmaster_OnException)
    ResizeData()
    ' Show additional fields, enable watchdog
    Catch [error] As SystemException
    MessageBox.Show([error].Message)
    End Try
    End Sub


    Private Sub MBmaster_OnResponseData(ByVal ID As UShort, ByVal unit As Byte, ByVal [function] As Byte, ByVal values As Byte())
    ' ------------------------------------------------------------------
    ' Seperate calling threads
    If Me.InvokeRequired Then
    Me.BeginInvoke(New Master.ResponseData(AddressOf MBmaster_OnResponseData), New Object() {ID, unit, [function], values})
    Return
    End If

    ' ------------------------------------------------------------------------
    ' Identify requested data
    Select Case ID
    Case 1
    grpData.Text = "Read coils"
    data = values
    ShowAs(Nothing, Nothing)
    Exit Select
    Case 2
    grpData.Text = "Read discrete inputs"
    data = values
    ShowAs(Nothing, Nothing)
    Exit Select
    Case 3
    grpData.Text = "Read holding register"
    data = values
    ShowAs(Nothing, Nothing)
    Exit Select
    Case 4
    grpData.Text = "Read input register"
    data = values
    ShowAs(Nothing, Nothing)
    Exit Select
    Case 5
    grpData.Text = "Write single coil"
    Exit Select
    Case 6
    grpData.Text = "Write multiple coils"
    Exit Select
    Case 7
    grpData.Text = "Write single register"
    Exit Select
    Case 8
    grpData.Text = "Write multiple register"
    Exit Select
    End Select
    End Sub

    West schrieb:

    VB.NET-Quellcode

    1. MBmaster.OnResponseData += New ModbusTCP.Master.ResponseData(AddressOf MBmaster_OnResponseData)
    2. 'MBmaster.OnException += New ModbusTCP.Master.ExceptionData(AddressOf MBmaster_OnException)
    Hier versuchst Du, C#-like in VB.NET Eventhandler zuzuweisen.
    In VB.NET gibt es dafür die AddHandler-Anweisung.
    Gugst Du hier.
    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!

    West schrieb:

    So ganz verstehe ich es nicht.
    Dann solltest Du Dich mal mit Events in .NET, unterschieden zwischen C# und VB.NET befassen, damit wir eine gemeinsame Sprache sprechen.
    Events-Tutorial C#
    Events-Tutorial VB.NET
    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!

    VB.NET-Quellcode

    1. Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
    2. Try
    3. ' Create new modbus master and add event functions
    4. MBmaster = New Master(txtIP.Text, 502)
    5. MBmaster.OnResponseData += New ModbusTCP.Master.ResponseData(AddressOf MBmaster_OnResponseData)
    6. 'MBmaster.OnException += New ModbusTCP.Master.ExceptionData(AddressOf MBmaster_OnException)
    7. ResizeData()
    8. 'grpExchange.Visible = True
    9. ' Show additional fields, enable watchdog
    10. Catch [error] As SystemException
    11. MessageBox.Show([error].Message)
    12. End Try
    13. End Sub


    VB.NET-Quellcode

    1. Private Sub MBmaster_OnResponseData(ByVal ID As UShort, ByVal unit As Byte, ByVal [function] As Byte, ByVal values As Byte())
    2. ' ------------------------------------------------------------------
    3. ' Seperate calling threads
    4. If Me.InvokeRequired Then
    5. Me.BeginInvoke(New Master.ResponseData(AddressOf MBmaster_OnResponseData), New Object() {ID, unit, [function], values})
    6. Return
    7. End If
    8. ' ------------------------------------------------------------------------
    9. ' Identify requested data
    10. Select Case ID
    11. Case 1
    12. grpData.Text = "Read coils"
    13. data = values
    14. ShowAs(Nothing, Nothing)
    15. Exit Select
    16. Case 2
    17. grpData.Text = "Read discrete inputs"
    18. data = values
    19. ShowAs(Nothing, Nothing)
    20. Exit Select
    21. Case 3
    22. grpData.Text = "Read holding register"
    23. data = values
    24. ShowAs(Nothing, Nothing)
    25. Exit Select
    26. Case 4
    27. grpData.Text = "Read input register"
    28. data = values
    29. ShowAs(Nothing, Nothing)
    30. Exit Select
    31. Case 5
    32. grpData.Text = "Write single coil"
    33. Exit Select
    34. Case 6
    35. grpData.Text = "Write multiple coils"
    36. Exit Select
    37. Case 7
    38. grpData.Text = "Write single register"
    39. Exit Select
    40. Case 8
    41. grpData.Text = "Write multiple register"
    42. Exit Select
    43. End Select
    44. End Sub
    tja, was meint wohl der Kommentar in Listing1, zeile#3?

    Willst du nun programmieren lernen, oder sollen wir deinen Code korrigieren?

    Letzteres hat keinen Sinn, denn dann proggen wir dein Programm. Du wirst nun sicher sagen, wenn wir nur diesmal deinen Code korrigieren, dann lernst du es ganz bestimmt.
    Aber die Erfahrung zeigt, dass die Leuts von sowas nix lernen, ausser, dass sie das Forum nutzen können, um ihre aus dem INet zusammenkopierten Codes zu korrigieren.

    Also ich würd sagen, Tutorials zum Thema event adden hast du nun genug, nun zeig mal, dass du auch programmieren kannst.

    Oder meinetwegen noch ein Hinweis: In vb - anders als in c# - added man ein Event mittels des AddHandler-Schlüsselwortes.
    Aber das steht auch in den Tuts, die dir ans Herz gelegt wurden.
    @ErfinderDesRades Jou.
    @West Was ist mit diesem Code?
    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!
    Wollte aus einem alten C#-Projekt den Teil zum Aufbau einer Modbus-Verbindung in einem anderm Vb.Net Projekt nutzen. OPC-Funktioniert, aber einige PLC's können nicht OPC, darum Modbus.
    Habe aber noch andere Lösung gefunden, die nicht so elegant, aber ihren Zweg erfüllt.