Forum: PC-Programmierung Modbus TCP unter VB.net it TCPClient -> Fehler?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Koder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Will bei einer Kleinsteuerung mittels Modbus TCP das Register mit dem 
Offset 0 auslesen.
Dies soll unter vb.net geschehen.
Mit dem CAS Modbus Scanner kann ich die Daten lesen.
Leider bricht vb mit dem Fehler im Anhang ab.

Hier mal der Code:
Private Sub frm_main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim Message(5) As Byte
Message = {&H1, &H3, &H0, &H0, &H0, &H1}

Dim Client As New TcpClient
Client.ReceiveTimeout = 500

Client.Connect("localhost", "502")
Client.GetStream.Write(Message, 0, Message.Length)

Dim ReadBuffer(8000) As Byte
Dim BytesRead As Integer
Try
BytesRead = Client.GetStream.Read(ReadBuffer, 0, ReadBuffer.Length)
Catch ex As Exception
MsgBox(ex.ToString)
Client.Close()
End Try
Client.Close()
End Sub

von Koder (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und wieder mal der Anhang vergessen worden ---> Böööse

von Robert S. (robert_s68)


Bewertung
0 lesenswert
nicht lesenswert
Ohne dass ich da jetzt konkret Ahnung hätte: es sieht so aus als würde 
die Kleinsteuerung unter "localhost" angesprochen werden, dort sollte 
vermutlich die IP-Adresse selbiger Steuerung eingetragen werden. 
localhost bezieht sich normalerweise immer auf das loopback-device und 
führt in diesem Fall zum versuchten Selbstgespräch.

von Koder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das würde schon stimmen.
Ist gemappt.

von Robert S. (robert_s68)


Bewertung
0 lesenswert
nicht lesenswert
Dann mal mit Wireshark oder tcpdump nachsehen was sich auf dem Netzwerk 
tut.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Koder schrieb:
> Und wieder mal der Anhang vergessen worden ---> Böööse

Da ist ganz offensichtlich bereits der Aufbau der TCP-Verbindung nicht 
erfolgreich gewesen.

Was allerdings wenig überraschend ist, da du keinen Port angegeben 
hast...

Ausserdem: bist du sicher, dass dein Modbus-Device auf localhost 
lauscht? Das wäre eine, naja, eher ungewöhnliche Konstellation...

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Koder schrieb:
> Das würde schon stimmen.
> Ist gemappt.

Bitte? Du "mappst" localhost auf die IP-Adresse Deines Modbus-Devices?

Welchen tieferen Sinn soll das haben?

von Lemon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Koder schrieb:
> Client.Connect("localhost", "502")

c-hater schrieb:
> Was allerdings wenig überraschend ist, da du keinen Port angegeben
> hast...

Hat er doch.

von Koder (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Port IST angegeben.
Wie gesagt wird das Port gemappt. (Über SSH Tunnel)

Ist das das riesige unumgängliche Problem?

Glaube ich nicht, da ich ja mit dem CAS Modbus Scanner (wie Anfangs 
geschrieben)ohne Problem Werte auslesen kann.

Bei Senden wird kein Exception ausgelöst. Erst beim Lesen.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lemon schrieb:

> Koder schrieb:
>> Client.Connect("localhost", "502")
>
> c-hater schrieb:
>> Was allerdings wenig überraschend ist, da du keinen Port angegeben
>> hast...
>
> Hat er doch.

Hat er nicht. Wenn man sich auch mal nur andeutungsweise die Mühe macht, 
die Dokumentation der Sachen anzuschauen, die man benutzt, dann stellt 
man im Falle des TCP-Clients fest, dass dieser überhaupt keine 
Connect-Methode besitzt, die zwei Strings als Parameter schluckt. 
Normalerweise sollte sich das Gezeigte also nicht einmal kompilieren 
lassen...

Mit

Client.Connect("localhost", 502)

hingegen könnte es funktionieren. Da fehlt dann halt nur noch ein Server 
auf loalhost:502, der bereit ist, die Verbindung zu akzeptieren.

Ob ein solcher Server existiert, lässt sich sehr leicht herausfinden. 
Ein CLI-Fenster aufmachen und eintippen:

netstat -anp TCP

Da sollte er dann auftauchen.

von Koder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja, das war wohl mein Fehler.
Habe nun mal die Message auch nach String konvertiert, da ja ASCII 
gesendet werden soll.

Leider noch immer der gleiche Fehler.

Habe nun folgenden Code:
Dim Client As New TcpClient
Client.ReceiveTimeout = 1000

Dim IPAddress As Net.IPAddress = Net.IPAddress.Parse("127.0.0.1")

Client.Connect(IPAddress, 502)

Dim Message(5) As Byte
Message = {&H1, &H3, &H0, &H0, &H0, &H1}

'Nun Nachricht nach ASCII konvertieren
For i = 0 To UBound(Message) - 1
   Message(0) = Message(0) + 48
Next i

Client.GetStream.Write(Message, 0, Message.Length)

Dim ReadBuffer(Client.ReceiveBufferSize) As Byte
Dim BytesRead As Integer
Try
BytesRead = Client.GetStream.Read(ReadBuffer, 0, Client.ReceiveBufferSize)
Catch ex As Exception
MsgBox(ex.ToString)
Client.Close()
End Try

Client.Close()

von Koder (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kopierfehler.
Die Konvertierschleife ist natürlich:

'Nun Nachricht nach ASCII konvertieren
For i = 0 To UBound(Message)
   Message(i) = Message(i) + 48
Next i

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Koder schrieb:
> Wie gesagt wird das Port gemappt. (Über SSH Tunnel)
>  Ist das das riesige unumgängliche Problem?

Es ist eine zusätzliche Fehlerquelle. Ist das Modbus-Device in einem 
anderen Netzwerk, oder was soll der SSH-Tunnel?

Nimm zum Testen Deiner Software einfach einen Modbus-Simulator, den Du 
auf Deinem Rechner selbst laufen lässt und lass' den SSH-Kram erst mal 
weg.

Der hier hat mir sowohl bei TCP als auch bei seriellem Modbus gute 
Dienste geleistet und liegt im Quelltext vor:

https://sourceforge.net/projects/modrssim/


> Habe nun mal die Message auch nach String konvertiert, da ja ASCII
> gesendet werden soll.

Wer behauptet das? Das ist sehr sicher Quark.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.