Forum: Mikrocontroller und Digitale Elektronik Modbus RS485 abfragen mit ESP32 klappt nicht


von Markus _. (markush)


Lesenswert?

Hallo zusammen,

ich versuche mich gerade am Modbus, möchte einen Marstek Speicher 
abfragen. Dazu habe ich folgendes einfaches Beispiel:
1
#include <ModbusMaster.h>
2
3
ModbusMaster node;
4
5
void setup() {
6
  Serial.begin(115200);
7
  Serial1.begin(115200, SERIAL_8N1, 16, 17);  // RX, TX
8
9
  node.begin(1, Serial1);  // Slave-Adresse 1
10
  }
11
12
void loop() {
13
  uint8_t result;
14
  uint16_t data[6];
15
16
  result = node.readHoldingRegisters(0x7D65, 2);  // Startadresse 0x00, 6 Register
17
18
  if (result == node.ku8MBSuccess) {
19
    for (int i = 0; i < 2; i++) {
20
      data[i] = node.getResponseBuffer(i);
21
      Serial.print("Register ");
22
      Serial.print(i);
23
      Serial.print(": ");
24
      Serial.println(data[i]);
25
    }
26
  } else {
27
    Serial.print("Fehler: ");
28
    Serial.println(result, HEX);
29
  }
30
31
  delay(1000);  // 1 Sekunde warten
32
}

Das ganze wird unter Visual Studio Code mit dem Platformio Addon 
übersetzt und auf den ESP32 geflasht. Ich erhalte aber immer als 
Antwort: E3. Ursache dafür soll wohl ein CRC Fehler sein!??

Board ist ein AZDelivery ESP32 Wroom 32 sowie ein RS485 Adapter Board 
von Amazon.

Vielleicht kann mir jemand auf die Sprünge helfen?

: Verschoben durch Moderator
von Harald K. (kirnbichler)


Lesenswert?

Forum: Projekte & Code

Hier könnt ihr Projekte, Schaltungen oder Codeschnipsel vorstellen. 
Projekte bitte nur mit Code oder Schaltplan posten (falls ihr nur Fotos 
vorstellen möchtet, bitte in "Zeigt her eure Kunstwerke"). Bitte hier 
keine Fragen posten.


----

Markus _. schrieb:
> result = node.readHoldingRegisters(0x7D65, 2);  // Startadresse 0x00, 6
> Register

Ich glaube nicht an diesen Kommentar. Was bedeuten diese "magic numbers" 
und warum haben die so überhaupt gar nichts mit dem Kommentar zu tun?

von Markus _. (markush)


Lesenswert?

