- Σειριακή επικοινωνία RS-485
- Σύνδεση RS-485 με Arduino
- Ενότητα μετατροπέα USB σε RS-485
- Απλά λογισμικό Modbus Master
- Απαιτούμενα εργαλεία
- Διάγραμμα κυκλώματος
- Προγραμματισμός Arduino UNO για RS-485 MODBUS Slave
- Δοκιμή του Arduino UNO ως Rs485 Modbus Slave
Το Modbus είναι ένα πρωτόκολλο σειριακής επικοινωνίας που ανακαλύφθηκε από τη Modicon το 1979 και χρησιμοποιείται για τη μετάδοση δεδομένων μέσω σειριακών γραμμών μεταξύ των βιομηχανικών ηλεκτρονικών συσκευών. Το RS-485 Modbus χρησιμοποιεί RS-485 για γραμμές μεταφοράς. Πρέπει να σημειωθεί ότι το Modbus είναι πρωτόκολλο λογισμικού και όχι πρωτόκολλο υλικού. Χωρίζεται σε δύο μέρη όπως το Modbus Master και το Modbus Slave. Στο δίκτυο RS-485 Modbus υπάρχει ένα Master και 127 Slave το καθένα με μοναδική διεύθυνση από 1 έως 127. Σε αυτό το έργο MAX485 Arduino, θα χρησιμοποιήσουμε το Arduino Uno ως Slave για σειριακή επικοινωνία.
Το Modbus χρησιμοποιείται ως επί το πλείστον σε PLC (Προγραμματιζόμενοι Λογικοί Ελεγκτές). Και εκτός από αυτό, το Modbus χρησιμοποιείται επίσης στην υγειονομική περίθαλψη, τη μεταφορά, τον οικιακό αυτοματισμό κ.λπ. Το Modbus έχει 255 κωδικούς λειτουργίας και υπάρχουν κυρίως τρεις δημοφιλείς εκδόσεις του Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Ποια είναι η διαφορά μεταξύ Modbus ASCII και Modbus RTU;
Τα Modbus RTU και Modbus ASCII μιλούν για το ίδιο πρωτόκολλο. Η μόνη διαφορά είναι ότι τα bytes που μεταδίδονται μέσω του σύρματος παρουσιάζονται ως δυαδικά με RTU και ως αναγνώσιμα ASCII με Modbus RTU. Το Modbus RTU θα χρησιμοποιηθεί σε αυτό το σεμινάριο.
Αυτό το σεμινάριο αφορά τη χρήση επικοινωνίας RS-485 Modbus με το Arduino UNO ως Slave. Εδώ εγκαθιστούμε το Simply Modbus Master Software στον υπολογιστή και ελέγχουμε δύο LED και Servo Motor χρησιμοποιώντας το RS-485 ως γραμμή μετάδοσης. Αυτά τα LED και ο σερβοκινητήρας συνδέονται με το Slave Arduino και ελέγχονται στέλνοντας τιμές χρησιμοποιώντας το λογισμικό Master Modbus. Δεδομένου ότι αυτό το σεμινάριο χρησιμοποιεί RS-485, συνιστάται πρώτα να περάσετε μέσω της σειριακής επικοινωνίας RS485 μεταξύ Arduino Uno και Arduino Nano. Το RS485 μπορεί επίσης να χρησιμοποιηθεί με άλλους ελεγκτές για σειριακή επικοινωνία:
- Σειριακή επικοινωνία RS-485 μεταξύ Raspberry Pi & Arduino UNO
- Σειριακή επικοινωνία μεταξύ STM32F103C8 και Arduino UNO χρησιμοποιώντας RS-485
Ας ξεκινήσουμε εξερευνώντας κάποιο υπόβαθρο σχετικά με τα RS-485 και Modbus. Μάθετε επίσης περισσότερα για διάφορα πρωτόκολλα σειριακής επικοινωνίας εδώ.
Σειριακή επικοινωνία RS-485
Το RS-485 είναι ένα ασύγχρονο πρωτόκολλο σειριακής επικοινωνίας που δεν απαιτεί ρολόι. Χρησιμοποιεί μια τεχνική που ονομάζεται διαφορικό σήμα για τη μεταφορά δυαδικών δεδομένων από τη μία συσκευή στην άλλη.
Ποια είναι λοιπόν αυτή η μέθοδος μεταφοράς διαφορικού σήματος;
Η μέθοδος διαφορικού σήματος λειτουργεί δημιουργώντας μια διαφορική τάση χρησιμοποιώντας ένα θετικό και αρνητικό 5V. Παρέχει επικοινωνία Half-Duplex κατά τη χρήση δύο καλωδίων και το Full-Duplex απαιτεί καλώδια 4 Fours.
Χρησιμοποιώντας αυτήν τη μέθοδο:
- Το RS-485 υποστηρίζει υψηλότερο ρυθμό μεταφοράς δεδομένων το πολύ 30Mbps.
- Παρέχει επίσης μέγιστη απόσταση μεταφοράς δεδομένων σε σύγκριση με το πρωτόκολλο RS-232. Μεταφέρει δεδομένα έως 1200 μέτρα το μέγιστο.
- Το κύριο πλεονέκτημα του RS-485 έναντι του RS-232 είναι ο πολλαπλός σκλάβος με μονό Master ενώ ο RS-232 υποστηρίζει μόνο έναν σκλάβος.
- Μπορεί να έχει έως και 32 συσκευές συνδεδεμένες στο πρωτόκολλο RS-485.
- Ένα άλλο πλεονέκτημα του RS-485 είναι άνοσο στον θόρυβο καθώς χρησιμοποιούν τη μέθοδο διαφορικού σήματος για μεταφορά.
- Το RS-485 είναι ταχύτερο σε σύγκριση με το πρωτόκολλο I2C.
Σύνδεση RS-485 με Arduino
Το RS-485 Module μπορεί να συνδεθεί με οποιονδήποτε μικροελεγκτή με σειριακή θύρα. Για τη χρήση της μονάδας RS-485 με μικροελεγκτές, απαιτείται μια μονάδα που ονομάζεται 5V MAX485 TTL έως RS485, η οποία βασίζεται στο Maxim MAX485 IC, καθώς επιτρέπει σειριακή επικοινωνία σε μεγάλη απόσταση 1200 μέτρων. Είναι αμφίδρομη και μισή αμφίδρομη και έχει ρυθμό μεταφοράς δεδομένων 2,5 Mbps. Αυτή η μονάδα απαιτεί τάση 5V.
Pin-Out του RS-485:
Όνομα καρφιτσώματος |
Περιγραφή καρφίτσας |
VCC |
5V |
ΕΝΑ |
Είσοδος δέκτη χωρίς αναστροφή Έξοδος μη αναστρέψιμου προγράμματος οδήγησης |
σι |
Αντιστροφή εισόδου δέκτη Αναστροφή εξόδου προγράμματος οδήγησης |
GND |
GND (0V) |
R0 |
Έξοδος δέκτη (ακίδα RX) |
ΣΧΕΤΙΚΑ ΜΕ |
Έξοδος δέκτη (LOW-Enable) |
DE |
Έξοδος προγράμματος οδήγησης (Υψηλή ενεργοποίηση) |
ΔΙ |
Είσοδος προγράμματος οδήγησης (ακροδέκτης TX) |
Ενότητα μετατροπέα USB σε RS-485
Πρόκειται για μια μονάδα προσαρμογέα μετατροπέα USB σε RS485 που υποστηρίζει WIN7, XP, Vista, Linux, Mac OS και παρέχει μια εύχρηστη διεπαφή RS485 μέσω της χρήσης θύρας COM στον υπολογιστή . Αυτή η ενότητα είναι συσκευή plug-and-play . Δεν υπάρχουν δομές εντολών, ό, τι αποστέλλεται στην εικονική θύρα COM μετατρέπεται αυτόματα σε RS485 και αντίστροφα. Η μονάδα τροφοδοτείται πλήρως από το δίαυλο USB. Έτσι, δεν χρειάζεται εξωτερική τροφοδοσία για λειτουργία.
Εμφανίζεται ως θύρα Serial / COM και είναι προσβάσιμο από εφαρμογές ή υπερ-τερματικά. Αυτός ο μετατροπέας παρέχει επικοινωνία με αμφίδρομη RS-485. Το εύρος ρυθμού Baud είναι 75 bps έως 115200 bps, μέγιστο έως 6 Mbps.
Για να χρησιμοποιήσετε αυτήν τη συσκευή υπάρχουν διάφορα Διαθέσιμα Λογισμικά Modbus στο Διαδίκτυο. Σε αυτό το σεμινάριο χρησιμοποιείται ένα λογισμικό που ονομάζεται Simply Modbus Software.
Απλά λογισμικό Modbus Master
Απαιτείται εφαρμογή Modbus Master Software για την αποστολή δεδομένων σε εξαρτημένη συσκευή Modbus RS-485 Arduino μέσω COM.
Το Simply Modbus Master είναι ένα λογισμικό δοκιμής επικοινωνίας δεδομένων. Μπορείτε να κατεβάσετε το Simply Modbus Master από τον δεδομένο σύνδεσμο και να μάθετε περισσότερα σχετικά με αυτό ανατρέχοντας στο Εγχειρίδιο λογισμικού.
Πριν χρησιμοποιήσετε το λογισμικό, είναι σημαντικό να εξοικειωθείτε με τις ακόλουθες ορολογίες.
Αναγνωριστικό σκλάβου:
Σε κάθε υποτελή σε ένα δίκτυο εκχωρείται μια μοναδική διεύθυνση μονάδας από 1 έως 127. Όταν ο κύριος ζητά δεδομένα, το πρώτο byte που στέλνει είναι η διεύθυνση Slave Με αυτόν τον τρόπο κάθε σκλάβος γνωρίζει μετά το πρώτο byte αν θα αγνοήσει ή όχι το μήνυμα.
Κωδικός λειτουργίας:
Το δεύτερο byte που αποστέλλεται από το Master είναι ο κωδικός Function. Αυτός ο αριθμός λέει στον σκλάβο σε ποιον πίνακα θα έχει πρόσβαση και αν θα διαβάσει ή θα γράψει στον πίνακα.
Υποστηριζόμενοι κωδικοί λειτουργιών μητρώου:
Κωδικός λειτουργίας |
Δράση |
Όνομα πίνακα |
04 (04 hex) |
Ανάγνωση |
Αναλογικοί καταχωρητές εισόδου |
03 (03 hex) |
Ανάγνωση |
Αναλογικοί καταχωρητές συγκράτησης εξόδου |
06 (06 hex) |
Γράψτε ένα |
Αναλογικός Μηχανισμός Παρακολούθησης Παραγωγής |
16 (10 hex) |
Γράψτε πολλά |
Αναλογικοί καταχωρητές συγκράτησης εξόδου |
Υποστηριζόμενοι κωδικοί λειτουργίας πηνίου:
Κωδικός λειτουργίας |
Δράση |
Όνομα πίνακα |
02 (02 εξάγωνο) |
Ανάγνωση |
Διακριτές επαφές εισαγωγής |
01 (01 hex) |
Ανάγνωση |
Διακριτά πηνία εξόδου |
05 (05 hex) |
Γράψτε ένα |
Διακριτό πηνίο εξόδου |
15 (εξάγωνο 0F) |
Γράψτε πολλά |
Διακριτά πηνία εξόδου |
CRC:
CRC σημαίνει Cyclic Redundancy check. Είναι δύο byte που προστίθενται στο τέλος κάθε μηνύματος Modbus για ανίχνευση σφαλμάτων.
Απαιτούμενα εργαλεία
Σκεύη, εξαρτήματα
- Arduino UNO
- Μονάδα μετατροπέα MAX-485 TTL σε RS-485
- Ενότητα μετατροπέα USB σε RS-485
- LED (2)
- 1k-Αντίσταση (2)
- Οθόνη LCD 16x2
- Ποτενσιόμετρο 10k
- Servo Motor SG-90
Λογισμικό
- Απλά Modbus Master
Διάγραμμα κυκλώματος
Σύνδεση κυκλώματος μεταξύ της μονάδας μετατροπέα MAX-485 TTL σε RS-485 και του Arduino UNO:
Arduino UNO |
Μονάδα μετατροπέα MAX-485 TTL σε RS-485 |
0 (RX) |
RO |
1 (TX) |
ΔΙ |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Σύνδεση κυκλώματος μεταξύ MAX-485 TTL σε RS-485 Module και USB σε RS-485 converter:
MAX-485 TTL έως RS-485 Μονάδα μετατροπέα |
Ενότητα USB σε RS-485 Συνδέθηκε με υπολογιστή |
ΕΝΑ |
ΕΝΑ |
σι |
σι |
Συνδέσεις κυκλώματος μεταξύ του Arduino UNO και της οθόνης LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Για τον έλεγχο του ποτενσιόμετρου για έλεγχο αντίθεσης / φωτεινότητας LCD 16x2 |
RS |
8 |
RW |
GND |
μι |
9 |
Δ4 |
10 |
Δ5 |
11 |
Δ6 |
12 |
Δ7 |
13 |
ΕΝΑ |
+ 5V |
κ |
GND |
Σύνδεση κυκλώματος μεταξύ 2 LED, Servo Motor και Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Βοηθητικό μοτέρ |
2 |
Ανώτατη αντίσταση 1k |
- |
- |
5 |
- |
Ανώτατη αντίσταση 1k |
- |
6 |
- |
- |
Καρφίτσα PWM (πορτοκαλί) |
+ 5V |
- |
- |
+ 5V (ΚΟΚΚΙΝΟ) |
GND |
Κάθοδος GND |
Κάθοδος GND |
GND (καφέ) |
Προγραμματισμός Arduino UNO για RS-485 MODBUS Slave
Το Arduino UNO έχει διαμορφωθεί ως Modbus Slave. Επίσης, το Arduino UNO είναι συνδεδεμένο με δύο LED και ένα Servo Motor. Έτσι, ο σκλάβος Arduino ελέγχεται από το λογισμικό Master Modbus. Η επικοινωνία μεταξύ του Arduino UNO και του Modbus Master Software επιτυγχάνεται χρησιμοποιώντας τη μονάδα RS-485. Για τη σύνδεσή του με υπολογιστή, χρησιμοποιείται η μονάδα μετατροπέα USB σε RS-485. Και το Arduino UNO με μονάδα μετατροπέα MAX-485 TTL σε RS-485, ολόκληρη η εγκατάσταση θα φαίνεται ως εξής:
Για χρήση του Modbus στο Arduino UNO, μια βιβλιοθήκη
Αρχικά, συμπεριλάβετε την απαιτούμενη βιβλιοθήκη. Η βιβλιοθήκη ModbusRTU προορίζεται για τη χρήση επικοινωνίας RS-485 Modbus και η βιβλιοθήκη υγρών κρυστάλλων προορίζεται για χρήση LCD με Arduino UNO και η σερβο βιβλιοθήκη προορίζεται για τη χρήση Servo motor με Arduino UNO.
#περιλαμβάνω
Τώρα οι ακίδες ανόδου LED που συνδέονται με τους ακροδέκτες Arduino 2 και 5 ορίζονται ως LED1 και LED2.
# καθορισμός led1 2 # καθορισμός led2 5
Στη συνέχεια, το αντικείμενο πρόσβασης στην κατηγορία Liquid Crystal δηλώνεται με τους ακροδέκτες LCD (RS, E, D4, D5, D6, D7) που συνδέονται με το Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Όταν ολοκληρωθεί η οθόνη LCD, αρχικοποιήστε το servo αντικείμενο για την κατηγορία Servo. Επίσης, αρχικοποιήστε το αντικείμενο διαύλου για την κλάση Modbus.
Σερβο σερβο; Λεωφορείο Modbus;
Στη συνέχεια για αποθήκευση τιμών για την επικοινωνία Modbus, ένας πίνακας δηλώνεται με τις τρεις τιμές να αρχικοποιούνται με μηδέν.
uint16_t modbus_array = {0,0,0};
Στη λειτουργία εγκατάστασης , πρώτα η οθόνη LCD έχει ρυθμιστεί σε λειτουργία 16x2 και εμφανίζεται ένα μήνυμα καλωσορίσματος και διαγράφεται.
lcd.begin (16,2); // Lcd σε λειτουργία 16x2 lcd.print ("RS-485 Modbus"); // Μήνυμα καλωσορίσματος lcd.setCursor (0,1); lcd.print ("Arduino Slave"); καθυστέρηση (5000) lcd.clear ();
Μετά από αυτό, οι ακίδες LED1 και LED2 ορίζονται ως ακίδες εξόδου.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Συνδέεται ο σερβο παλμός που είναι συνδεδεμένος με τον ακροδέκτη PWM 6 του Arduino.
servo.attach (6);
Τώρα για την επικοινωνία Modbus έχουν οριστεί οι ακόλουθες παράμετροι. Το πρώτο «1» αντιπροσωπεύει το Slave ID, το δεύτερο «1» δηλώνει ότι χρησιμοποιεί το RS-485 για τη μεταφορά δεδομένων και το «4» αντιπροσωπεύει το RS-485 DE&RE pin συνδεδεμένο με το Arduino UNO.
λεωφορείο = Modbus (1,1,4);
Το Modbus slave έχει οριστεί στο 9600 baudrate.
Ο βρόχος ξεκινά με τον ορισμό της δημοσκόπησης διαύλου και το bus.poll () χρησιμοποιείται για την εγγραφή και τη λήψη αξίας από τον κύριο Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Αυτή η μέθοδος χρησιμοποιείται για να ελέγξει εάν υπάρχουν διαθέσιμα δεδομένα στη σειριακή θύρα.
Εάν υπάρχουν διαθέσιμα δεδομένα στη σειριακή θύρα, η βιβλιοθήκη Modbus RTU θα ελέγξει το μήνυμα (ελέγξτε τη διεύθυνση της συσκευής, το μήκος δεδομένων και το CRC) και εκτελεί την απαιτούμενη ενέργεια.
Για παράδειγμα, για να γράψετε ή να διαβάσετε οποιαδήποτε τιμή από το κύριο, το ModbusRTU πρέπει να λάβει έναν ακέραιο πίνακα 16 bit χωρίς υπογραφή και το μήκος του από το Master Modbus. Αυτός ο πίνακας μεταφέρει τα δεδομένα που έχουν γραφτεί από τον κύριο.
Σε αυτό το σεμινάριο υπάρχουν τρεις συστοιχίες για LED1, LED2 και Servo motor angle.
Πρώτα για να ενεργοποιήσετε ή να απενεργοποιήσετε το LED1 modbus_array χρησιμοποιείται.
if (modbus_array == 0) // Εξαρτάται από την τιμή στο modubus_array που γράφτηκε από το Master Modbus { digitalWrite (led1, LOW); // LED OFF αν 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } αλλιώς { digitalWrite (led1, HIGH); // LED ON εάν η τιμή είναι διαφορετική από 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Δίπλα για να ενεργοποιήσετε ή να απενεργοποιήσετε το LED2 modbus_array χρησιμοποιείται.
if (modbus_array == 0) // Εξαρτάται από την τιμή στο modbus_array που γράφτηκε από το Master Modbus { digitalWrite (led2, LOW); // LED OFF εάν 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } αλλιώς { digitalWrite (led2, HIGH); // LED ON εάν η τιμή είναι διαφορετική από 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Δίπλα για να ορίσετε τη γωνία του σερβο κινητήρα, το modbus_array που χρησιμοποιείται και η τιμή εκτυπώνεται στην οθόνη LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo angle:"); lcd.print (pwm); καθυστέρηση (200) lcd.clear ();
Αυτό ολοκληρώνει τον προγραμματισμό του Arduino UNO για να το λειτουργήσει ως MODBUS Slave. Το επόμενο βήμα θα το δοκιμάσετε ως Modbus Slave.
Δοκιμή του Arduino UNO ως Rs485 Modbus Slave
Μετά την ολοκλήρωση των συνδέσεων κυκλώματος και την αποστολή του κωδικού στο Arduino UNO, ήρθε η ώρα να συνδέσετε τη μονάδα USB σε RS-485 με τον υπολογιστή όπου είναι εγκατεστημένο το λογισμικό Simple Modbus Master.
Ανοίξτε τη διαχείριση συσκευών και ελέγξτε τη θύρα COM σύμφωνα με τον υπολογιστή σας όπου είναι συνδεδεμένη η μονάδα USB σε RS-485 και μετά ανοίξτε το λογισμικό Simply Modbus Master 8.1.1.
1. Αφού ανοίξει το λογισμικό Simply Modbus , ανοίξτε τώρα την επιλογή Εγγραφή.
2. Αφού ανοίξει το Simply Modbus Master Write. Ορίστε τις παραμέτρους
Λειτουργία σε RTU, θύρα COM σύμφωνα με τον υπολογιστή σας (η δική μου ήταν COM6), Baud στα 9600, Data Bits 8, Stop bit 1, Parity None και Slave ID ως 1.
3. Μετά από αυτό ορίστε τον πρώτο καταχωρητή ως 40001 και οι τιμές για εγγραφή είναι 3 και ο κωδικός λειτουργίας ως 16 (Write Holding Register).
Μετά από αυτό γράψτε 1 έως 40001 (Για LED1 ενεργοποιημένο) και 1 έως 40002 (Για LED2 ενεργοποιημένο) και 90 έως 40003 (Για Σέρβο Motor Angle) και στη συνέχεια κάντε κλικ στο κουμπί ΑΠΟΣΤΟΛΗ.
Μπορείτε να δείτε ότι η κατάσταση LED είναι ενεργοποιημένη και η γωνία σερβο σε 90 μοίρες.
4. Μετά από αυτό εισαγάγετε 40001 ως 1 και 40002 ως 0 και 40003 ως 180 και κάντε κλικ στο κουμπί ΑΠΟΣΤΟΛΗ.
5. Τώρα γράφοντας 135 έως 40003 και 40001 ως 0 και 40002 ως 1.
Με αυτόν τον τρόπο το RS-485 Modbus μπορεί να χρησιμοποιηθεί σε σειριακή επικοινωνία με το Arduino UNO ως Slave. Στο επόμενο σεμινάριο θα χρησιμοποιήσουμε το Arduino Uno ως master στο MODBUS commination.
Βρείτε τον πλήρη κώδικα και ένα βίντεο επίδειξης παρακάτω.