Moin, Ich möchte gerne einen Arduino Mega zur Steuerung einsetzen. Dieser soll als Modbus Slave über RS485 Befehle erhalten. Dazu gibt es eine Library. Kein Problem. Gleichzeitig sollen ZWEI andere Serielle Schnittstellen zwei Sensoren auslesen, die auch über RS485 Modbus angebunden sind. Hierzu muss ich zusätzlich zu dem Modbus Slave auf COM1 noch je einen Master auf COM2 und COM 3 realisieren. Ich möchte nicht die Sensoren direkt an das Steuernetzwerk verbinden. Softwaretechnisch wäre das ja kein Problem. Ich müsste nur Ein Objekt als Slave initialisieren und zwei Objekte als Master. Leider ist das in den Arduino Libraries nicht getrennt. Da wird irgendwo im .h oder im .cpp ein Objekt instanziiert, dass dan verwendet werden muss. Ein zweites ist unmöglich. Wie kann man dieses Problem lösen? wer kennt eine Library für Modbus, die gleichzeitig mehrere Links initialisieren kann. Benutzt werden sie natürlich nacheinander. Viele Grüße Alexander
Hallo, die fertigen Objekte heißen Serial Serial1 Serial2 Serial3
Alexander S. schrieb: > Leider ist das in den Arduino Libraries nicht getrennt. Da wird irgendwo > im .h oder im .cpp ein Objekt instanziiert, dass dan verwendet werden > muss. Ein zweites ist unmöglich. > Aber man könnte doch diese .h und .cpp ändern und mehrere Objekte erzeugen? Oder sind die schreibgeschützt?
Beitrag #7211123 wurde vom Autor gelöscht.
Hallo, nochmal nachgedacht. Auf der seriellen Seite gibts doch gar kein Master/Slave. Hat also nichts mit den seriellen Objekten zu tun. Wer Master und wer Slave ist legst auch nur du für dich fest. Für die Kommunikation muss die Datenrichtung sowieso umgeschalten werden. Dafür benötigt jedes Device einen Pin für die Datenrichtungsumschaltung der am RS485 IC o.ä. wirkt. Dafür kannste dir eine eigene Klasse mit seriellen Objekt und Pin schreiben. Ein fremde Lib benötigt man dafür eigentlich nicht.
Alexander S. schrieb: > Moin, > > Ich möchte gerne einen Arduino Mega zur Steuerung einsetzen. > > Dieser soll als Modbus Slave über RS485 Befehle erhalten. Dazu gibt es > eine Library. Kein Problem. > >..... Hallo Welche Lib nutzt du ? ( gibt ja leider mehrere ) Gruesse
PittyJ schrieb: > Alexander S. schrieb: > Aber man könnte doch diese .h und .cpp ändern und mehrere Objekte > erzeugen? > Oder sind die schreibgeschützt? Kann man. Das Problem ist, dass Arduino Bibliotheken interne Sachen wie Timer, Register oder Globals verwenden. Da kollidieren die kopierten Klassen. Veit D. schrieb: > Hallo, > > die fertigen Objekte heißen > Serial > Serial1 > Serial2 > Serial3 Von welcher Library gehst Du aus? Veit D. schrieb: > Hallo, > > nochmal nachgedacht. Auf der seriellen Seite gibts doch gar kein > Master/Slave. Hat also nichts mit den seriellen Objekten zu tun. Wer > Master und wer Slave ist legst auch nur du für dich fest. Für die > Kommunikation muss die Datenrichtung sowieso umgeschalten werden. Dafür > benötigt jedes Device einen Pin für die Datenrichtungsumschaltung der am > RS485 IC o.ä. wirkt. Dafür kannste dir eine eigene Klasse mit seriellen > Objekt und Pin schreiben. Ein fremde Lib benötigt man dafür eigentlich > nicht. Bei serieller Kommunikation hast Du recht. Hier soll aber das MODBUS Protokoll verwendet werden (ist ein Industriestandard) das funktioniert nun mal so: Master fragt - Slave antwortet darauf. Klaus H. schrieb: > Welche Lib nutzt du ? > ( gibt ja leider mehrere ) > > Gruesse Ich wollte diese hier verwenden: https://www.arduino.cc/reference/en/libraries/arduinomodbus/ Ich bin aber flexibel. Wenn Du eine kennst, di macht was ich brauche, nehme ich eine andere. Viele Grüße Alexander
Alexander S. schrieb: > Veit D. schrieb: >> Hallo, >> >> die fertigen Objekte heißen >> Serial >> Serial1 >> Serial2 >> Serial3 > > Von welcher Library gehst Du aus? Du hast doch einen Mega2560? Wieviele Hardware Serielle hat das Ding? Wie werden diese standardmäßig angesprochen? > Bei serieller Kommunikation hast Du recht. Hier soll aber das MODBUS > Protokoll verwendet werden (ist ein Industriestandard) das funktioniert > nun mal so: Master fragt - Slave antwortet darauf. Das macht meine RS485 Verbindung auch. Ich lege vorher im Programm fest wer Master und wer Slave ist. Das kannst du auch. Das bedeutet doch letztlich nur das alle Slaves standardmäßig auf dem Bus lesend eingestellt sind und das ihr Normalzustand ist. Der Master sendet dagegen immer zuerst was raus. Aber auch der kann im Ruhezustand auf Bus lesend eingestellt sein. Bedenke noch eins. Die Kommunikation auf dem Controller läuft serial ab. RS485 oder Modbus ist nur das Medium in der Außenwelt über die es letztlich läuft. Dein Programm oder dein Controller kennt kein RS485/Modbus, muss er auch nicht kennen.
:
Bearbeitet durch User
Veit D. schrieb: > Das macht meine RS485 Verbindung auch. Ich lege vorher im Programm fest > wer Master und wer Slave ist. Das kannst du auch. Das bedeutet doch > letztlich nur das alle Slaves standardmäßig auf dem Bus lesend > eingestellt sind und das ihr Normalzustand ist. Der Master sendet > dagegen immer zuerst was raus. Aber auch der kann im Ruhezustand auf Bus > lesend eingestellt sein. > > Bedenke noch eins. Die Kommunikation auf dem Controller läuft serial ab. > RS485 oder Modbus ist nur das Medium in der Außenwelt über die es > letztlich läuft. Dein Programm oder dein Controller kennt kein > RS485/Modbus, muss er auch nicht kennen. Hä? ModbusRTU ist ein Protokoll, das auf einer RS485 umgesetzt wird. Die Arduino-Lib kann offensichtlich nur mit einer Schnittstelle ("Serial") umgehen. Der TO bräuchte aber eine Lib, die es ermöglicht, mehrere Instanzen der Klasse anzulegen, die dann verschiedene Rolle (ein Master und zwei Slaves) auf drei Schnittstellen übernehmen. So eine Lib (allerdings in C) haben wir uns in der Firma programmiert, bei der die Rollen per #define festgelegt werden. Jetzt müsste man also die Arduino-Lib analysieren und daraus eine machen, die mehrere (serielle) Schnittstellen unterstützt. Vielleicht reicht es ja schon aus, die Klasse abzuleiten und den Konstruktor zu erweitern...
Ich frage mich, warum nicht beide Sensoren an einen Kanal (d.h. an den gleichen Modbus-Master) angeschlossen werden können. Unterstützen die Sensoren keine Adressierung? Es ist doch genau der Sinn eines Busses, mehrere Teilnehmer zu unterstützen. Gruß Tom
Alexander S. schrieb: > Hierzu muss ich > zusätzlich zu dem Modbus Slave auf COM1 noch je einen Master auf COM2 > und COM 3 realisieren. Ich möchte nicht die Sensoren direkt an das > Steuernetzwerk verbinden. warum müssen die zwei Sensoren auf separten Serials sein? Zumindest für diese zwei Sensoren sollte wohl ein RS485 Bus reichen. Habs nicht ausprobiert, aber imho müsste die ModbusMaster von Doc Walker parallel mit meiner Noiasca Modbus Server auf einem Mega durchaus zurecht kommen. Link: https://werner.rothschopf.net/microcontroller/202112_arduino_modbus_server.htm Halt aufpassen mit den callbacks dass du jeweils die richtigen aufrufst.
noiasca schrieb: > warum müssen die zwei Sensoren auf separten Serials sein? Wir hatten auch mal Geräte gekauft, die nur einzeln am RS485 funktionierten. Wurde ein Slave auf anderer Adresse angesprochen, schmierten sie ab. Dafür wurde dann extra ein Umsetzer von Ethernet auf 16* RS485 angeschafft. Zum Warten auf einen Bugfix des Herstellers blieb keine Zeit mehr.
Peter D. schrieb: > Wir hatten auch mal Geräte gekauft, die nur einzeln am RS485 > funktionierten. Bei uns ist das ähnlich: Wir haben Geräte, die einzeln unter derselben Adresse ansprechbar sind. Werden die aber zu einem größeren System zusammengeschaltet, bekommt jedes Gerät seinen eigenen RS485-Bus. Die werden von einem Controller mit mehreren Schnittstellen zur Verfügung gestellt. Der Controller ist dann wiederum ein Slave, der seine Slave in einer eigenen Modbus-Struktur unterbringt. Dazu können noch beliebige Modbus-Slaves an jeder der Schnittstellen betrieben werden. Die brauchen halt einfach nur eindeutige Adressen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.