Protokoll für RS485-Netzwerk?

Ich muss ein Sensornetzwerk aufbauen, das über einen einzigen RS485-Bus kommuniziert. Das Netzwerk könnte Dutzende von Knoten haben. Das Problem ist, dass ich den Zugriff auf den gemeinsam genutzten Bus kontrollieren und einen Weg finden muss, jeden Knoten zu adressieren, ähnlich wie bei TCP/IP. Jeder Sensor (wenn er ausgelöst wird) kann Daten asynchron an den Server senden.

Gibt es ein Protokoll für ein RS485-Netzwerk? Wenn ja, ist es kostenlos? Das Protokoll würde in einem Mikrocontroller implementiert werden.

Kann ich einen Controller mit TCP/IP-Stack verwenden?

Hat jemand ein solches Netzwerk entwickelt? Ich bin gespannt, ob mein Ansatz richtig ist, um zu wissen, ob es in Ordnung ist, diesen Weg fortzusetzen oder ob ich auf eine andere Technologie umsteigen muss.

Es werden viele Protokolle verwendet - schnappen Sie sich ein Handbuch für etwas, das RS845 in einer gemeinsam genutzten Umgebung spricht. Typischerweise sendet ein Master die Adresse dessen aus, mit dem er sprechen möchte, und nur dieser Knoten kann nur dann antworten. Aber ein Peer-to-Peer-Schema mit Kollisionserkennung und zufälligem Backoff könnte möglich sein.
TCP/IP steuert den gemeinsamen Buszugriff nicht; dies geschieht durch ein niedrigeres Protokoll.
@ChrisStratton In meinem Fall kommunizieren die Sensoren mit einem Server und jeder Sensor (wenn er ausgelöst wird) kann Daten asynchron an den Server senden.
Entscheiden Sie sich für Modbus. 1234567890
Die Kollisionserkennung kann bei RS485 schwierig (nicht unmöglich) sein, da weder High noch Low dominant sind und ein Gerät, das den Bus während der Übertragung überwacht, möglicherweise nur seine eigene Übertragung sieht, trotz einer Kollision mit einem Gerät in der Leitung. Vor ein oder wenigen Jahren gab es hier eine Antwort, die eine Modifikation für die Kollisionserkennung zeigte. Ich gebe einen Link weiter, wenn ich ihn finde. Ich habe Modbus verwendet und eine Abfrage basierend auf adressabhängigen Zeitschlitzen hinzugefügt, um Kollisionen zu vermeiden, während festgestellt wird, welche Slaves verbunden sind.
Diese Antwort von Dave Tweed könnte das sein, woran ich mich erinnerte: electronic.stackexchange.com/a/62380/25328 (ich habe das nicht versucht)
Sie können CAN als Alternative zu RS485 in Betracht ziehen: electronic.stackexchange.com/q/304546/25328
Viele frei verwendbare Protokolle sind unter en.wikibooks.org/wiki/Embedded_Systems/Common_Protocols aufgelistet ; Die meisten von ihnen würden auf physischer RS485-Verbindungshardware funktionieren.

Antworten (1)

Ich habe eine Demo zur Übertragung von TCP/IP über RS485 erstellt: https://github.com/dukelec/cdbus_doc

Das Protokoll auf RS485 ist CDBUS, das einen eigenständigen Controller verwenden könnte, um das Kollisionsproblem zu lösen, Sie können das CDBUS-Protokoll auch per Software implementieren oder sich einfach nicht um Kollisionen kümmern, Pakete erneut senden, wenn Datenverlust erkannt wurde.
Das CDBUS-Protokoll: https://github.com/dukelec/cdbus_ip

Das folgende Protokoll ist CDNET, es ähnelt dem UDP-Protokoll, Sie können UDP-Pakete von der MCU mit nur wenigen Codezeilen und ohne Bibliothek senden, benötigen jedoch ein Gateway, um CDNET in ein echtes TCP/IP-Protokoll zu übersetzen. Oder Sie können Ihr eigenes Protokoll definieren und es auf dem Gateway übersetzen.