- RS-485 Serielle Kommunikation
- RS-485 mit Arduino verbinden
- USB-zu-RS-485-Konvertermodul
- Einfach Modbus Master Software
- Werkzeuge benötigt
- Schaltplan
- Programmierung von Arduino UNO für RS-485 MODBUS Slave
- Testen des Arduino UNO als Rs485 Modbus Slave
Modbus ist ein serielles Kommunikationsprotokoll, das 1979 von Modicon entdeckt wurde und zur Übertragung von Daten über serielle Leitungen zwischen industriellen elektronischen Geräten verwendet wird. RS-485 Modbus verwendet RS-485 für Übertragungsleitungen. Es ist zu beachten, dass Modbus ein Softwareprotokoll und kein Hardwareprotokoll ist. Es ist in zwei Teile unterteilt, z. B. Modbus Master und Modbus Slave. Im RS-485-Modbus-Netzwerk gibt es einen Master und 127 Slaves mit jeweils einer eindeutigen Adresse von 1 bis 127. In diesem MAX485-Arduino- Projekt verwenden wir Arduino Uno als Slave für die serielle Kommunikation.
Modbus werden hauptsächlich in SPS (speicherprogrammierbaren Steuerungen) verwendet. Abgesehen davon wird der Modbus auch in den Bereichen Gesundheitswesen, Transportwesen, Hausautomation usw. verwendet. Modbus verfügt über 255 Funktionscodes und es gibt hauptsächlich drei beliebte Versionen von Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Was ist der Unterschied zwischen Modbus ASCII und Modbus RTU?
Modbus RTU und Modbus ASCII sprechen dasselbe Protokoll. Der einzige Unterschied besteht darin, dass die über die Leitung übertragenen Bytes mit RTU als binär und mit Modbus RTU als lesbares ASCII dargestellt werden. In diesem Tutorial wird Modbus RTU verwendet.
In diesem Tutorial geht es um die Verwendung der RS-485-Modbus-Kommunikation mit Arduino UNO als Slave. Hier installieren wir die Simply Modbus Master Software im PC und steuern zwei LEDs und den Servomotor mithilfe von RS-485 als Übertragungsleitung. Diese LEDs und der Servomotor sind mit Slave Arduino verbunden und werden durch Senden von Werten mit der Master Modbus Software gesteuert. Da in diesem Lernprogramm RS-485 verwendet wird, wird empfohlen, zuerst die serielle RS485-Kommunikation zwischen Arduino Uno und Arduino Nano zu durchlaufen. RS485 kann auch mit anderen Controllern für die serielle Kommunikation verwendet werden:
- RS-485 Serielle Kommunikation zwischen Raspberry Pi & Arduino UNO
- Serielle Kommunikation zwischen STM32F103C8 und Arduino UNO über RS-485
Lassen Sie uns zunächst einige Hintergrundinformationen zu RS-485 und Modbus untersuchen. Erfahren Sie hier auch mehr über verschiedene serielle Kommunikationsprotokolle.
RS-485 Serielle Kommunikation
RS-485 ist ein asynchrones serielles Kommunikationsprotokoll, für das keine Uhr erforderlich ist. Es verwendet eine als Differenzsignal bezeichnete Technik, um Binärdaten von einem Gerät zu einem anderen zu übertragen.
Was ist diese differenzielle Signalübertragungsmethode?
Die Differenzsignalmethode erzeugt eine Differenzspannung unter Verwendung einer positiven und einer negativen 5V. Es bietet eine Halbduplex- Kommunikation, wenn zwei Drähte verwendet werden, und Vollduplex erfordert 4 Vierer- Drähte.
Mit dieser Methode:
- RS-485 unterstützt eine höhere Datenübertragungsrate von maximal 30 Mbit / s.
- Es bietet auch eine maximale Datenübertragungsentfernung im Vergleich zum RS-232-Protokoll. Es überträgt Daten bis zu einem Maximum von 1200 Metern.
- Der Hauptvorteil von RS-485 gegenüber RS-232 ist der Mehrfach-Slave mit einem einzigen Master, während RS-232 nur einen einzigen Slave unterstützt.
- Maximal 32 Geräte können an das RS-485-Protokoll angeschlossen werden.
- Ein weiterer Vorteil des RS-485 ist unempfindlich gegen Rauschen, da bei der Übertragung die Differenzsignalmethode verwendet wird.
- RS-485 ist schneller als das I2C-Protokoll.
RS-485 mit Arduino verbinden
Das RS-485-Modul kann an jeden Mikrocontroller mit serieller Schnittstelle angeschlossen werden. Für die Verwendung des RS-485-Moduls mit Mikrocontrollern wird ein Modul namens 5V MAX485 TTL bis RS485 benötigt, das auf dem Maxim MAX485 IC basiert, da es eine serielle Kommunikation über eine Entfernung von 1200 Metern ermöglicht. Es ist bidirektional und halbduplex und hat eine Datenübertragungsrate von 2,5 Mbit / s. Dieses Modul benötigt eine Spannung von 5V.
Pinbelegung von RS-485:
Pin Name |
Pin Beschreibung |
VCC |
5V |
EIN |
Nicht invertierender Empfängereingang Nicht invertierender Treiberausgang |
B. |
Invertieren des Empfängereingangs Treiberausgang invertieren |
GND |
GND (0 V) |
R0 |
Empfängerausgang (RX-Pin) |
RE |
Empfängerausgang (LOW-Enable) |
DE |
Treiberausgabe (HIGH-Enable) |
DI |
Treibereingang (TX-Pin) |
USB-zu-RS-485-Konvertermodul
Dies ist ein USB-zu-RS485-Konverter-Adaptermodul, das WIN7, XP, Vista, Linux, Mac OS unterstützt und eine benutzerfreundliche RS485-Schnittstelle über den COM-Anschluss des Computers bietet . Dieses Modul ist ein Plug-and-Play-Gerät . Es gibt keine Befehlsstrukturen. Was auch immer an den virtuellen COM-Port gesendet wird, wird automatisch in RS485 konvertiert und umgekehrt. Das Modul wird vollständig über den USB-Bus mit Strom versorgt. Für den Betrieb ist keine externe Stromversorgung erforderlich.
Es wird als serieller / COM-Anschluss angezeigt und ist über Anwendungen oder Hyperterminals zugänglich. Dieser Konverter bietet Halbduplex-RS-485-Kommunikation. Der Baudratenbereich liegt zwischen 75 und 115200 Bit / s, maximal bis zu 6 Mbit / s.
Zur Verwendung dieses Geräts stehen im Internet verschiedene Modbus-Software zur Verfügung. In diesem Tutorial wird eine Software namens Simply Modbus Software verwendet.
Einfach Modbus Master Software
Die Modbus Master Software-Anwendung wird benötigt, um Daten über COM an das Slave Modbus RS-485 Arduino-Gerät zu senden.
Simply Modbus Master ist eine Datenkommunikations-Testsoftware. Sie können den Simply Modbus Master über den angegebenen Link herunterladen und im Software-Handbuch mehr darüber erfahren.
Bevor Sie die Software verwenden, ist es wichtig, sich mit den folgenden Terminologien vertraut zu machen.
Slave ID:
Jedem Slave in einem Netzwerk wird eine eindeutige Einheitsadresse von 1 bis 127 zugewiesen. Wenn der Master Daten anfordert, ist das erste Byte, das er sendet, die Slave-Adresse. Auf diese Weise weiß jeder Slave nach dem ersten Byte, ob die Nachricht ignoriert werden soll oder nicht.
Funktionscode:
Das zweite vom Master gesendete Byte ist der Funktionscode. Diese Nummer teilt dem Slave mit, auf welche Tabelle zugegriffen werden soll und ob aus der Tabelle gelesen oder in diese geschrieben werden soll.
Unterstützte Register-Funktionscodes:
Funktionscode |
Aktion |
Tabellenname |
04 (04 hex) |
Lesen |
Analoge Eingangsregister |
03 (03 hex) |
Lesen |
Halteregister für Analogausgänge |
06 (06 hex) |
Single schreiben |
Halteregister für Analogausgang |
16 (10 hex) |
Schreibe mehrere |
Halteregister für Analogausgänge |
Unterstützte Spulenfunktionscodes:
Funktionscode |
Aktion |
Tabellenname |
02 (02 hex) |
Lesen |
Diskrete Eingangskontakte |
01 (01 hex) |
Lesen |
Diskrete Ausgangsspulen |
05 (05 hex) |
Single schreiben |
Diskrete Ausgangsspule |
15 (0F hex) |
Schreibe mehrere |
Diskrete Ausgangsspulen |
CRC:
CRC steht für Cyclic Redundancy Check. Es werden zwei Bytes am Ende jeder Modbus-Nachricht zur Fehlererkennung hinzugefügt.
Werkzeuge benötigt
Hardware
- Arduino UNO
- MAX-485 TTL zu RS-485 Konvertermodul
- USB-zu-RS-485-Konvertermodul
- LED (2)
- 1k-Widerstand (2)
- 16x2 LCD-Anzeige
- 10k Potentiometer
- Servomotor SG-90
Software
- Einfach Modbus Master
Schaltplan
Schaltungsverbindung zwischen MAX-485 TTL zu RS-485 Konvertermodul und Arduino UNO:
Arduino UNO |
MAX-485 TTL zu RS-485 Konvertermodul |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Schaltungsverbindung zwischen MAX-485 TTL zu RS-485 Modul und USB zu RS-485 Konverter:
MAX-485 TTL bis RS-485 Konvertermodul |
USB zu RS-485 Modul Verbunden mit dem PC |
EIN |
EIN |
B. |
B. |
Schaltungsverbindungen zwischen Arduino UNO und 16x2 LCD-Display:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Zur Steuerung des Pin des Potentiometers zur Kontrast- / Helligkeitsregelung des 16x2-LCD |
RS |
8 |
RW |
GND |
E. |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
EIN |
+ 5V |
K. |
GND |
Schaltungsverbindung zwischen 2 LEDs, Servomotor und Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomotor |
2 |
Anode durch 1k Widerstand |
- - |
- - |
5 |
- - |
Anode durch 1k Widerstand |
- - |
6 |
- - |
- - |
PWM-Pin (orange) |
+ 5V |
- - |
- - |
+ 5V (ROT) |
GND |
Kathode GND |
Kathode GND |
GND (braun) |
Programmierung von Arduino UNO für RS-485 MODBUS Slave
Das Arduino UNO ist als Modbus-Slave konfiguriert. Außerdem ist Arduino UNO mit zwei LEDs und einem Servomotor ausgestattet. Der Slave Arduino wird also über die Master Modbus Software gesteuert. Die Kommunikation zwischen dem Arduino UNO und der Modbus Master Software erfolgt über das RS-485-Modul. Für die Verbindung mit dem PC wird das USB-zu-RS-485-Konvertermodul verwendet. Und das Arduino UNO mit MAX-485 TTL zu RS-485 Konverter Modul, das gesamte Setup wird wie folgt aussehen:
Für die Verwendung von Modbus in Arduino UNO, einer Bibliothek
Fügen Sie zunächst die erforderliche Bibliothek hinzu. Die ModbusRTU-Bibliothek dient zur Verwendung der RS-485-Modbus-Kommunikation, die Flüssigkristallbibliothek zur Verwendung von LCD mit Arduino UNO und die Servobibliothek zur Verwendung eines Servomotors mit Arduino UNO.
#einschließen
Jetzt sind die LED-Anodenstifte, die mit den Arduino-Stiften 2 und 5 verbunden sind, als LED1 und LED2 definiert.
#define led1 2 #define led2 5
Als nächstes wird das Objekt für den Zugriff auf die Flüssigkristallklasse mit den LCD-Pins (RS, E, D4, D5, D6, D7) deklariert, die mit Arduino UNO verbunden sind.
LiquidCrystal lcd (8,9,10,11,12,13);
Wenn das LCD fertig ist, initialisieren Sie das Servoobjekt für die Klasse Servo. Initialisieren Sie auch das Busobjekt für die Klasse Modbus.
Servo Servo; Modbus-Bus;
Als nächstes wird zum Speichern von Werten für die Modbus-Kommunikation ein Array mit den drei mit Null initialisierten Werten deklariert.
uint16_t modbus_array = {0,0,0};
In der Setup- Funktion wird zunächst das LCD in den 16x2-Modus versetzt und eine Begrüßungsnachricht angezeigt und gelöscht.
lcd.begin (16,2); // Lcd im 16x2-Modus eingestellt lcd.print ("RS-485 Modbus"); // Begrüßungsnachricht lcd.setCursor (0,1); lcd.print ("Arduino Slave"); Verzögerung (5000); lcd.clear ();
Danach werden die LED1- und LED2-Pins als Ausgangspins gesetzt.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Der mit dem PWM-Pin 6 von Arduino verbundene Servopuls-Pin ist angeschlossen.
servo.attach (6);
Für die Modbus-Kommunikation werden nun folgende Parameter eingestellt. Die erste '1' steht für die Slave-ID, die zweite '1' für die Datenübertragung mit RS-485 und die '4' für den mit Arduino UNO verbundenen DE-RE-Pin RS-485.
Bus = Modbus (1,1,4);
Der Modbus-Slave ist auf 9600 Baudrate eingestellt.
Die Schleife beginnt mit der Definition von Bus Poll und bus.poll () wird verwendet, um Werte vom Master-Modbus zu schreiben und zu empfangen.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Mit dieser Methode wird überprüft, ob an der seriellen Schnittstelle Daten verfügbar sind.
Wenn an der seriellen Schnittstelle Daten verfügbar sind, überprüft die Modbus RTU-Bibliothek die Nachricht (Geräteadresse, Datenlänge und CRC überprüfen) und führt die erforderliche Aktion aus.
Um beispielsweise einen Wert vom Master zu schreiben oder zu lesen, muss die ModbusRTU ein vorzeichenloses 16-Bit-Integer-Array und dessen Länge vom Master-Modbus empfangen. Dieses Array enthält die Daten, die vom Master geschrieben wurden.
In diesem Tutorial gibt es drei Arrays für LED1, LED2 und Servomotorwinkel.
Zum Ein- und Ausschalten wird zuerst die LED1 modbus_array verwendet.
if (modbus_array == 0) // Hängt vom Wert in modubus_array ab, der von Master Modbus geschrieben wurde { digitalWrite (led1, LOW); // LED AUS wenn 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED EIN, wenn anderer Wert als 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }}
Als nächstes wird zum Ein- oder Ausschalten der LED2 modbus_array verwendet.
if (modbus_array == 0) // Hängt vom Wert in modbus_array ab, der von Master Modbus geschrieben wurde { digitalWrite (led2, LOW); // LED AUS wenn 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED EIN, wenn anderer Wert als 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }}
Als nächstes wird zum Einstellen des Winkels des Servomotors das verwendete modbus_array und der Wert auf dem 16x2-LCD-Display gedruckt.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servowinkel:"); lcd.print (pwm); Verzögerung (200); lcd.clear ();
Damit ist die Programmierung von Arduino UNO für die Arbeit als MODBUS-Slave abgeschlossen. Der nächste Schritt wird das Testen als Modbus-Slave sein.
Testen des Arduino UNO als Rs485 Modbus Slave
Nachdem die Schaltungsverbindungen hergestellt und der Code auf das Arduino UNO hochgeladen wurde, ist es an der Zeit, das USB-RS-485-Modul mit dem PC zu verbinden, auf dem die Simple Modbus Master- Software installiert ist.
Öffnen Sie den Geräte-Manager und überprüfen Sie den COM-Anschluss Ihres PCs, an dem das USB-zu-RS-485-Modul angeschlossen ist. Öffnen Sie anschließend die Software Simply Modbus Master 8.1.1.
1. Nachdem die Simply Modbus Software geöffnet wurde, öffnen Sie die Option Schreiben.
2. Nachdem der Simply Modbus Master Write geöffnet wurde. Stellen Sie die Parameter ein
Modus in RTU, COM-Port entsprechend Ihrem PC (meiner war COM6), Baud bei 9600, Datenbits 8, Stoppbit 1, Parität keine und Slave-ID als 1.
3. Danach setzen Sie das erste Register auf 40001 und die zu schreibenden Werte sind 3 und der Funktionscode auf 16 (Write Holding Register).
Danach schreiben Sie 1 bis 40001 (für LED1 an) und 1 bis 40002 (für LED2 an) und 90 bis 40003 (für Servomotorwinkel) und klicken dann auf die Schaltfläche SENDEN.
Sie können sehen, dass sowohl der LED-Status EIN als auch der Servowinkel bei 90 Grad liegt.
4. Geben Sie danach 40001 als 1 und 40002 als 0 und 40003 als 180 ein und klicken Sie auf die Schaltfläche SENDEN.
5. Schreiben Sie nun 135 bis 40003 und 40001 als 0 und 40002 als 1.
So kann RS-485 Modbus in der seriellen Kommunikation mit Arduino UNO als Slave verwendet werden. Im nächsten Tutorial werden wir das Arduino Uno als Master in der MODBUS-Kommunikation verwenden.
Unten finden Sie den vollständigen Code und ein Demonstrationsvideo.