Event aus DLL (nModbus) abfragen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Event aus DLL (nModbus) abfragen

    Hallo,

    ich hab grad mal mit Hilfe von nmodbus einen Modbus TCP Slave (Server) erstellt.
    Mein Problem ist die Abfrage des Events "DataStoreReadFrom", in der Hilfe steht nicht mehr wie diese Zeile die ich unwissender weise einfach mal in mein Programm eingebaut habe:

    Quellcode

    1. Public Event DataStoreReadFrom As EventHandler(Of DataStoreEventArgs)


    Sinn des ganzen ist das ich genau Wissen will das ein Master liest und schreibt, was mit den beiden Event funktionieren soll. Nur wie ich die Abfragen soll verstehe ich nicht.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO.Ports
    3. Imports System.Net
    4. Imports System.Net.Sockets
    5. Imports System.Threading
    6. Imports System.Data
    7. Imports Modbus
    8. Imports Modbus.Device
    9. Imports Modbus.Data
    10. Imports Modbus.Utility
    11. Imports Modbus.Extensions
    12. Public Class Form1
    13. Public Event DataStoreReadFrom As EventHandler(Of DataStoreEventArgs)
    14. Public Event DataStoreWrittenTo As EventHandler(Of DataStoreEventArgs)
    15. Dim slave As Modbus.Device.ModbusTcpSlave
    16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    17. Dim slaveID As Byte = 1
    18. Dim port As Integer = 502
    19. Dim IPAddresse As IPAddress = IPAddress.Parse("0.0.0.0")
    20. Dim slaveTcpListener As New TcpListener(IPAddresse, port)
    21. Try
    22. slaveTcpListener.Start()
    23. slave = Device.ModbusTcpSlave.CreateTcp(slaveID, slaveTcpListener)
    24. slave.DataStore = DataStoreFactory.CreateDefaultDataStore()
    25. slave.Listen()
    26. 'Thread.Sleep(Timeout.Infinite)
    27. Catch
    28. End Try
    29. End Sub
    30. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    31. Try
    32. slave.DataStore.HoldingRegisters.Item(1) = slave.DataStore.HoldingRegisters.Item(1) + 1
    33. TextBox2.Text = ModbusUtility.GetSingle(slave.DataStore.HoldingRegisters.Item(2), slave.DataStore.HoldingRegisters.Item(3))
    34. Catch
    35. End Try
    36. Try
    37. 'Ab Register 100 Date & Time
    38. slave.DataStore.HoldingRegisters.Item(101) = Now.Year.ToString
    39. slave.DataStore.HoldingRegisters.Item(102) = Now.Month.ToString
    40. slave.DataStore.HoldingRegisters.Item(103) = Now.Day.ToString
    41. slave.DataStore.HoldingRegisters.Item(104) = Now.Hour.ToString
    42. slave.DataStore.HoldingRegisters.Item(105) = Now.Minute.ToString
    43. slave.DataStore.HoldingRegisters.Item(106) = Now.Second.ToString
    44. Catch
    45. End Try
    46. End Sub
    47. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    48. SetIEEE(TextBox1.Text)
    49. End Sub
    50. Public Function SetIEEE(ByVal Wert As String) As Boolean
    51. Dim bytes(3) As Byte
    52. Try
    53. bytes = BitConverter.GetBytes(CSng(Wert)) ' String --> Single --> Byte-Array
    54. slave.DataStore.HoldingRegisters.Item(2) = System.BitConverter.ToUInt16(bytes, 2) ' 2-Byte --> UInt16 (1Register)
    55. slave.DataStore.HoldingRegisters.Item(3) = System.BitConverter.ToUInt16(bytes, 0) ' 2-Byte --> UInt16 (1Register)
    56. Return True
    57. Catch
    58. MsgBox("Falsche Eingabe !")
    59. Return False
    60. End Try
    61. End Function
    62. End Class
    Ich hatte das ungefähr so versucht, funktioniert aber nicht:

    VB.NET-Quellcode

    1. Private Sub MasterReadRequest(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyClass.DataStoreReadFrom
    2. MsgBox("Read")
    3. End Sub


    Bin ich da wenigstens auf dem richtigen Weg oder mache ich da grundsätzlich etwas falsch ?

    ErfinderDesRades schrieb:

    fehlerzeile, fehlermeldung?

    (Bitte! niemals eine Frage mit "funktioniert nicht"! Man kann immer diese beiden wesentlichen Angaben machen - selbst wenn man sie nicht machen kann, ist das eine interessante Angabe)


    Oh, entschuldige. Mit funktioniert nicht meine ich das einfach nichts passiert. Keine Fehlermeldung und demnach auch keine Fehlerzeile.
    jo, wichtige Angabe, weil jetzt merke ich: Du abonnierst nicht das Event von Slave (s. post#2) sondern iein anneres Event. Es ist aberdoch das Modbus-Teil, dessen Event du behandeln möchtest.

    PS: gleich der nächste Post-Tipp: unnötige Vollzitate sind unnötig. (Jaja - ich Nervensäge, und bei PostCount 3 sollteman allenfalls "herzlich Willkommen" sagen, und nicht rum-meckern, aber ich hab jetzt schon mittm Gemecker angefangen, jetz bleibicherstmal dabei ;))
    guck dein post#3 an, was steht in der Handles-Klausel?

    Du kannst dich auch mal vernünftig darüber informieren: Den Cursor im Editor auf "Handles" setzen, und dann F1 drücken.

    Btw: wieso hat dir dein Chef nicht beigebracht, wie man VisualStudio bedient? Weil ohne die IDE zu kennen wirds ziemlich mühsam.
    Wenn du Slave wie EDR bereits beschrieben hat mit "WithEvents" deklarierst, kannst du dir schon in der IDE alle Events anschauen.
    Siehe Bild im Anhang.

    Du wählst links das Objekt aus und rechts werden die alle verfügbaren Events aufgelistet..

    Du kannst dann einfach auf das Event klicken, und die IDE erzeugt dir die entsprechende Methode mit der KORREKTEN handles Klausel.
    Wenn du das dann mit deinem Handler vergleichst, wirst du den Fehler selber erkennen.

    Ciao
    Bilder
    • Example.PNG

      26,42 kB, 1.136×814, 233 mal angesehen
    Das ist meine Signatur und sie wird wunderbar sein!
    ich empfehle dir dieses Buch Lesen.

    Monos Bildchen hat einen Partikel der IDE aufgezeigt, den man eiglich vorraussetzen muß, will man proggen.
    einen anneren Partikel habichja genannt: "Den Cursor im Editor auf "Handles" setzen, und dann F1 drücken." - hastes mal gemacht?
    Es gibt viiiele weitere so Sachen, die's auf jeden Fall gilt, kennenzulernen - mein pers. Favorit ist der ObjectBrowser.

    Um die IDE besser zu beleuchten musstenich das ganze Buch lesen, aber einschlägige Kapitel.
    Ich hab mir die dll mal kurz angeschaut,
    die beiden Events die du verwenden willst gehören zur Klasse Modbus.Data.DataStore.

    //EDIT: Kann mich grundsätzlich dem EDR nur anschliessen.
    Der ObjectBrowser ist ein sehr gutes Hilfsmittel.
    Dort kannst du dir übersichtlich alle Klassen/Namespaces etc. die du verwendest anschauen
    Das ist meine Signatur und sie wird wunderbar sein!