Modbus RS485 abfragen mit ESP32 klappt nicht

OP #7832712
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?

#7832718
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?

OP #7832920
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.

OP #7833004
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.

OP #7833664
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?

Angehängte Dateien:
#7833867
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.

OP #7833889
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.

Beitrag #7836597 wurde von einem Moderator gelöscht.

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