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
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.
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...
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?
Koder schrieb:> Client.Connect("localhost", "502")c-hater schrieb:> Was allerdings wenig überraschend ist, da du keinen Port angegeben> hast...
Hat er doch.
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.
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.
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")
Kopierfehler.
Die Konvertierschleife ist natürlich:
'Nun Nachricht nach ASCII konvertieren
For i = 0 To UBound(Message)
Message(i) = Message(i) + 48
Next i
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.