Auslesen RS-485 suspekte Registergröße

Hallo zusammen, ich bin neu hier und bei Arduino. Bislang nur über ESPhome programmiert bin dort aber stark begrenzt.
Ich habe mir nun einige Projekte angeguckt wie ich über rs485 und ModbusMaster Daten auslesen.

Aufbau:
ESP32 - rs485 TTL adapter - slave 1 bis slave 3
Mein Problem:
Vom Slave 3 bekomme ich Daten mit einen Startbytes von 0xA5 und die Register sind 8 Byte groß. Also kein Standard von 2 Byte.
Wie kann ich als Beispiel vom Register 0x90 Byte 3 auslesen als float.

Ich hoffe ihr versteht mich.
Grüße vom Neuling SirUlbrich

Schon. Du möchtest also Rat zur Behandlung eines Problems mit einem nicht näher spezifizierten slave 3?

Dazu kann ich nur sagen:

Wirf slave 3 weg und beutze stattdessen slave 4.

HTH

ja ich hätte gerne Rat zur Behandlung der Projektes bzw des "Codeschnipsel" für den Part.

wegwerfen ist leider keine Option.
näher spezifiert ist Slave 3 ein Daly BMS
mit den oben genannten Grundspezifikationen.

"floats" muss man meist mit 4 bytes richtig zusammenstellen.

bitte verlinke das Datenblatt von deinem Device und beschreibe exakt was du genau auslesen möchtest.

Wenn du hilfe zu deinen kryptischen Angaben brauchst, zeige deinen Code und die Ausgabe auf der Seriellen Schnittstelle.

1 Like

Ich habe noch kein Ergebnis weil ich nicht verstehe wie ich void loop() aufbauen muss.
Hast du ggf eine Hilfestellung für micht / tutorial? oder Codebeispiel?

Es handel sich um 0x90, 0x93,0x97 und 0x98

Ausgabe soll über mqtt bereitstellung laufen. (Möchte aber vorerst erstmal die Daten erhalten um in Arduino / C++ klar zu kommen. Leider schon etwas her das ich mit c++ programmiert habe.



aus der Teilinformation ist nicht klar mit welchem Functioncode das gelesen werden soll.
Verlinke die ganze Beschreibung.

Was klar ist, dass das keine Floats sind sondern die Werte einfach als Zehnteleinheiten angeliefert werden. Also brauchst nur jeweils zwei Byte in einen Wert übernehmen.

Daly UART_485 Communications Protocol V1.2 (1).pdf (164,7 KB)

Du meinst Data ID?

Was für Probleme hast Du damit?
Wie sieht Dein bisheriger Code dazu aus?

Ich weiss nicht welches der sinnvollere weg ist Register auszulesen, habe mehrere Möglichkeiten gefunden. Falls es eine Art Wiki gibt würde ich mich als Info auch darüber freuen wie es geht. Ich verlange kein Code schreiben für mich. Nur eine Hilfestellung

das ist KEIN Modbus.
Das Format ist vermutlich proprietär und du musst das selber erstellen und parsen.
die Modbus Master Library wird das nicht lesen können.

Also war ich auf den falschen Weg. Verdammt. Mit welcher library wird es was?

suchen oder selber schreiben.

Fang mal an einfache byte abfragen zu machen und schau ob das Ding überhaupt reagiert.
Wenn du erste verlässliche erfolge hast, kann man sich das ansehen wie man das runderhum "in schön" macht.

Deine 8 bytes liest Du mit Serial.read() ein und baust die aneinander.
PAP:
Baue einen leeren BUFFER mit 8 byte
setze INDEX auf das 1. Element (also 0)
Lösche den seriellen Buffer
Sende Funktionscode
Wenn der serielle Puffer eine Antwort hat:
Fülle Element INDEX mit Byte und erhöhe Index
Wenn INDEX > als maximale Elemente (also 7) ist Deine Antwort vollständig und werte den BUFFER aus.

Fertig.

// EDIT Ich hab mal in das DaBla geschaut. Nett! Das sind nicht einfach 8 byte, sondern die Antwort ist 8 Byte, deren Inhalt teilweise auf 1 bit-Basis (0x97) oder z.B. int (0x90) sind.

Nette Aufgabe; Da kann man bestimmt was schönes zu bauen.

Hast Du überhaupt schon etwas von dem Gerät bekommen?

Zum Code für eine allgemeine RS-485 Schnittstelle:
Das RS-485 Modul muß bei half-duplex Betrieb zwischen Senden und Empfangen umgeschaltet werden. Den Empfänger kann man auch ständig eingeschaltet lassen, muß dann aber die selbst abgeschickten Bytes überlesen.

Es könnte einfacher sein, das Gerät direkt über UART (RX/TX) anzusprechen. Dann sollte RX am Controller wohl mit einem Pullup Widerstand auf Vcc (3,3V) hochgelegt werden.

Vermutlich mußt Du das Start Byte, PC-Adresse, Data ID, 8 Datenbytes (irgendwas) und ein Checksum-Byte abschicken, Wo steht, wie die Checksum zu berechnen ist? Vielleicht dieses:

  1. The test is the sum of all previous data(only low byte).

Danach sollte eine Antwort kommen, die auch wieder 8 Datenbytes enthält. Diese Bytes kannst Du dann wie in der Tabelle angegeben interpretieren.

1 Like

Aktuell lese ich es über ESPhome aus. Da ist etwas vorgefertigt jedoch ohne das was ich für wichtig halte. Somit suche ich eine alternative zu ESPhome und bin auf Arduino gestoßen. Habe auch das Buch Arduino Kompendium zu Hause.
Jedoch ist dies etwas spezieller hier.
Esphome liest direkt über UART. Ich möchte jedoch alle slaves einen Bus laufen haben.

Ja vor allem als Einsteiger :laughing:

Dann besorge Dir die Slaves, die über diesen Bus laufen können. Und die Arduino Bibliothek zu diesem Bus.

Alles halb so schlimm. Ich bau Dir was zu morgen. Jetzt am Tage schaff ich das nicht.
Ich bin nur noch nicht durchgestiegen, was das mit der CRC ist... Die muss ja irgendwo berechnet werden.

Gibt es evtl. noch mehr Dokumente zum Download?

Das ist super nett von dir. Dankeschön habe ich nicht erwartet.
Nein was die Kommunikationsschnittstelle angeht ist es das einzige.

nur addieren und das LSB nehmen.

man könnte mal einen Test machen mit:

0xA5, 0x40, 0x90, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0x7d

edit:
hier findet man weitere Beispiel Messages:

da man mit etwas googlen aber eh den Rest auch finden wird, bin ich da mal draußen.