Modbus TCP - Wie die abgefragten Integer-Register-Werte "zusammenbauen" in String, Long, Double, etc...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Modbus TCP - Wie die abgefragten Integer-Register-Werte "zusammenbauen" in String, Long, Double, etc...

    Hallo Leute,

    ich bin gerade dabei die Werte meines Photovoltaik-Wechselrichters per Modbus TPC auszulesen.
    Mit dem entsprechenden Nu-Get Paket (easyModbus) geht das auch relativ einfach:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports EasyModbus
    3. Public Class Form1
    4. Dim ModClient As New ModbusClient
    5. Private Sub Button_Connect_Click(sender As Object, e As EventArgs) Handles Button_Connect.Click
    6. ModClient.IPAddress = TextBox_IP.Text
    7. ModClient.Port = CInt(TextBox_Port.Text)
    8. Try
    9. ModClient.Connect()
    10. If ModClient.Connected = True Then
    11. Label_Status.Text = "Connected."
    12. Button_Connect.Enabled = False
    13. Button_Disconnect.Enabled = True
    14. End If
    15. Catch ex As Exception
    16. Label_Status.Text = "Error Connection!"
    17. End Try
    18. End Sub
    19. Private Sub Button_Disconnect_Click(sender As Object, e As EventArgs) Handles Button_Disconnect.Click
    20. ModClient.Disconnect()
    21. Label_Status.Text = "Disconnected"
    22. Button_Connect.Enabled = True
    23. Button_Disconnect.Enabled = False
    24. End Sub
    25. Private Sub Button_Read_Click(sender As Object, e As EventArgs) Handles Button_Read.Click
    26. Try
    27. Dim RegVals As Integer()
    28. RegVals = ModClient.ReadHoldingRegisters(CInt(TextBox_StartReg.Text), CInt(TextBox_LengthReg.Text))
    29. If RegVals.Length > 0 Then
    30. ListBox_RegValues.Items.Clear()
    31. For Each value As Integer In RegVals
    32. ListBox_RegValues.Items.Add(value)
    33. Next
    34. End If
    35. Catch ex As Exception
    36. End Try
    37. End Sub
    38. End Class


    Mit ​ModClient.ReadHoldingRegisters(start,length) lese ich Integerwerte pro Register aus.

    In der Tabelle anbei sieht man einige Registeradressen und dann den Datentyp und Quantity.
    Leider habe ich keinen Schimmer wie ich die echten Werte (Integer, Double, Long, String) rausbekomme

    Möchte ich als Beispiel nun den Register 30000 auslesen, welcher den Namen des Wechselrichters als String enthält - lese ich da 15 Registerstellen als Integer aus und wandle dann die Integerwerte in je ein Zeichen um?

    Oder Beispielswiese Register 30075 (Maximum aktive power) ist vom Typ U32 (ich nehme an int32 = Long ?)
    Da lese ich 2 Integerwerte aus - wie bekomme ich daraus dann den Longwert.

    Und dann gibts Noch I16, Bitfield16, U16, I32, U32 und UINT32 ...
    Und ob mit STR und STRING das selbe gemeint ist, ist mir auch nicht klar.

    Kann mir da jemand von Euch helfen?
    Bilder
    • 22082022104615.jpg

      209,88 kB, 709×613, 277 mal angesehen
    • 22082022105134.jpg

      267,4 kB, 726×893, 290 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Servus,

    also STR würde ich als STRING interpretieren.
    U16 oder U32 interpretiere ich als Unsigned Integer 16 bit bzw 32 bit. D.h. keine negativen Zahlen
    I16 oder I32 interpretiere ich als Integer 16 bit bzw. 32 bit

    Was liefert den "ModClient.ReadHoldingRegisters" laut Beschreibung für einen DatenTyp zurück? Ich nehme einmal an der/die Rückgabewerte sind vom Typ "Object". Du wirst diese Werte dann wahrscheinlich noch in den richten DatenTyp (String, Uint etc.) umwandeln müssen.

    Bei der Tabelle der Register steht ganz rechts "For Detail see 1.1" Was steht denn dort bzw. wird dort erklärt?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „GerhardW“ ()

    Hallo,

    was mich stutzen lässt, ist dass die Anzahl der Bytes im Register (ich geh mal davon aus dass es Bytes/8Bit sind) nicht mit dem Datentyp übereinsteimmt.

    Bei Nr. 8 steht als Datenyp U32, es sollten also 32Bit und somit 4 Byte sein. Als Anzahl in der Tabelle ist aber 2 angegeben (ich gehe von Byte aus).
    Das passt für mich erst mal nicht zusammen.
    Außer ein Register hat 16Bit dann würde es wieder passen.

    Die Varibale RegVals definierst du als Integer-Array, was dann aber 4Bytes/32Bit pro "Index" wären.
    Das passt für mich dann aber wieder nicht, auch wenn die Regiser 16bit haben sollten, dann würdest du ja 2 Register in einen Integer packen.
    Außer "ReadInputRegisters" gibt dir ein Integer mit 16Bit zurück.


    Also für mich wäre erst mal wichtig zu wissen wie groß (in Bit) ist so ein Register.


    In deinem Beispiel liest du die Wert von einem Register was kommt da bei dir an?
    Du schreibst die Werte ja in eine Listbox, was steht da?

    Kanns du die Werte auch manuell am Gerät ablesen?
    Dann kann man ja mal vergleichen.
    Vielen Dank für die vielen Antworten.
    Leider habe ich keine Ahnung welcher Wert pro Register drin stehen sollte.

    Zudem habe ich festgestellt, dass beim ersten Aufruf von ModClient.ReadHoldingRegisters einmal nur Nullen übermittelt werden.
    Beim zweiten Aufruf eine Fehlermeldung und beim Dritten Aufruf dann Werte (siehe Screenshots - Fehlermeldung auf dem Button).
    Ich bin mir aber gar nicht sicher, ob diese Werte dann noch vom Modbus kommen oder einfach nur Fehler sind (obwohl die Verbindung immer noch steht - aber der Wert verändert sich nicht, was er aber sollte).

    Ich habe mal das gesamte MODBUS Dokument verlinkt: https://www.bonit.at/vbnet/MODBUS.pdf
    Bilder
    • 1.Versuch.jpg

      51,39 kB, 564×464, 205 mal angesehen
    • 2.Versuch.jpg

      70,18 kB, 564×464, 177 mal angesehen
    • 3.Versuch.jpg

      52,45 kB, 564×464, 166 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Liest dich hier mal ein. (MODBUS.org)
    In deinem Beispiel liest du das Register 32064 und das Register 32065 aus.
    Ein Register ist immer ein UInt16.
    Zusammen basteln und konvertieren muss du dann selber.
    Also die beiden Register in Bytes wandeln, zusammen setzen und das Array dann in UInt32 mit dem BitConverter konvertieren.
    Das gleiche gilt dann für Strings, Int16 usw.
    Mit EasyModbus kenne ich mich nicht aus, hatten das zwar mal angefangen, war dann aber eher nur mäßig zufrieden.
    Die Doku von dir ist, soweit ich das lesen, gut brauchbar. Da habe ich schon mit Schlimmerem arbeiten müssen.

    Naifu schrieb:

    Also die beiden Register in Bytes wandeln, zusammen setzen und das Array dann in UInt32 mit dem BitConverter konvertieren.


    Oder gleich den Buffer.BlockCopy() nehmen.

    Da spielt es keine Rolle ob es eine UInt16 oder eine UInt32 ist. Für einzelene Werte, also keine Arrays einfach noch ein {SrcIntX} zum Wert setzen.

    VB.NET-Quellcode

    1. Buffer.BlockCopy(SrcIntX, 0, DstIntY, 0, AnzahleBytesDerSource)


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Hallo,

    ich hab noch folgend Seite gefunden: sourceforge.net/p/easymodbustcp/wiki/Methods ModbusClient/

    Da tauchen unten sogar Funktionen zum Konvertieren auf.
    Must du mal schauen ob es die Funktionen auch bei dir gibt.

    An sonst wie Naifu geschrieben hat mit dem BitConverter die Werte in den entrprechenden Typ wandeln.
    Hallo Leute,

    ich habe nun diese Modbus-Sache wieder aufgegriffen und mir ein .NET Plugin dafür zugelegt.
    Da kann ich die Abfragen auch einfach durchführen und erhalte die gewünschten Werte.

    Bei Werten mit nur einer Registerstelle ist das Auslesen der INT16 Daten sehr einfach.
    Bei UINT32 und INT32 und UINT 16 hat die .NET Komponente sogar eigene Konvertierungsfunktionen wo ich einfach beide Registerwerte übermittle und dann den "zusammengebastelten" Wert erhalten. So weit so gut.

    Nun gibt es auch den Wert "Bitfield16" und "Bitfield32" in der API-Beschreibung.
    Angenommen "Bitfield16" (Screenshot im Anhang).

    Lese ich den Wert ganz normal als Int16 aus, dann hat diese den Wert 6. Wie wandle ich die 6 in Bits um und frage dann ab ob das eine oder andere Bit gesetzt ist oder nicht?
    Und das ganze dann auch bei Bitfield32 ;-).

    Irgendwie stehe ich da etwas auf dem Schlauch.

    Und die zweite Sache sind noch die Strings.
    Wenn ich z.B. die Modellbezeichnung ab Register 30000 mit 15 Int16 Werten auslese. Wie wandle ich die einzelnen Werte dann in einen String?

    Hier Beispielwerte:
    21333
    20018
    12336
    12333
    12592
    19284
    19501
    19761
    0
    0
    21333
    20018
    12336
    12333
    12594
    Bilder
    • 23102022211228.jpg

      124,83 kB, 788×589, 144 mal angesehen
    • 23102022211542.jpg

      88,23 kB, 817×214, 237 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Bitfield16 klingt nach 16 Bits. Maximalwert wäre für ein Integer da 2^16 (2=Bit (0 oder 1), 16=Anzahl der Bits) = 65536
    Ein Int-Wert von 6 heißt bei 16 Bitstellen 0000000000000110, also sind das 2. und 3. Bit gesetzt. Die Bedeutung ist Dir ja vorliegend (grid-connected = True, grid connected normally = True). Um zu testen, ob einzelne Bits gesetzt wurden, kannst Du z.B. schreiben: Bit0IstGesetzt = 6 And &B1. Da kommt dann False raus. Bit 0, also das erste Bit ist nicht gesetzt.
    Die Abfrage für das 2. Bit (Bit 1) wäre Bit1IstGesetzt = 6 And &B10
    Die Abfrage für das 3. Bit (Bit 2) wäre Bit2IstGesetzt = 6 And &B100
    Die Abfrage für das 4. Bit (Bit 3) wäre Bit3IstGesetzt = 6 And &B1000

    dive26 schrieb:

    Wie wandle ich die einzelnen Werte dann in einen String?
    Entweder verstehe ich die Frage nicht oder die Antowrt lautet einfach DerWert.ToString
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Warum so kompliziert?
    @dive26 Bedenke das das 0 basiert ist. Also BitField1 wäre index 0 oder 31, je nachdem ob Big oder Little Endian.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim x As Integer = 0
    3. PrintBits(x)
    4. x = SetBit(x, 1)
    5. PrintBits(x)
    6. x = UnSetBit(x, 1)
    7. PrintBits(x)
    8. x = FlipBit(x, 1)
    9. PrintBits(x)
    10. End Sub
    11. Private Function IsBitSet(value As Integer, index As Integer) As Boolean
    12. Return (value And 1 << index) <> 0
    13. End Function
    14. Private Function SetBit(value As Integer, index As Integer) As Integer
    15. Return value Or 1 << index
    16. End Function
    17. Private Function UnSetBit(value As Integer, index As Integer) As Integer
    18. Return value And Not 1 << index
    19. End Function
    20. Private Function FlipBit(value As Integer, index As Integer) As Integer
    21. Return value Xor 1 << index
    22. End Function
    23. Private Sub PrintBits(value As Integer)
    24. For i As Integer = 31 To 0 Step -1
    25. If (value And 1 << i) <> 0 Then
    26. Debug.Write("1")
    27. Else
    28. Debug.Write("0")
    29. End If
    30. Next
    31. Debug.WriteLine("")
    32. End Sub


    Gibt das hier aus:

    Quellcode

    1. 00000000000000000000000000000000
    2. 00000000000000000000000000000010
    3. 00000000000000000000000000000000
    4. 00000000000000000000000000000010


    hier noch ein toller Link mit genialen Bitwise Operations:graphics.stanford.edu/~seander/bithacks.html

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BitBrösel“ ()

    @VaporiZed

    Wie wandle ich die einzelnen Werte dann in einen String?
    Entweder verstehe ich die Frage nicht oder die Antwort lautet einfach DerWert.ToString


    Laut Schnittstellendefinition ist in den 15 Werten (Character String) die Wechselrichterbezeichnung enthalten.
    Wenn ich das mit chrW(wert) umwandle, dann kommen chinesische Zeichen raus.
    Genauso bei der Seriennummer (Adresse 30015 und Länge 10 Zeichen). Diese SHORT (INT16) Werte umgewandelt ergeben nix lesbares.

    Das mit den Bits werde ich morgen gleich ausprobieren. Vielen Dank.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    Und die zweite Sache sind noch die Strings.
    Wenn ich z.B. die Modellbezeichnung ab Register 30000 mit 15 Int16 Werten auslese. Wie wandle ich die einzelnen Werte dann in einen String?


    Wie sollte denn das Ergebnis aussehen?
    Hätte eine Idee, kommt aber das raus(mit deinen Beispiel Werten), und google hat 0 ergebnisse, wird es also vermutlich nicht sein.
    US2N00-001TK-L1M

    Nein ich habs, dein Model ist SUN2000-10KTL-M1
    Beim schreiben des Post noch die Idee gehabt, die Bytes zu drehen.
    Ich hab die Shorts genommen zu wieder zu Bytes gemacht, in umgedrehter Reihenfolge zu einer Liste hinzugefügt, dann aus der Byte-Liste einen String gemacht.

    VB.NET-Quellcode

    1. Dim x() As Short = {21333, 20018, 12336, 12333, 12592, 19284, 19501, 19761, 0, 0, 21333, 20018, 12336, 12333, 12594}
    2. Dim l As New List(Of Byte)
    3. For i = 0 To x.Length - 1
    4. Dim b() As Byte = BitConverter.GetBytes(x(i))
    5. l.Add(b(1))
    6. l.Add(b(0))
    7. Next
    8. Dim res As String = System.Text.Encoding.Default.GetString(l.ToArray())


    Also entweder die 30 Bytes nicht in Shorts packen, als einen Byte-Array nutzen, wenn dann das wass bei mir als erstes rauskam kommt, auch die Bytes drehen. Also immer paarweise.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „BitBrösel“ ()

    @BitBrösel

    Vielen Dank, Du bist der Beste.
    Auf das wäre ich nie gekommen. Das ​US2N00-001TK-L1M hatte ich auch schon irgendwie mal rausbekommen, aber konnte es nicht zuordnen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Danke dir. Auf sowas kann man sehr schnell kommen(auch du). Hängt aber davon ab, wie man IT sieht. Bei mir ist das eine Art Lebenseinstellung vllt. auch Sucht. Alles nur als Datenstrom zu sehen der sich beliebig manipulieren lässt, hilft mir oft so einige Problemchen zu lösen.

    Also wie gesagt, einfach die 30 Bytes als byte-Array und dann mit GetString testen, evtl. paarweise die Bytes tauschen(Little Endian Big Endian Geschichte), dann sollte es passe. Schau auch mal beim Hersteller ob ein Encoding angegeben ist.

    Würde mich wohler fühlen wenn anstatt von Ending.Default ein bestimmtes Econding verwendet wird, sollte dein Tool jemals jeamnd in China nutzen, würde das nicht gehen.
    Encoding UTF8 sollte gut sein, schätze ich mal.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BitBrösel“ ()

    @BitBrösel

    Mit Dim res As String = System.Text.Encoding.Default.GetString(l.ToArray()) bekomme ich den String in die Variable. Soweit passt das.
    Nun habe ich aber ein Problem mit dem Encoding dieses Strings.

    Beispiel:

    VB.NET-Quellcode

    1. Dim TestString As String ="erste Zeile"
    2. Teststring += res
    3. Teststring += "Zweite Zeile"
    4. Msgbox (Teststring)


    Dann zeigt er mir alles nach "res" nicht an. Ich vermute etwas mit dem Textencoding das nicht zusammenpasst.
    Habs auch mit UTF8 statt Default probiert, keine Änderung.


    EDIT:

    Habe es herausgefunden.
    Die Funktion oben gibt leider 32 Zeichen zurück, obwohl es nur 15 sein dürften. Die unsichtbaren Zeichen danach sind das Problem.
    Habe es nun so gelöst:

    ​ MBUS_HoleString = System.Text.Encoding.UTF8.GetString(l.ToArray).Substring(0, GeholteDaten.Length)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    Ah ja, das ist dann wohl hinter dem sichtbaren Text noch irgendwas wodurch der Rest nicht sichtbar ist, z.B. ein Byte mit dem Wert 0, bzw. ein VbNullChar.

    Hier mal ein wenig Messagebox-Debugging, du solltest besser auf Debug.Write(Line) setzen oder auch mal Haltepunkte nutzen. Nervt doch irgendwann mit den Messageboxen.

    VB.NET-Quellcode

    1. Dim firstPart() As Byte = {&H48, &H61, &H6C, &H6C, &H6F, &H20, &H57, &H65, &H6C, &H74, 0}
    2. Dim secondPart() As Byte = {&H48, &H61, &H6C, &H6C, &H6F, &H20, &H64, &H69, &H76, &H65, &H32, &H36}
    3. Dim first As String = System.Text.Encoding.UTF8.GetString(firstPart)
    4. Dim second As String = System.Text.Encoding.UTF8.GetString(secondPart)
    5. MessageBox.Show(first)
    6. MessageBox.Show(second)
    7. MessageBox.Show(first & Environment.NewLine & second)
    8. first = first.Trim(CChar(vbNullChar))
    9. MessageBox.Show(first & Environment.NewLine & second)


    Wenn das bei dir jetzt nicht hilft, schreibe mal die Bytes woraus der String erzeugt wird in eine Datei und häng das mal an, oder schau mit einem Hex-Editor rein, welches das störende Byte ist und entferne es.

    dive26 schrieb:

    Habe es herausgefunden.Die Funktion oben gibt leider 32 Zeichen zurück, obwohl es nur 15 sein dürften. Die unsichtbaren Zeichen danach sind das Problem.Habe es nun so gelöst:


    Wieso dürfen es nur 15 sein? Weil deine Modelbezeichnung nur 15 Zeichen Lang ist? Bei 15 Int16 sind 30 Bytes Platz, also für bis zu 30 Zeichen. Die restlichen 0-Bytes sind halt Lückenfüller.
    Mit Trim fährst du besser.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BitBrösel“ ()

    @BitBrösel

    Habe es jetzt so gemacht:

    VB.NET-Quellcode

    1. 'Unsichtbare zeichen dahinter abschneiden
    2. Dim Quellstring As String = System.Text.Encoding.UTF8.GetString(l.ToArray)
    3. Dim Zielstring As String = ""
    4. For i As Integer = 1 To Quellstring.Length - 1
    5. If Asc(Mid(Quellstring, i, 1)) = Nothing Or Asc(Mid(Quellstring, i, 1)) = 0 Then
    6. Exit For
    7. Else
    8. Zielstring += Mid(Quellstring, i, 1)
    9. End If
    10. Next i


    War wohl ein "Nothing" im String schuld. Aber so geht das für mich und ist unabhängig von der Stringlänge.
    Danke für Deine Hilfe.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @BitBrösel

    Vielen lieben Dank für Deine Hilfe hier zu dieser Frage.
    Soweit funktioniert alles was ich mir im ersten Schritt vorgenommen habe.
    Ich kann vom Wechselrichter wichtige Daten über "Read Holding Registers" abfragen.
    Dazu verwende ich die .NET DLL "WSMBT".
    Die Verwendung ist relativ einfach. Hier ein vereinfachter Code um die Funktion zu beschreiben:



    VB.NET-Quellcode

    1. WsmbtControl1.Connect("127.0.0.1", 502)
    2. Dim registers(1) As Short
    3. WsmbtControl1.ReadHoldingRegisters(2, 30070, 1,registers(1))
    4. 'registers(0) enthält den Wert
    5. WsmbtControl1.Close()


    Strings und Int32 und alle anderen Datentypen konnte ich auch auslesen. Vielen Dank dafür.

    Nun geht es im zweiten Schritt darum die an einen Wechselrichter angeschlossenen Moduloptimierer auszulesen.
    Hier werde ich nicht ganz so schlau aus der Definitionsbeschreibung und dem Modbus Prozedere des "Uploading files".
    Scheinbar gibt es da keine fixe Registeradresse die man so einfach abfragt.

    Das ganze ist im PDF von Seite 45-50 und 90 bis 94 beschrieben. Aber ich habe keine Ahnung wie ich programmtechnisch zu den Daten komme.
    Ich brauche im am Schluss "nur" die Real-Time-Daten, also das "Data unit format V101" (Seite 47, Kapitel 4.2).

    Falls Du mir hier helfen kannst, wäre ich auch gerne nach Absprache bereit Dich dafür zu bezahlen.
    Ich bin auch nicht nur auf das verwendete Plugin angewiesen, ich könnte auch das NuGet Paket "EasyModbusTCP" zusätzlich verwenden, wenn es damit besser geht.
    Dateien
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26

    Mit Modbus-TCP hatte ich bisher noch keinerlei Kontakt. Erster Eindruck nach einer kleinen Recherche, scheint was feines zu sein dieses Protokoll, fein deshalb, weil das was einheitliches ist und auch in der Industrie Akzeptanz gefunden hat. Besser als wenn jeder Hersteller mal wieder sein eigenes Süppchen kocht.

    Ich suche noch weitere Informationen, aktuell kann ich dazu noch keine wirklichen Einschätzungen machen. Könnte aber sein, das man nur was an den Modbus Server schreiben muss. Ich recherchiere noch ein bisschen und melde mich dann. Muss ja erstmal genau Wissen, womit ich es zu tun hab.