Markus _. schrieb:
> Hallo zusammen,
>
> ich versuche mich gerade am Modbus, möchte einen Marstek Speicher
> abfragen. Dazu habe ich folgendes einfaches Beispiel:
>
> [code]
> #include <ModbusMaster.h>
>
> ModbusMaster node;
>
> void setup() {


>
> Vielleicht kann mir jemand auf die Sprünge helfen?

Sorry für das falsche Forum - ich bitte einen Mod um Löschung.

von Rüdiger B. (rbruns)


Lesenswert?

Bist du sicher das der Modbus mit über 100 KBaud läuft und nicht mit 
9600 oder so?

von Markus _. (markush)


Angehängte Dateien:

Lesenswert?

Rüdiger B. schrieb:
> Bist du sicher das der Modbus mit über 100 KBaud läuft und nicht mit
> 9600 oder so?

Laut der Doku schon, hab aber auch schon andere Baudraten versucht:

: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Kaufe Dir einen einfachen Logic Analyzer für 10€, dazu einen RS485-TTL 
Umsetzer und hänge dieses Setup nur lesend an den Bus. Aus den 
Aufzeichnungen, die Du ohne große Lernkurve sehr einfach hinbekommst, 
wirst Du Ruck-Zuck das Problem sehen. Versprochen.

von Pete K. (pete77)


Lesenswert?

Oder Tasmota auf das Teil draufspielen.
Hast Du auch GND beim RS485 Adapter verbunden? Die meisten Adapter 
wollen außerdem 5V haben.

: Bearbeitet durch User
von Markus _. (markush)


Lesenswert?

Pete K. schrieb:
> Oder Tasmota auf das Teil draufspielen.
> Hast Du auch GND beim RS485 Adapter verbunden? Die meisten Adapter
> wollen außerdem 5V haben.

Hab sämtliche Varianten durch, probier da schon länger rum. Mit und ohne 
GND, 3,3V und 5V...

Ich installier mal Tasmota und versuch da mein Glück. Hab jetzt auch mal 
einen anderen RS485 Sensor geordert, dann kann ich diese Fehlerquelle 
auch ausschließen.

von Pete K. (pete77)


Lesenswert?

Achtung bei den Spannungen, der EPS32 kann meistens nur 3V3. Welche 
RS485 Board von Amazon ist es?
Ein Foto vom Aufbau oder Schaltplan wäre hilfreich.

von Markus _. (markush)


Angehängte Dateien:

Lesenswert?

Ich hab den ESP32 (momentan aktuelles Tasmota drauf) und das RS485 
Modul. Das Modul ist an den ESP32 an UART2 (IO 16 + 17) dran. Laut der 
Beschreibung kann das Modul ab 3V.

von Markus _. (markush)


Lesenswert?

Ich hab jetzt in Tasmota nach der Beschreibung gearbeitet: 
https://tasmota.github.io/docs/Modbus-Bridge/
Konfiguriert ist das Gerät bei GPIO16 + 17 als ModBR Rx und ModBR Tx.

Ich kann auch einen Befehl absenden, z.B.

ModbusSend {"deviceAddress":1, "functionCode":3, "startAddress":32100, 
"type":"uint16","count":2}

Das sollte eigentlich die battery voltage zurückliefern. Ich erhalte 
aber in der Konsole nur ein ModbusSend: Done - mehr kommt dann nicht 
mehr.

Wenn ich den Befehl sende, leuchten auch die Rx und Tx Led am RS485 
Modul kurz auf.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Und die Sender- / Empfänger-Umschaltung des RS485-Treibers macht dieses 
Modul automagisch von selbst? Funktioniert das mit jeder Baudrate, ist 
das irgendwo spezifiziert?

von Markus _. (markush)


Angehängte Dateien:

Lesenswert?

Korrekt, das Modul schaltet automatisch um!
Um den Fehler weiter einzugrenzen, hab ich mir einen anderen Modbus 
Sensor besorgt. Ein SHT20 Modul und oh Wunder! Den kann ich problemlos 
abfragen und bekomm sauber die Werte zurück. Das ganze in der Tasmota 
Konsole via ModbusSend Kommando. Abfrage des PV Speichers weiterhin 
keine Chance. Unterschied in den Parametern ist die Baudrate, der SHT 
läuft mit 9600 und der Speicher laut Datenblatt mit 115200. Aber auch 
mit anderen Baudraten kommt da nix.
Zusätzlich habe ich mir auch noch diese RS485 Modul besorgt. Dieses hat 
eine separate Ansteuerung für die Sender/Empfänger Umschaltung. Aber 
auch mit diesem Modul das selbe Verhalten. SHT20 Sensor läuft 
problemlos, der PV-Speicher macht auch hier keine Anstalten mit mir zu 
sprechen. Auch hier wieder verschiedene Baudraten probiert sowie A- und 
B-Anschluss getauscht. Langsam glaub ich, dass der Modbus von dem 
Speicher ne Macke hat.

Bleibt wohl tatsächlich nur der Vorschlag mit dem Logic Analyzer übrig 
oder?

von Markus _. (markush)


Angehängte Dateien:

Lesenswert?

Das ist die Doku von dem Teil das ich auslesen möchte. Vielleicht ist 
hier ja ein Profi in Sachen modbus unterwegs und kann mal einen Blick 
drauf werfen. Eventuell ergibt sich was das Problem lösen könnte?

Danke!

von Harald K. (kirnbichler)


Lesenswert?

Markus _. schrieb:
> Korrekt, das Modul schaltet automatisch um!

Ach, und wie tut es das?
Ist das so ein Pfusch wie hier 
Beitrag "Beschaltung Treiber RS485" besprochen?


Die UART im ESP32 kann das Sender-/Empfänger-Steuersignal in Hardware 
erzeugen (und dann via DTR ausgeben).

Nutzt Du das hiermit?

Markus _. schrieb:
> Zusätzlich habe ich mir auch noch diese RS485 Modul besorgt. Dieses hat
> eine separate Ansteuerung für die Sender/Empfänger Umschaltung. Aber
> auch mit diesem Modul das selbe Verhalten.


Nächster Schritt: Besorg Dir einen vernünftigen USB-RS485-Adapter, 
schließe den an Deinen PC an und sieh, ob Du mit einem der üblichen 
Programme à la "Modbus Poll" Dein Gerät ansteuern kannst.

Das reduziert die Anzahl der Stellschrauben, denn es ist ja nicht 
ausgeschlossen, daß a) Deine Hardware nicht OK ist und b) Deine 
Modbus-Implementierung nicht OK ist.

