Modbus TCP unter VB.net it TCPClient -> Fehler?

Gast #5813495
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
#5813517
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.
Gast #5813722
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...
Gast #5813980
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.
Angehängte Dateien:
Gast #5813994
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.
Gast #5814014
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()
Persönliche Seite #5814222
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren