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?
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.
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.
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.
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.
Und die Sender- / Empfänger-Umschaltung des RS485-Treibers macht dieses Modul automagisch von selbst? Funktioniert das mit jeder Baudrate, ist das irgendwo spezifiziert?
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?
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?
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.
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.
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.
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.
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.