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é