Probleme mit Modbusprotokoll

Gast #6987249
Lesenswert?

Hallo,

Ich versuche, dass mein Mega2560 mit meinem Smart-Meter über Modbus 
spricht. Das Smart-Meter ist der Master und sendet mir folgendes:

02 03 00 01 00 01 D5 F9

Sagt mir, er möchte ein analoges Register vom Slave mit Adresse 2 
auslesen, beginnend bei Register 1.

Ich sende dem Master folgendes zurück:

02 03 02 00 64 FD AF

Slave 2 antwortet auf analoge Registerabfrage, 2 Bytes werden kommen, 
16-bit Wert '100' und den CRC.

Nach einem online Parser ist meine Antwort stimmig, aber passt sie 
wirklich zu der Frage des Masters? Bisher zeigt er mir gar nichts an und 
mir fehlen langsam die Ideen.

Ich nutze eine der internen UART Schnittstellen. Muss ich nach Abschluss 
der Sequenz ein CR schicken?

Morgen möchte ich mal mit dem Oszi schauen, ob mein Max485 überhaupt 
sendet.


Tim
Gast #6987411
Lesenswert?

Tim schrieb:
> passt sie
> wirklich zu der Frage des Masters? Bisher zeigt er mir gar nichts an und
> mir fehlen langsam die Ideen.
>
> Ich nutze eine der internen UART Schnittstellen. Muss ich nach Abschluss
> der Sequenz ein CR schicken?

imho passen request und response zusammen.
Nein, Modbus-RTU schließt nicht mit "CR" ab.

Was ich an deiner Stelle prüfen würde
a) mit einem USB-RS485 Wandler am Bus mithorchen ob dein Slave wirklich 
diese Daten am Bus sendet. MAX485 und besonders auch DE/RE richtig 
angeschlossen und angesteuert?
b) mit einem Modbus-Progrämmchen am PC den Request senden und prüfen ob 
der Slave antwortet
Gast #6987475
Lesenswert?

Olaf schrieb:
> Das ist immer der Moment wo Programmiere auf Hardware treffen und lernen
> das Buffer auch mal schlecht sein koennen. :-D

Hä?
Man muss nur das richtige Event zur Steuerung des DE/RE-Pins verwenden.
AVR liefern das TXC-Flag, wenn der (Hardware-)Buffer komplett verschickt 
wurde. Damit kann man dann die Datenrichtung des Transceivers 
umschalten.
Das hat rein gar nichts mit einer Pufferproblematik zu tun.
Gast #6987615
Lesenswert?

> Man muss nur das richtige Event zur Steuerung des DE/RE-Pins verwenden.

Aber Leute die nur programmieren und nichts mit Hardware machen
haben das oft nicht auf dem Schirm.

Und ich hatte auch schonmal einen Mikrocontroller der hat das 
entsprechende Flag schon weggenommen wenn vom letzten Bit erst 2/3 
ausgegeben waren. Das hat dann oft funktioniert, gelegentlich auch mal 
nicht. Je nach Mondphase und Umgebungstemperatur.
Jedenfalls einmal unseren schnieken Oszi dranhalten und genau darauf 
achten was auf dem Bus laeuft kann nicht schaden.

Olaf
#6987842
Lesenswert?

Tim schrieb:

> Nach einem online Parser ist meine Antwort stimmig, aber passt sie
> wirklich zu der Frage des Masters? Bisher zeigt er mir gar nichts an und
> mir fehlen langsam die Ideen.

Hast Du das hier gelesen und auch verstanden?

https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf

Da steht auf Seite 13, dass zwischen zwei Bytes einer Message nicht mehr 
als 1.5 Zeichen Pause sein dürfen. Ansonsten wird das Paket als 
unvollständig verworfen. Zwischen zwei Paketen müssen mindestens 3.5 
Zeichen Pause sein.

"n Zeichen Pause" ist der Zeitraum, in dem n Zeichen gesendet werden, 
also 1 Startbit, 8 Datenbits, 0 oder 1 Parity Bit, 1, 1.5 oder 2 
Stopbits mit der voreingestellten Baudrate.

Wenn Du hier das Timing nicht einhältst, dann sind Probleme garantiert.

> Ich nutze eine der internen UART Schnittstellen. Muss ich nach Abschluss
> der Sequenz ein CR schicken?

Lies gefälligst die originalen(!) Modbus-Spezifikationen unter 
modbus.org.

https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf

sowie die oben verlinkte Spezifikation für die serielle Übertragung.

Da steht alles drin.

fchk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren