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


von Koder (Gast)


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:
1
Private Sub frm_main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
2
Dim Message(5) As Byte
3
Message = {&H1, &H3, &H0, &H0, &H0, &H1}
4
5
Dim Client As New TcpClient
6
Client.ReceiveTimeout = 500
7
8
Client.Connect("localhost", "502")
9
Client.GetStream.Write(Message, 0, Message.Length)
10
11
Dim ReadBuffer(8000) As Byte
12
Dim BytesRead As Integer
13
Try
14
BytesRead = Client.GetStream.Read(ReadBuffer, 0, ReadBuffer.Length)
15
Catch ex As Exception
16
MsgBox(ex.ToString)
17
Client.Close()
18
End Try
19
Client.Close()
20
End Sub

von Koder (Gast)


Angehängte Dateien:

Lesenswert?

Und wieder mal der Anhang vergessen worden ---> Böööse

von Robert S. (robert_s68)


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)


Lesenswert?

Das würde schon stimmen.
Ist gemappt.

von Robert S. (robert_s68)


Lesenswert?

Dann mal mit Wireshark oder tcpdump nachsehen was sich auf dem Netzwerk 
tut.

von c-hater (Gast)


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) Benutzerseite


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)


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:

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)


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)


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:
1
Dim Client As New TcpClient
2
Client.ReceiveTimeout = 1000
3
4
Dim IPAddress As Net.IPAddress = Net.IPAddress.Parse("127.0.0.1")
5
6
Client.Connect(IPAddress, 502)
7
8
Dim Message(5) As Byte
9
Message = {&H1, &H3, &H0, &H0, &H0, &H1}
10
11
'Nun Nachricht nach ASCII konvertieren
12
For i = 0 To UBound(Message) - 1
13
   Message(0) = Message(0) + 48
14
Next i
15
16
Client.GetStream.Write(Message, 0, Message.Length)
17
18
Dim ReadBuffer(Client.ReceiveBufferSize) As Byte
19
Dim BytesRead As Integer
20
Try
21
BytesRead = Client.GetStream.Read(ReadBuffer, 0, Client.ReceiveBufferSize)
22
Catch ex As Exception
23
MsgBox(ex.ToString)
24
Client.Close()
25
End Try
26
27
Client.Close()

von Koder (Gast)


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) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.