Hallo,
ich nutze einen Revolution Pi Connect S mit Bookworm:
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
Pictory-Version: 2.11.1
Ich möchte den RevPi über RS485 mit einem Raspberry Pi verbinden, auf dem ein Waveshare RS485 HAT installiert ist.
Das funktioniert grundsätzlich:
Wenn ich auf dem Raspberry Pi einen pymodbus-Server (Slave) starte und vom RevPi aus mit einem eigenen pymodbus-Client-Skript darauf zugreife, kann ich erfolgreich Register lesen und schreiben. Die Kommunikation läuft also stabil.
Wenn ich jedoch in Pictory den Connect S wie im offiziellen Tutorial als Modbus RTU Master einrichte, kann ich zwar Holding Register schreiben, aber nicht lesen.
Analyse:
Auf dem Raspberry Pi (Slave) habe ich die eingehenden Modbus-Daten mitgeschnitten. Dabei konnte ich folgendes beobachten:
Beispiel – Schreiben eines Holding Registers (funktioniert):
01 06 01 2B 05 A5 3B 15 → korrektes 8-Byte-Telegramm
Beispiel – Lesen eines Holding Registers (funktioniert nicht):
01 03 03 E8 01 04 7A → nur 7 Bytes!
Das CRC 04 7A gehört eigentlich zu folgendem vollständigen Telegramm:
01 03 03 E8 00 01 04 7A
→ Das entspricht einem Lesezugriff auf Registeradresse 1000 (0x03E8), Länge 1 – also genau dem, was ich in Pictory eingestellt habe.
Nach weiteren Tests ist mir Folgendes aufgefallen:
Wenn ich Register unter 255 abfrage,
nur ein einzelnes Register lesen möchte,
oder die Adresse kleiner als 255 ist,
…werden anscheinend die High-Bytes (0x00) der Registeradresse und der Längenfelder im Telegramm weggelassen. Dadurch entstehen verkürzte Telegramme mit nur 6 oder 7 Bytes. Diese werden vom pymodbus-Server entweder als fehlerhaft zurückgewiesen („Register nicht vorhanden“) oder komplett ignoriert, weil sie nicht dem Modbus-RTU-Protokoll entsprechen.
Meine Fragen:
Ist dieses Verhalten bekannt?
Gibt es eine falsche Konfiguration meinerseits?
Wie kann ich das Problem beheben oder umgehen?
Wie gesagt: Die Modbus-Kommunikation funktioniert problemlos, wenn ich beide Seiten mit Python und pymodbus betreibe. Nur bei Verwendung von Pictory als Master treten die Probleme auf. Wenn ich das richtig verstehe, müssen Modbus-RTU-Anfragen immer mindestens 8 Bytes lang sein, um dem Standard zu entsprechen.
Viele Grüße
Sebastian