Hi, ich habe einen Modbus-Slave RTU mit ESP32 programmiert, es sendet sofort eine Antwort an Master. Master is ein Python program. Mein Problem ist, dass eine Read Anfrage über 1 Sekunde dauert. Ist es normal bei der Schnittstelle? Ich habe mit 9600 und 115200 getestet. Beide dauert knapp über eine Sekunde.
1 Sekunde ist eher nicht normal. Allerdings ist Modbus nun auch nicht superschnell. Es gibt keine Zykluszeiten die irgendwie garantiert werden. Daher eher ungeeignet, wenn es auf Geschwindigkeit ankommt.
Was zeigen denn die entsprechenden Oszillogramme der Schnittstelle? Wo treten dort welche Latenzen auf?
> Daher eher ungeeignet, wenn es auf Geschwindigkeit ankommt.
Kann man so allgemein nicht sagen. Technisch kann man vom Bus
selbst erwarten das er unmittelbar nach einer Anfrage eine
Antwort schickt.
Es mag aber natuerlich sein das ein Sensor selbst relativ
lange braucht um eine Antwort zu generieren.
Sowas sollte aber dann auch im Handbuch stehen.
Olaf
aus dem Wikipedia (https://de.wikipedia.org/wiki/Modbus#Modbus/RTU): "Tritt zwischen zwei Zeichen eine Sendeunterbrechung auf, die länger als 1,5 Zeichen ist, so ist das Telegramm als unvollständig zu bewerten und sollte vom Empfänger verworfen werden." Wer braucht von den beiden eine Sekunde (oder länger)?
Ich programmiere Slaves immer so, daß sie ständig im Hintergrund Messungen durchführen und im RAM ablegen. Sendet dann der Master eine Anfrage, dann kann der Slave unmittelbar antworten und das Ergebnis aus dem RAM senden. Die Meßrate wählt man entsprechend den Erfordernissen. Z.B. einen DS18B20 frage ich alle 5s ab, damit er nicht durch Eigenerwärmung die Messung verfälscht.
Robert schrieb: > es sendet sofort > eine Antwort an Master. Master is ein Python program. Dann wird wohl das Python das Problem sein.
Peter D. schrieb: > Dann wird wohl das Python das Problem sein. Wie lange der braucht, ist doch egal.
STK500-Besitzer schrieb: > Wie lange der braucht, ist doch egal. Wie lange der zum Auswerten der Antwort braucht, ist doch egal. Die Anfragen an Slave (egal, ob read oder write), sollten immer "Strings" sein, die am Stück gesendet werden können. Peter D. schrieb: > Ich programmiere Slaves immer so, daß sie ständig im Hintergrund > Messungen durchführen und im RAM ablegen. Sendet dann der Master eine > Anfrage, dann kann der Slave unmittelbar antworten und das Ergebnis aus > dem RAM senden. Nicht nur du.
> 1,5 Zeichen ist, so ist das Telegramm als unvollständig zu bewerten und > sollte vom Empfänger verworfen werden." Innerhalb eines Telegramms, aber das ist was anderes als zwischen zwei Telegrammen! > Ich programmiere Slaves immer so, daß sie ständig im Hintergrund > Messungen durchführen und im RAM ablegen. Sendet dann der Master eine > Anfrage, dann kann der Slave unmittelbar antworten und das Ergebnis aus > dem RAM senden. Das kann Wuenschenwert sein, aber auch totale Kacke. Nimm als Beispiel mal einen Sensor der vom Messprinzip her langsam ist und den der Anwender erstmal irgendwo reinsteckt um dann eine Messung auszuloesen. Dann willst du nicht das Ergebnis der Luftmessung von kurz vorher bekommen. Es haengt halt sehr von der Anwendung ab. Olaf
1 | from pymodbus.client.sync import ModbusSerialClient as ModbusClient |
2 | def ReadInput(port, baudrate, SlaveID, register): |
3 | client=ModbusClient(method='rtu',port=port, |
4 | baudrate=baudrate,timeout=1,parity='N',stopbits=2) |
5 | client.close() #Falls zuvor connected |
6 | client.connect() |
7 | if client.connect(): |
8 | Input = client.read_input_registers(register, 1, unit = SlaveID) |
9 | client.close() |
10 | return Input.registers[0] |
11 | |
12 | def MAINLOOP() |
13 | Errorcounter = ReadInput("COM4", 9600, 42, 52) |
14 | |
15 | while(1): |
16 | MAINLOOP() |
17 | time.sleep(1) |
probier mal den Code, vielleicht liegt es wirklich an deinem PythonScript Gruß Anselm
btw.: Den Slave zu programmieren ist garnicht so einfach, denn Modbus via RS485 hat spezielle Timinganforderungen.
Anselm schrieb: > btw.: Den Slave zu programmieren, ist gar nicht so einfach, denn Modbus > via RS485 hat spezielle Timinganforderungen. Höchstens die Zeit zwischen Empfang einer Anfrage und der Antwort darauf. Olaf schrieb: > Innerhalb eines Telegramms, aber das ist was anderes als zwischen zwei > Telegrammen! Ich hatte irgendwas mit "Zeichenlänge" und "Timeout" im Kopf. Genaueres gibt's im Wikipedia-Artikel.
> denn Modbus via RS485 hat spezielle Timinganforderungen.
Man hofft halt das moderne Microcontroller schnell genug sind das
man das selbst in so was schnarchigem wie Phyton hinbekommt. :)
Und man muss auch zugeben das mein uebliches Stromsparargument,
gerade bei Sensoren oft EXTREM wichtig, bei Modbus schon allein
durch den Busabschluss ausgehebelt wird. Da sollte dann auch ein
Controller drin sein der mit 50MHz laeuft.
Olaf
Vor 12 Jahren machte ich ein Sensorprojekt in der Firma mit Modbus. Da mußten zum Testen und Kalibrierung ca. 100 16-bit Register zyklisch geschrieben und gelesen werden. UC war ein STM32F103, der mit 36MHz lief. BR war 19K2. Unter diesen Bedingungen waren über USB/RS-485 ein paar komplette Transaktionen/s mit einem W7 PC bequem möglich. Zum Testen Verwendete ich ein in-House LabVIEW Programm und für rohes Testen während der Entwicklung MdBus. Das sollte einen typischen Anhaltspunkt geben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.