mikrocontroller.net

Forum: PC Hard- und Software Modbus RTU over Internet


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.
Autor: Karlo K. (ponos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Habe folgende Situation:
Eine Kleinsteuerung welche über eine Modbus RTU Schnittstelle wird 
aktuell
über einen USB/Modbus RTU Adapter über ein Windows Programm 
programmiert.
Nun soll der Adapter an einem Raspberry PI dran und das COM Port 
irgendwie
über das Internet "getunnelt" werden, um einen Remotezugriff zu haben.
Probleme daran:
Das Windows Programm kann nur Com Ports öffnen.
Also fällt ein Modbus RTU auf Modbus TCP/IP Converter flach.

Hat da jemand eine Idee?

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwar kann man auch serielle Schnittstellen über tcp umleiten (z.B. mit 
dem frei verfügbaren com2tcp, Bestandteil von com0com), aber das Timing 
dürfte, wenn man das übers Internet abwickelt, so stark verändert 
werden, daß die Software damit nicht glücklich wird.

Ausprobieren aber kannst Du es natürlich, zunächst mal im lokalen 
Netzwerk.

http://com0com.sourceforge.net/

(Hier wird unten Reklame von Eltima eingeblendet, ignorieren!)

http://com0com.sourceforge.net/com2tcp/ReadMe.txt

Für Deinen Raspberry Pi musst Du dann halt ein Programm schreiben, das 
das verwendete Protokoll auf dessen serielle Schnittstelle umsetzt.


Ein alternativer und erfolgversprechenderer Lösungsansatz wäre die 
Verwendung von Modbus/IP, und das Entwickeln eines lokal auf dem 
Windows-Rechner laufenden Programmes, das Modbus RTU auf Modbus TCP 
umsetzt. Die RTU-Seite verhält sich wie ein Modbus-Device und kann über 
eine serielle Schnittstelle angesprochen werden.

Dieses Programm kannst Du auf einem PC mit zwei seriellen Schnittstellen 
parallel zum bestehenden Modbus-Server laufen lassen, die beiden 
Schnittstellen verbindest Du mit einem Nullmodemkabel.

Oder Du verwendest com0com, und kannst damit auf die physischen 
seriellen Schnittstellen verzichten, der vorhandene Modbus-Server und 
der RTU-zu-IP-Umsetzer sind dann mit einem virtuellen Nullmodemkabel 
verbunden.

Da alles timingkritische auf dem PC selbst geschieht, dürfte der Ansatz 
besser funktionieren, und vor allem ließe er sich auch mit beliebigen 
anderen, real existierenden Modbus-IP-Geräten zusammen verwenden.

So etwas kann man natürlich auch als fertiges Gerät kaufen:

https://www.anybus.com/de/produkte/gateway-index/anybus-xgateway/detail/anybus-x-gateway-ethernet-ip-scanner---modbus-rtu-slave

aber wo bleibt da die Entwicklerfreude?

Autor: Karlo K. (ponos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist die Raspberry PI Seite, bei dieser Lösung.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karlo K. schrieb:
> Das Problem ist die Raspberry PI Seite

Wieso?

Der wird dann halt ein Modbus-IP-Device und Modbus-RTU-Master.

Das ist nur Software, besonders kompliziert ist das nicht.

Oder Du lässt den Pi weg und verwendest ein Fertiggerät, das das 
erledigt.

Autor: Karlo K. (ponos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwischenteitlich habe ich erkannt, dass das Programm noch ein anderes 
Protokoll ausser Modbus RTU fährt.
Also muss ich das komplette Serialport "mappen".
Es sind 9600kbaud. Also so schnell wäre es nicht.
Weis nicht, ob ich in irgend ein Timeout gerate.

Jemand eine Idee, wie ich das komplette Com Port "mappe"?

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karlo K. schrieb:
> Also muss ich das komplette Serialport "mappen".
> Es sind 9600kbaud. Also so schnell wäre es nicht.

Du meinst vermutlich ein Tausendstel der Baudrate. 9.6 kBauf oder 9600 
Baud.

Das kannst Du mit den von mir genannten Mitteln erledigen, mit com0com 
und com2tcp kannst Du das "Mappen" hinbekommen, und Dein Raspberry Pi 
muss nur das Gegenstück davon wiederum auf seine serielle Schnittstelle 
abbilden.

https://www.raspberrypi.org/forums/viewtopic.php?t=54794

Autor: Tassilo H. (tassilo_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm doch einen stinknormalen serial port server, der RS485 kann, das 
sollte dann zu Modbus RTU passen - ist am Ende ja auch nur RS485; das 
mit den 1.5/3.5-Zeichentimeouts klappt zwar nur eingeschränkt über so 
ein Teil, aber das gilt für einen seriellen Port im PC unter Windows 
auch und stört normalerweise nicht (wenn nur ein Modbus-Master da ist).

Die serial port/device server haben normalerweise einen Treiber dabei, 
der serielle Schnittstellen am PC emuliert.

Ob die zusätzlichen Latenzen stören, musst du wohl ausprobieren.

Wenn es über Internet geht, ggf. noch ein VPN dazwischenpacken, damit 
nicht jeder den port server hacken kann.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm einen RPI, socat sowie socat for windows auf dem PC und dann kannst 
du
die Timeouts testen ob alles so funktioniert.
Für die Tests solltest du tc verwenden um speziell das Delay eines
Internet-Tunnels zu testen, https://linux.die.net/man/8/tc .

Autor: Karlo K. (ponos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK. Probier gerade was aus.
Vielleicht kann mir da wer helfen.

Habe auf der RPI Seite ser2net installiert,konfiguriert und gestartet:

sudo apt-get install ser2net
sudo nano /etc/ser2net.conf
7000:telnet:0:/dev/ttyUSB0:9600 8DATABITS NONE 1STOPBIT remctl
ser2net

Weil ich nur per SSH Zugriff auf den RPI habe, habe ich mittels Putty
einen SSH Tunnel auf 127.0.0.1:7000 erstellt.

Sollte da nicht schon per "telnet 127.0.0.1 7000" auf der Windows Seite 
was kommen?

Kann ich dann per Socat für Windows mich mit ser2net verbinden, oder 
"verstehen" die sich nicht?

Autor: Martin S. (strubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

auf dem RPi ist nicht wirklich ein 100% zuverlässiges Modbus-Timing 
hinzukriegen, weil dessen UART keinen sauberen RS485-Mode kann. Aber für 
Basteln @home kein grosses Problem. Für Industrial ist eh vom RPi 
abzuraten.

Modbus RTU auf TCP zu mappen geht recht elegant mit netpp, da kannst du 
auch die Register als 'Properties' abbilden. Rohe UART-Protokolle gehen 
per Buffer-Protokoll. Lohnt den Aufwand aber nur, wenn du viele Geräte 
anbindest, sonst ist ein Standard-TCP-to-UART-Wandler (oder 
Terminal-Server) die weniger arbeitsintensive Variante.

Autor: Karlo K. (ponos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zustand:
Es ist ein USB/Modbus RTU Wandler am RPI drann.
Wird als /dev/ttyUSB0 gefunden.
Auf den RPI kann ich nur per SSH drauf.
Wird der USB/Modbus RTU Wandler am Windwos PC angesteckt,
wird er als COM Port enummeriert.

Ziel:
Es soll unter Windows ein virtuelles COM Port geben, das
sich 1:1 (abgesehen von der Latenz) wie der USB/Modbus RTU Wandler am 
RPI verhält.

Wie würde das mit socat aussehen (RPI Seite und Windows Seite) ?

: Bearbeitet durch User
Autor: Nurso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß da jemand über socat Bescheid?
Würde mich auch interessieren.

Btw: Für Modbus würde "musd" funktionieren.
Das ist ein Modbus Gateway für den RPI.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karlo K. schrieb:
> Sollte da nicht schon per "telnet 127.0.0.1 7000" auf der Windows Seite
> was kommen?

Nicht mit der IP-Adresse. Das ist localhost, d.h. wenn Du das auf dem 
Windows-Rechner aufrufst, versuchst Du mit dem Windows-Rechner zu reden.

Und solange auf dem nichts läuft, was auf Port 7000 lauscht, gibt's 
keine Reaktion.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
https://www.acmesystems.it/socat
/dev/ttyS2 => com3 on Win für Win version von socat ttyS0 ist Com1 usw 
...

Autor: Nurso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon ein richtiges Beispiel.
Google kenn ich auch.
Also wirklich mit virtuellen Port am Win Rechner.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Kombination com0com und com2tcp hast Du Dir schon angesehen?

Autor: Karlo K. (ponos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sooo. Vielleicht kann mir da jetzt jemand helfen:

ser2net auf dem Raspberry PI installiert und gestartet.
Die Konfig ist wie folgt:
sudo nano /etc/ser2net.conf
7000:raw:0:/dev/ttyUSB0:9600,8DATABITS,NONE,1STOPBIT

Es wird also ttyUSB0 mit Port 7000 verbunden.

Auf der Windowsseite:
Über Putty das Port 7000 gemappt (Siehe Screenshots)

Danach Com2Com eingerichtet (Siehe Screenshots)

Nun mit "C:\hub4com\com2tcp-rfc2217 \\.\CNCB0 127.0.0.1 7000" als 
Administrator verbunden.

Da kommt dann immer der angehangene Fehler.
Habe das ganze Log auch mal angehangenn.

Stehe da jetzt auf der Leitung.
Was habe ich falsch gemacht????

@Admin: com2net_2.jpg bitte löschen. Falsches Bild.

: Bearbeitet durch User
Autor: Karlo K. (ponos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei noch die Com2Com Config

Autor: Karlo K. (ponos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So nächste Erfahrung:

habe mir am RPI eine Bash angelegt:

#!/bin/bash
while [ true ] ; do
sudo ser2net
sudo socat /dev/ttyUSB0,b9600,raw,echo=0 TCP:127.0.0.1:7000
done

Ich muss beide starten (????), dann kann ich mich mit dem Programm über 
Serial/IP
über eine "Rohe Verbindung" erfolgreich verbinden.
Nun möchte ich das über com2tcp realisieren.

Also per:
C:\hub4com\com2tcp \\.\CNCB0 127.0.0.1 7000

Leider klappt das noch nicht sooo gut.
(Im Anhang mal die Ausgabe)

Autor: Karlo K. (ponos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei noch die Serial/IP Config

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karlo K. schrieb:
> Auf der Windowsseite:
> Über Putty das Port 7000 gemappt (Siehe Screenshots)

Wozu soll das gut sein?

> Danach Com2Com eingerichtet (Siehe Screenshots)
>
> Nun mit "C:\hub4com\com2tcp-rfc2217 \\.\CNCB0 127.0.0.1 7000" als
> Administrator verbunden.

Statt localhost (127.0.0.1) würde ich hier die IP-Adresse Deines 
Raspberry Pi angeben.

Autor: Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie ich das lese, will er über einen SSH Tunnel raus.
Wenn er das benötigte auf 127.0.0.1 mapt, hat er schon recht.

Muss mal suchen.
So was ähnliches habe ich schon mal gemacht.

: Bearbeitet durch User

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.

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