class: center, middle  # Solaranlagen ### abfragen mit Modbus/RTU und C++ #### Hauke Goos-Habermann ⇒ https://goos-habermann.de --- ### Über mich - Entwickler des
Softwareverteilungssystems m23
- Organisator der
Kieler Open Source und Linux Tage
-
Dienstleister zu m23, Linux und Freier Software
- Softwareentwicklung (PHP, BASH, C/C++, JS, Python und was sonst so gebraucht wird...) - Administration - Schulungen - Support - Beratung - quasi **alles**, *was mit Linux zu tun hat* - Wöchentlicher Livestream *"Jean und Hauke Show"* auf https://www.youtube.com/c/LinuxGuides - *"Nicht der Weisheit letzter Schluß"* mit **beruflichen** oder **privaten Projekten** auf
tube.tchncs.de/c/ndwls
und
youtube.com/@nichtderweisheit
- Will Informationen aus einem Wechselrichter auslesen. --- ### Modbus?  Modbus ist ein **Standard**, um **Daten** (z.B. Meßdaten, wie Temperatur oder Akkustand) von einem **Server** (z.B. Wechselrichter) zu **Lesen** bzw. auf diesen zu **schreiben** (z.B. Einstellungen). Bei Modbus werden Daten **seriell** über
RS-485
bzw.
RS-232
(COM-Port) oder **Ethernet** übertragen. Es können **mehrere Server**, die durch eine eindeutige Nummer **adressiert** werden, an einem Modbus hängen und angesprochen werden. Mehr dazu: https://de.wikipedia.org/wiki/Modbus --- ### Modbus-Betriebsarten  Die Daten werden je nach Anwendungszweck und Übertragungsweg anders kodiert bzw. in Pakete verpackt: *
**Modbus/RTU**
(Remote Telemetry Units): Binäre Daten, die interpretiert werden müssen * **Modbus/ASCII**: Textdaten, sofort lesbar, aber weniger Datendurchsatz * **Modbus/TCP**: Wie RTU, aber Daten in TCP-Paket verkapselt --- ### Modbus-Objekttypen  Server stellen Daten über **definierte Schnittstellen** bereit, bzw. nehmen diese darüber entgegen. Eingeteilt werden diese Ein-/Ausgabekanäle in folgende **Objekttypen**: * **Coil**: 1 Bit, Wahrheitswerte, Lesen/Schreiben * **Discrete Input**: 1 Bit, Wahrheitswerte, nur Lesen *
**Input Register**
: 16 Bit, "Analogwerte", nur Lesen, Code 0x04 *
**Holding Register**
: 16 Bit, "Analogwerte", Lesen/Schreiben, Code 0x03, 0x06, 0x16 Je nach Datenart können auch z.B. **mehrere Register** nacheinander verwendet und zu einem **Ergebnis zusammengesetzt** werden. --- ### Was braucht man dafür?  Software * Linux :-) * GNU C++ Compiler * libmodbus: https://libmodbus.org Hardware * Linux-Gerät (z.B. Raspberry Pi) * USB-zu-RS-485-Konverter * Modbus-fähiges Gerät (z.B. Wechselrichter) * Doppeladerkabel zum Verbinden Sonstiges * Herstellerdokumentation für Konfigurationsparameter --- ### C++  In
modbus.cpp
findet Ihr die **C++-Klasse *CModbus*** für eigene Experimente. Kompilieren und ausführen mit: ```bash g++ -Wall -I/usr/include/modbus\ modbus.cpp -lmodbus -o modbus ./modbus ```  Lest die **Herstellerdokumentation** ganz genau und seid insbesondere beim **Verkabeln vorsichtig**.***CModbus*** bietet absichtlich nur **lesenden Zugriff** auf Register, was *eigentlich* unproblematisch sein sollte.Wie immer macht Ihr aber alles auf **eigene Gefahr** und es kann wirklich **alles kaputtgehen**! --- class: center, middle ### Informationen zu mir und meinen Dienstleistungen, m23, ... ### https://goos-habermann.de