Forum: Mikrocontroller und Digitale Elektronik Arduino Mega Modbus Master & Slave gleichzeitig mit verschiedenen Schnittstellen möglich?


von Alexander S. (docalex)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die fertigen Objekte heißen
Serial
Serial1
Serial2
Serial3

von PittyJ (Gast)


Lesenswert?

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.
von Veit D. (devil-elec)


Lesenswert?

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.

von Klaus H. (nikolaus10)


Lesenswert?

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

von Alexander S. (docalex)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

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
von STK500-Besitzer (Gast)


Lesenswert?

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

von tom (Gast)


Lesenswert?

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

von noiasca (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.