Forum: Mikrocontroller und Digitale Elektronik Probleme mit Modbusprotokoll


von Tim (Gast)


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

von MaWin (Gast)


Lesenswert?

Tim schrieb:
> mit meinem Smart-Meter über Modbus  spricht. Das Smart-Meter ist

Wie gut,  dass es nur eines gibt

https://bg-etech.de/Bedienungsanleitungen.html

Immerhin gibt es einen Standard, aber bei ModbusRTU ist der Zähler ein 
Slave

von noiasca (Gast)


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

von Olaf (Gast)


Lesenswert?

> MAX485 und besonders auch DE/RE richtig
> angeschlossen und angesteuert?

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

Olaf

von STK500-Besitzer (Gast)


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.

von Rüdiger B. (rbruns)


Lesenswert?

Die Deoversion von Simply Modbus ist gut zum Testen.
www.simplymodbus.ca

von MitLeser (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe dieses Programm genutzt um mit dem Auslesen
meines Modbus-Zählers zu starten. Dann auf einem ATmega
implementiert. Der Zähler ist ein Slave und wird abgefragt.

von MitLeser (Gast)


Lesenswert?

...die 233 auf RegAdr. 36 sind die Netzspannung.

von Olaf (Gast)


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

von Frank K. (fchk)


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

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.