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
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.
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.
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:
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.
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.
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.