Modbus Poll aber macht's richtig, das kannst Du als eine Art "Referenz" 
ansehen.

von Markus _. (markush)


Lesenswert?

So, das Geheimnis ist gelüftet!!! Durch einen netten Mitmenschen in 
einem anderem Forum wurde ich darauf aufmerksam gemacht, doch mal die 
CRC abzuschalten da dies mit dem verwendetetem Marstek Speicher wohl ein 
Problem sei. CRC deaktiviert und siehe da, sofort kommen die Werte rein. 
Egal mit welchem RS485 Adapter - eindeutig keine Hardwaresache also.

Auf meine Frage, warum dies mit Marstek ein Problem ist kam die Aussage, 
dass diese wohl bei der Implementierung des modbus einen Fehler gemacht 
hätten. Es sei dort High- und Lowbyte zur CRC Prüfung vertauscht worden. 
Ich habe dann die Routine der verwendeten Lib umgebaut und die Bytes 
vertauscht. Jetzt kommen die Werte auch wieder mit aktivierter CRC 
Prüfung.

Somit für mich Problem gelöst 👌

Danke nochmal für die ganzen Hilfestellungen.

von Hans-jürgen H. (hjherbert) Benutzerseite


Lesenswert?

Ich vermute dass da die Register-Nummer nicht mit dem zu übertragenden 
Wort übereinstimmt.
Eine 0x0002 kann das Register 3 sein.
Eventuell kann auch ein Offset von 20000, 30000 oder ähnlich in der 
Registernummer enthalten sein, möglicherweise um mit der Modicon 
kompatibel zu sein.

von Rainer W. (rawi)


Lesenswert?

Markus _. schrieb:
> Hab sämtliche Varianten durch, probier da schon länger rum. Mit und ohne
> GND, 3,3V und 5V...

Ab einer gewissen Stufe von "sämtliche Varianten probiert" kann das zum 
vorzeitigen Ableben von Komponenten führen. Sinnloses Probieren ist 
selten hilfreich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus _. schrieb:
> Bleibt wohl tatsächlich nur der Vorschlag mit dem Logic Analyzer übrig
> oder?
Ich würde zuallererst mal mit einem Oszi die Signalqualität (Pegel, 
Flankensteilheit, Überschwinger) kontrollieren. Denn die sehr binäre 
01-Abbildung des LA kann solche Fehler leicht übersehen.

Beitrag #7836597 wurde vom Autor gelöscht.
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.