Modbus RTU + TCP library

Moin, ich mochte mit einem Arduino temperaturen ueber Onewire (DS18B20, funktioniert auch schon) sowie Daten aus mehreren Energie-Zaehlern (werden ueber Modbus RTU ausgelsen) auslesen und die Werte dann via ModBus TCP wieder zur verfuegung stellen.

Dazu bin ich auch der suche nach einer library die Modbus RTU (Master) sowie ModBus TCP (slave) kann. Bisher habe ich nur eine gefunden die beides kann (https://github.com/andresarmento/modbus-arduino), aber leider nur als slave. Der versuch mit 2 libarys zu arbeiten scheiterte leider auch.

Kann mir da jemand einem Tip geben, wo ich etwas passendes an libary finden kann?

mfg Bjoern

Von Arduino zum Raspberry per RTU und dann mit OpenHab oder FHEM ins Netz.

Danke fuer den Tip skorpi080, leider bedingt mein Projekt das auslesen eines SDM120 Energiezaehlers per ModbusRTU und die weitergabe der Daten an einen Raspberry Pi via ModbusTCP.

Auslesen des SDM120 (alleine Funktioniert), die ModbusTCP Verbindung funktioniert alleine auch.
Aber ich bekomme (sobald ich beide Libarys include) Fehlermeldungen bei kompilieren und finde keine Libary die beides koennen oder einzelne die sich “vertragen”…

Wenn da jemand eine antwort wuesste, ich wuerde mich darueber freuen.

Bjoern

Was sind denn das für Fehlermedldungen. Mal hier herein kopien. Deinem Beschrieung mit Master/Slave ist auch nicht eindeutig Modbus RTU hat Master/Slave:

  • der Slave stellt nur Daten bereit und Anworter auf Abruf
  • der Master stellr Anfragen an die Slaves die dann daruf Warten

Modbus TCP hat Server/Cient:

  • Der Mobus Server stellt Daten bereit und Antwortet auf Abrufe der Master speizifieziert oder nur von einem bestimmten IP-Port oder Ähnliches
  • Modbus Client holt sich die Daten an den Server ab und verarbeitet sie weiter.

Meine Idee wäre eine RS485 Modbus Verbindung zwischen dem Rasberry und dem Arduino also auf dem Arduino MEGA (2 Hardware seriell). Ein Modbus Master für den SDM120 und einen Slave für den Rasperry, also beides RTU. Da auch der Raspberry Hardware Seriell hat sollte dies eigentlich funtktionieren. Modbus RTU findet man im Netz auch einige die Lib von riptideio läuft. Gruß DerDani

Denn versuch ich das ganze nochmal genauer zu Schildern.

ModbusRTU (Softserial an pin 8,9) mit Wandler auf RS485 als ModBus RTU-Master. Es befinden sich derzeit 2 Slaves am Bus (RS485). Einmal ein KW/h Zahler Modbus Stromzaehler ZW4, einmal ein SDM120 SDM120 mit Modbus.

ModbusTCP hatte ich an einen Slave gedacht, koennte aber auch ein Master werden. Muss dann halt auf der gegenseite (Raspberry Pi mit Codesys) endsprechend Programmiert werden.

Fuer den ModbusRTU verwende ich die ModbusRTU.h

Auf der LAN seite hatte ich an die MgsModbus gedacht. Alleine Funktioniert das auch, binde ich die Mdobus RTU.h mit ein kommen die Fehlermeldungen.

Arduino: 1.8.2 (Windows 7), Board: "Arduino/Genuino Uno"

In file included from D:\Benutzer\Bjoern\Eigene Dokumente\Arduino\MgsModbus_test_Slave\MgsModbus_test_Slave.ino:8:0:

D:\Benutzer\Bjoern\Eigene Dokumente\Arduino\libraries\ModbusRTU/ModbusRtu.h:95:6: error: multiple definition of 'enum MB_FC'

enum MB_FC

^

In file included from D:\Benutzer\Bjoern\Eigene Dokumente\Arduino\MgsModbus_test_Slave\MgsModbus_test_Slave.ino:3:0:

MgsModbus.h:68: error: previous definition here

enum MB_FC {

^

exit status 1 previous definition here

Dieser Bericht wäre detaillierter, wenn die Option "Ausführliche Ausgabe während der Kompilierung" in Datei -> Voreinstellungen aktiviert wäre.

Du müsstest eine Modbus Lib anpassen und zwar ist die Funktionscode aufzählung innerhalb der ModbusRTU und MgsModbus.h vorhanden. Also öffenen der Modbus.h und nach dem enum MB_FC suchen und umbennen und überall wo diese aufzählung genutz wird anpassen auf den neuen Namen. Gruß DerDani

Ich habe mal mit Notepad++ zählen lassen.
Einmal diese alle:
2017-09-19 14_51_05-D__Daniel_Sketchbook_libraries_ModbusRtu_ModbusRtu.h - Notepad++.jpg

Umbennen in z.B. ModBus_FC mit Suchen/Ersetzten speichern und IDE neustarten und testen

Gruß
DerDani