2017-03-01 5 views
0

Ich benutze Pymodbus auf einem Raspberry Pi als Client, um Werte von Sensoren zu halten und sie einem Modbus-Master über TCP zur Verfügung zu stellen.Pymodbus-Client setValues ​​begrenzt auf 100 Register

Alles funktioniert super. Ich verwende Folgendes, um den Datenspeicher einzurichten. values ​​= Kontext [slave_id] .getValues ​​(Register, Adresse, Anzahl = 350) Das Problem ist, wenn ich versuche, die Werte zu setzen, kann ich nicht über [98] Listenwerte gehen.

Wenn ich die Anzahl = 5 festlege, kann ich Werte von [0] bis [4] setzen, aber es wird ein Fehler ausgegeben, wenn ich [5] wie erwartet einstelle.

Mit der Zählung = 350 bekomme ich und Fehler, wenn ich versuche und den Wert [99] einstellen.

Dies würde vorschlagen, dass ihre Grenze von 100 Registern ist. Kann diese Grenze verlängert werden?

Wenn ich store.py betrachte, kann ich keine Einschränkungen sehen, daher bin ich etwas verwirrt, wo die Grenze gesetzt wäre.

Ihre Hilfe würde sehr geschätzt werden.

Prost

Antwort

1

Es gibt eine Grenze in der Modbus-Spezifikation der Menge von Registern ist, die das Protokoll verarbeiten kann. Das meiste, was ich persönlich in einem einzigen Anruf gelesen/geschrieben habe, ist 120 Register, aber hier ist eine Erklärung auf control.com:

"Die Anzahl der zu lesenden Register, kombiniert mit allen anderen Feldern in der erwarteten Antwort , darf die zulässige Länge von Modbus-Nachrichten nicht überschreiten: 256 Byte. "

Das Modbus/RTU Antwort auf eine Funktion 3 Anforderung enthält

Knotenadresse: 1 Byte Funktionscode: 1 Byte Byteanzahl: 1 Byte

Registerdaten: N Register * 2 Bytes jeweils

CRC: 2 Byte

Daher ist die maximale Anzahl von Registern, die in einer einzigen Modbus/RTU-Abfrage gelesen werden können, ist 125.

Wenn Sie Modbus/TCP verwenden, tauschen Sie die Geräteadresse und den CRC (insgesamt 3 Byte) für einen 6-Byte-Header und einen 1-Byte-Einheiten-Identifier; die maximale Anzahl der Register in einer einzigen Reaktion fällt

Maximum amount of holding registers per request

+0

Hallo. Vielen Dank für Ihre Antwort. Dies ist eine Slave-Implementierung von pyModbus, kein Master. Wenn ich die Register von meinem Master lese, lese ich in Blöcke von 100 Registern, wie Sie gesagt haben. – Winetec

+0

Das Problem ist, wenn Sie den Datenspeicher von Registern in pyModbus es erstellen – Winetec

+0

Wont können Sie Werte für den Slave für mehr als die ersten 98 Register hinzufügen. – Winetec

0

ich meine eigene Frage beantwortet zu 123. Wenn Sie PyModbus als Slave einrichten und mehr als 100 Register zur Verfügung haben möchten, müssen Sie die folgenden Codezeilen in Ihrem Python-Skript bearbeiten, um die Anzahl der Register zu berücksichtigen, die Sie aktualisieren möchten.

Hier initialisieren Sie Ihren Datenspeicher in Ihrem Python-Skript.

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [1]*100), 
    co = ModbusSequentialDataBlock(0, [2]*100), 
    hr = ModbusSequentialDataBlock(0, [3]*100), 
    ir = ModbusSequentialDataBlock(0, [4]*100)) 
context = ModbusServerContext(slaves=store, single=True) 

Ändern Sie den Wert 100 in die Anzahl der zu aktualisierenden Register.

Vielen Dank StackOverflow und Mitwirkende. Sie sind meine Hauptaufgabe, Antworten auf Probleme zu finden. Tolle Seite.Prost