Verbindungsprobleme mit Modbus RTU in Python

Post Reply
acolomb
Posts: 6
Joined: 26 Jul 2018, 13:01

Verbindungsprobleme mit Modbus RTU in Python

Post by acolomb »

Hallo Forum!

Ich arbeite mit einem RevPi Connect und einer Modbus-RTU-Verbindung zu einem Frequenzumrichter über RS485 (RevPi = Master, keine sonstigen Geräte am Bus). Da die Kommunikation nicht immer gleich zyklisch abläuft und öfters Nachrichten "außer der Reihe" ausgetauscht werden müssen, haben wir uns gegen eine Integration im Prozessabbild entschieden und schicken stattdessen die Nachrichten direkt mittels der uModbus-Bibliothek und PySerial als Unterbau. Alles in allem klappt das prima.

Nun kriegen wir aber in unregelmäßigen Abständen Kommunikationsfehler, die manchmal nur eine Nachricht betreffen, manchmal aber auch über Zeiträume von Minuten, danach ist wieder alles OK. Es muss sich um fehlerhafte Übertragungen handeln, oder Timing-Probleme. Die Fehlermeldungen umfassen grob:
  • Keine Antwort vom Slave. (Vermutlich hat er schon die Anfrage nicht richtig bekommen, deshalb läuft der Master in ein Timeout).
  • CRC-Fehler in der Antwort vom Slave.
  • Falsche Informationen zurückgeliefert, d.h. die Antwort passt nicht zur Anfrage, ist aber in sich (selten, zufällig?) stimmig mit dem CRC.

Erste Vermutung war eine EMV-Störung. Der Frequenzumrichter ist jedoch oft inaktiv wenn die Fehler auftreten. Sonstige Umgebung unkritisch (tritt in der Halle auf, als auch am Prototyp auf dem Schreibtisch). Die Leitung ist ca. 1 m und geschirmt, beide Enden terminiert. Die Baudrate wurde bereits von 115.200 auf 38.400 reduziert und Parität eingeschaltet, um die Anfälligkeit zu minimieren.

Nun vermute ich eher Timing-Probleme. Insbesondere kann ich nicht erkennen, dass die uModbus-Bibliothek das Inter-Frame-Delay von 3,5 Zeichen (mindestens 1,75 ms) sicherstellt. Daher habe ich zunächst in der Applikation entsprechende Delays (3 ms vor jedem Senden) eingebaut. Ich befürchte jedoch, dass dies durch Pufferung in Python und im Kernel ggf. überhaupt keinen Effekt hat. Manche der oben genannten Fehlermeldungen könnte ich mir noch erklären, wenn Nachrichten teilweise empfangen wurden, z.B. noch ein Rest im Empfangspuffer verbleibt, nachdem die Nachricht vorzeitig als korrumpiert erkannt wurde.

Der nächste Versuch war, per ioctl die Einstellungen am Serial-Port zu beeinflussen, was PySerial explizit unterstützt. Lediglich delay_before_tx und delay_before_rx wurden gesetzt. Dies wird aber mit der Fehlermeldung "inappropriate ioctl for device" abgelehnt. Wie kann man also das Timing des RS485-Anschlusses beeinflussen und wie macht das ggf. der piControl-Treiber als Modbus-Master?

Über jegliche Hinweise zur weiteren Problemeingrenzung wäre ich sehr dankbar. Es ist ein sehr unangenehmes Fehlerverhalten, weil oft tagelang keine Störung auftritt, daher schwer zu untersuchen.

Schöne Grüße und bleibt alle gesund!
André
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Verbindungsprobleme mit Modbus RTU in Python

Post by dirk »

Hi André, erstmal vielen Dank für deine umfassende Schilderung der Lage deine Gedanken zur Problemlösung und den Schritten die dahin geführt haben das ist wirklich gut beschrieben.

Da CRC Fehler in der Antwort vom Slave enthalten sind scheint die Datenübertragung logischerweise ja gestört zu sein.
Meiner Ansicht nach hilft hier nur anzufangen mit Low Level Debugging.

Bitte erstelle z.B. mit einem Oszilloskop oder einem Logik Analyzer Traces für die Analyse der Signale auf der RS485 Schnittstelle.
Gibt es da zyklische oder sporadische Störungen, etc.
Wie stellt sich das Bild auf der RS485 Schnittstelle eigentlich dar?

Dann eine Recherche im Handbuch und ggfs. über den Support des Herstellers:
So viele Daten wie möglich, die der Frequenzumrichter zur Verfügung stellt auslesen aber nicht über die RS485 Schnittstelle.
Auf Grundlage dessen können wir analysieren, ob es hier generell Probleme gibt, die das Gerät eventuell schon signalisiert:
Gibt es Fehler Stacks?
Welche Einstellungen gibt es, die eventuell noch Daten liefern ?
Gibt es LED Status Anzeigen?

Werden andere Schnittstellen unterstützt z.B. Profinet?
Dann könnten wir die Daten auch via Codesys Profinet Master abfragen.

Um welchen Frequenzumrichter geht es eigentlich? Könntest Du uns dazu nähere Details nennen?
acolomb
Posts: 6
Joined: 26 Jul 2018, 13:01

Re: Verbindungsprobleme mit Modbus RTU in Python

Post by acolomb »

Hallo Dirk,

danke schon mal für die Antwort und Beschäftigung mit dem Thema. Aktuell bin ich nicht am Gerät, daher nur mal ein erster Schwall Informationen, was ich aus dem Kopf beantworten kann.

Analyse der RS485-Signale habe ich schon angedacht, allerdings fehlt mir dazu das Equipment. Oszi nur ohne Logik-Analyzer. Einen Adapter RS485-USB könnte ich nebenbei ans Laptop hängen, der wird aber vermutlich schon alles unterhalb des Framings (Paritätsbit) herausfiltern. Ich bin noch etwas skeptisch, wie treffsicher die Aussagen zum Timing dabei sein werden. Aber auf jeden Fall ein Ansatz.

Der Umrichter ist ein WJ200 von Hitachi. Außer Modbus hat er keine brauchbare Schnittstelle, die Entscheidung wird auch wahrscheinlich nicht angetastet. Tatsächlich kommt man per USB mit einem Tool auch daran und kann Fehlerlogs auslesen. Muss ich mir noch genauer anschauen und eine Korrelation zur Aussage auf RevPi-Seite versuchen. CRC-Fehler meine ich darin schon einmal gesehen zu haben. Einstellungen bzgl. Modbus an sich habe ich ziemlich sicher richtig getroffen, immerhin funktioniert die Kommunikation ja auch über ca. 95 % einwandfrei.

Könnt ihr denn die Fragen bzgl. Timing auf dem RS485 zumindest theoretisch beantworten? Immerhin muss ja die Modbus-Implementierung in piControl die selben Vorgaben beachten, was sicher als Kerneltreiber eher kontrollierbar ist.

Gruß
André
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Verbindungsprobleme mit Modbus RTU in Python

Post by dirk »

Hi André,
Könnt ihr denn die Fragen bzgl. Timing auf dem RS485 zumindest theoretisch beantworten? Immerhin muss ja die Modbus-Implementierung in piControl die selben Vorgaben beachten, was sicher als Kerneltreiber eher kontrollierbar ist.
Besorge Dir ein Oszi und versuche Dir ein Bild davon zu machen was auf der Leitung elektrisch übertragen wird. Deine Frage ist berechtigt eventuell gibt es Timing Probleme aber ich denke hier ist ein low-level Troubleshooting unerlässlich. Auch die externen Daten, die Du evtl. über die Tools vom Hersteller kriegst.
Post Reply