Forum: Mikrocontroller und Digitale Elektronik Modbus zu langsam


von Robert (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Was zeigen denn die entsprechenden Oszillogramme der Schnittstelle? Wo 
treten dort welche Latenzen auf?

von Olaf (Gast)


Lesenswert?

> 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

von STK500-Besitzer (Gast)


Lesenswert?

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)?

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Robert schrieb:
> es sendet sofort
> eine Antwort an Master. Master is ein Python program.

Dann wird wohl das Python das Problem sein.

von STK500-Besitzer (Gast)


Lesenswert?

Peter D. schrieb:
> Dann wird wohl das Python das Problem sein.

Wie lange der braucht, ist doch egal.

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Olaf (Gast)


Lesenswert?

> 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

von Anselm (Gast)


Lesenswert?

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

von Anselm (Gast)


Lesenswert?

btw.: Den Slave zu programmieren ist garnicht so einfach, denn Modbus 
via RS485 hat spezielle Timinganforderungen.

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Olaf (Gast)


Lesenswert?

> 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

von Gerhard O. (gerhard_)


Lesenswert?

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
Noch kein Account? Hier anmelden.