Modbus RS485 abfragen mit ESP32 klappt nicht

OP #7832712

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

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 #7832783

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.

#7832894

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.

OP #7832920

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

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

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

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

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

Eine eigene Frage? Dieser Thread ist über ein Jahr alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.