- RS-485 seriel kommunikation
- Forbinder RS-485 med Arduino
- USB til RS-485 konverteringsmodul
- Simpelthen Modbus Master Software
- Nødvendige værktøjer
- Kredsløbsdiagram
- Programmering Arduino UNO til RS-485 MODBUS Slave
- Test af Arduino UNO som Rs485 Modbus Slave
Modbus er en seriel kommunikationsprotokol, som blev opdaget af Modicon i 1979, og den bruges til transmission af data over serielle linjer mellem de industrielle elektroniske enheder. RS-485 Modbus bruger RS-485 til transmissionslinjer. Det skal bemærkes, at Modbus er en softwareprotokol og ikke en hardwareprotokol. Det er opdelt i to dele som Modbus Master og Modbus Slave. I RS-485 Modbus-netværk er der en Master og 127 slaver hver med en unik adresse fra 1 til 127. I dette MAX485 Arduino- projekt bruger vi Arduino Uno som slave til seriel kommunikation.
Modbus bruges mest i PLC'er (programmerbare logiske controllere). Og bortset fra dette bruges Modbus også i Healthcare, Transportation, Home Automation osv. Modbus har 255 funktionskoder, og der er hovedsageligt tre populære versioner af Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Hvad er forskellen mellem Modbus ASCII og Modbus RTU?
Modbus RTU og Modbus ASCII taler den samme protokol. Den eneste forskel er, at de bytes, der transmitteres over ledningen, præsenteres som binære med RTU og som læsbar ASCII med Modbus RTU. Modbus RTU vil blive brugt i denne vejledning.
Denne tutorial handler om at bruge RS-485 Modbus kommunikation med Arduino UNO som slave. Her installerer vi Simply Modbus Master Software i pc og styrer to lysdioder og servomotor ved hjælp af RS-485 som transmissionslinje. Disse lysdioder og servomotor er forbundet med Slave Arduino og styres ved at sende værdier ved hjælp af Master Modbus Software. Da denne tutorial bruger RS-485, anbefales det at først gennemgå RS485 seriel kommunikation mellem Arduino Uno og Arduino Nano. RS485 kan også bruges med andre controllere til seriel kommunikation:
- RS-485 Seriel kommunikation mellem Raspberry Pi og Arduino UNO
- Seriel kommunikation mellem STM32F103C8 og Arduino UNO ved hjælp af RS-485
Lad os begynde med at udforske noget baggrund om RS-485 og Modbus. Lær også mere om forskellige serielle kommunikationsprotokoller her.
RS-485 seriel kommunikation
RS-485 er en asynkron seriel kommunikationsprotokol, som ikke kræver ur. Det bruger en teknik kaldet differentielt signal til at overføre binære data fra en enhed til en anden.
Så hvad er denne differentiale signaloverførselsmetode ??
Differentialsignalmetoden fungerer ved at skabe en differentieret spænding ved hjælp af en positiv og negativ 5V. Det giver en Half-Duplex- kommunikation, når du bruger to ledninger, og Full-Duplex kræver 4 fires ledninger.
Ved at bruge denne metode:
- RS-485 understøtter højere dataoverførselshastighed på maksimalt 30 Mbps.
- Det giver også maksimal dataoverførselsafstand sammenlignet med RS-232-protokollen. Den overfører data op til 1200 meter maksimalt.
- Den største fordel ved RS-485 i forhold til RS-232 er den multiple slave med single Master, mens RS-232 kun understøtter en enkelt slave.
- Kan maksimalt have 32 enheder tilsluttet til RS-485-protokollen.
- En anden fordel ved RS-485 er immun over for støj, da de bruger differentiel signalmetode til at overføre.
- RS-485 er hurtigere sammenlignet med I2C-protokollen.
Forbinder RS-485 med Arduino
RS-485-modulet kan tilsluttes enhver mikrocontroller, der har seriel port. Til brug af RS-485-modul med mikrokontrollere er der brug for et modul kaldet 5V MAX485 TTL til RS485, der er baseret på Maxim MAX485 IC, da det muliggør seriel kommunikation over lang afstand på 1200 meter. Det er tovejs og halv duplex og har dataoverførselshastighed på 2,5 Mbps. Dette modul kræver en spænding på 5V.
Pin-Out af RS-485:
Pin-navn |
Pin Beskrivelse |
VCC |
5V |
EN |
Ikke-inverterende modtagerindgang Ikke-inverterende driveroutput |
B |
Inverterende modtagerindgang Inverterende driveroutput |
GND |
GND (0V) |
R0 |
Modtagerudgang (RX-pin) |
RE |
Modtageroutput (LAV-aktiveret) |
DE |
Driveroutput (HIGH-Enable) |
DI |
Driverindgang (TX-pin) |
USB til RS-485 konverteringsmodul
Dette er et USB til RS485 Converter Adapter-modul, der understøtter WIN7, XP, Vista, Linux, Mac OS og giver en brugervenlig RS485-interface ved hjælp af COM-port i computeren . Dette modul er en plug-and-play-enhed . Der er ingen kommandostrukturer, uanset hvad der sendes til Virtual COM Port konverteres automatisk til RS485 og omvendt. Modulet er helt selvdrevet fra USB-bussen. Så der er ikke behov for ekstern strømforsyning til drift.
Det vises som en seriel / COM-port og er tilgængelig fra applikationer eller hyperterminal. Denne konverter giver halv-duplex RS-485-kommunikation. Baud-hastighedsområdet er 75 bps til 115200 bps, maksimalt op til 6 Mbps.
For at bruge denne enhed er der forskellige Modbus-software tilgængelige på internettet. I denne vejledning bruges en software kaldet Simply Modbus Software.
Simpelthen Modbus Master Software
Modbus Master-softwareapplikation er nødvendig for at sende data til slave Modbus RS-485 Arduino-enhed via COM.
Simpelthen Modbus Master er en datakommunikations testsoftware. Du kan downloade Simply Modbus Master fra det givne link og lære mere om det ved at henvise til softwaremanual.
Før du bruger softwaren, er det vigtigt at blive fortrolig med følgende terminologier.
Slave-ID:
Hver slave i et netværk tildeles en unik enhedsadresse fra 1 til 127. Når masteren anmoder om data, er den første byte, den sender, Slave-adressen. På denne måde ved hver slave efter den første byte, om meddelelsen skal ignoreres.
Funktionskode:
Den anden byte, der sendes af masteren, er funktionskoden. Dette tal fortæller slaven, hvilken tabel der skal åbnes, og om den skal læses fra eller skrive til tabellen.
Understøttede registerfunktionskoder:
Funktionskode |
Handling |
Tabelnavn |
04 (04 sekskant) |
Læs |
Analoge indgangsregistre |
03 (03 hex) |
Læs |
Analoge outputregistreringer |
06 (06 sekskant) |
Skriv enkelt |
Analog Output Holding Register |
16 (10 hex) |
Skriv flere |
Analoge outputregistreringer |
Understøttede spolefunktionskoder:
Funktionskode |
Handling |
Tabelnavn |
02 (02 sekskant) |
Læs |
Diskrete inputkontakter |
01 (01 hex) |
Læs |
Diskrete udgangsspoler |
05 (05 hex) |
Skriv enkelt |
Diskret udgangsspole |
15 (0F hex) |
Skriv flere |
Diskrete udgangsspoler |
CRC:
CRC står for Cyclic Redundancy check. Det er to bytes tilføjet i slutningen af hver Modbus-meddelelse til fejlregistrering.
Nødvendige værktøjer
Hardware
- Arduino UNO
- MAX-485 TTL til RS-485 konverteringsmodul
- USB til RS-485 konverteringsmodul
- LED (2)
- 1k-modstand (2)
- 16x2 LCD-skærm
- 10k Potentiometer
- Servomotor SG-90
Software
- Simpelthen Modbus Master
Kredsløbsdiagram
Kredsforbindelse mellem MAX-485 TTL til RS-485 konverteringsmodul og Arduino UNO:
Arduino UNO |
MAX-485 TTL til RS-485 konverteringsmodul |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Kredsforbindelse mellem MAX-485 TTL til RS-485-modul og USB til RS-485-konverter:
MAX-485 TTL til RS-485 Konvertermodul |
USB til RS-485-modul Forbundet med pc |
EN |
EN |
B |
B |
Kredsløbforbindelser mellem Arduino UNO og 16x2 LCD-skærm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Til styring af pin af potentiometer til kontrol af kontrast / lysstyrke på 16x2 LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
EN |
+ 5V |
K |
GND |
Kredsforbindelse mellem 2 lysdioder, servomotor og Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomotor |
2 |
Anode gennem 1k modstand |
- |
- |
5 |
- |
Anode gennem 1k modstand |
- |
6 |
- |
- |
PWM-pin (orange) |
+ 5V |
- |
- |
+ 5V (RØD) |
GND |
Katode GND |
Katode GND |
GND (brun) |
Programmering Arduino UNO til RS-485 MODBUS Slave
Arduino UNO er konfigureret som Modbus Slave. Også, er Arduino UNO fastgjort med to lysdioder og en servomotor. Så slaven Arduino styres fra Master Modbus-softwaren. Kommunikationen mellem Arduino UNO og Modbus Master Software opnås ved hjælp af RS-485-modulet. Til tilslutning af den til pc bruges USB til RS-485 konverteringsmodulet. Og Arduino UNO med MAX-485 TTL til RS-485 konverteringsmodul, hele opsætningen ser ud som følger:
Til brug af Modbus i Arduino UNO, et bibliotek
Inkluder oprindeligt det krævede bibliotek. ModbusRTU-biblioteket er til brug af RS-485 Modbus-kommunikation, og flydende krystalbiblioteket er til brug af LCD med Arduino UNO, og servobiblioteket er til brug af Servomotor med Arduino UNO.
#omfatte
Nu er LED-anodestifter, der er forbundet med Arduino-stifter 2 og 5, defineret som LED1 og LED2.
#definer led1 2 #definer led2 5
Derefter erklæres objektet for adgang til Liquid Crystal-klassen med LCD-benene (RS, E, D4, D5, D6, D7), der er forbundet med Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Når LCD er færdig, initialiser du servoobjekt til klasse Servo. Initialiser også busobjekt til klasse Modbus.
Servo servo; Modbus bus;
Dernæst til lagring af værdier til Modbus-kommunikation erklæres en matrix med de tre værdier initialiseret med nul.
uint16_t modbus_array = {0,0,0};
I opsætningsfunktionen indstilles LCD'et først i 16x2-tilstand, og en velkomstmeddelelse vises og ryddes.
lcd.begin (16,2); // LCD indstillet i 16x2 tilstand lcd.print ("RS-485 Modbus"); // Velkomstmeddelelse lcd.setCursor (0,1); lcd.print ("Arduino Slave"); forsinkelse (5000); lcd.clear ();
Herefter indstilles LED1- og LED2-stifter som outputstifter.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Servopulsstiften tilsluttet PWM-pin 6 i Arduino er tilsluttet.
servo. vedhæft (6);
Nu for Modbus-kommunikation er følgende parametre indstillet. Første '1' repræsenterer slave-ID, andet '1' repræsenterer, at den bruger RS-485 til at overføre data, og '4' repræsenterer RS-485 DE & RE-pin forbundet til Arduino UNO.
bus = Modbus (1,1,4);
Modbus-slave er indstillet til 9600 baudrate.
Sløjfen starter med definitionen af busundersøgelse og bus.poll () bruges til at skrive og modtage værdi fra master Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Denne metode bruges til at kontrollere, om der er data tilgængelige i den serielle port.
Hvis der er data tilgængelige i seriel port, vil Modbus RTU-biblioteket kontrollere meddelelsen (kontrollere enhedens adresse, datalængde og CRC) og udføre den nødvendige handling.
For eksempel for at skrive eller læse en værdi fra master skal ModbusRTU modtage et usigneret 16-bit heltal og dets længde fra Master Modbus. Denne matrix bærer de data, der er skrevet fra masteren.
I denne vejledning er der tre arrays for LED1, LED2 og Servomotorvinkel.
Først for at tænde eller slukke for bruges LED1 modbus_array.
hvis (modbus_array == 0) // Afhænger af værdien i modubus_array skrevet af Master Modbus { digitalWrite (led1, LOW); // LED OFF, hvis 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } andet { digitalWrite (led1, HIGH); // LED tændt, hvis en anden værdi end 0 lcd.setCursor (0,0) er; lcd.print ("L1: ON"); }
Dernæst bruges LED2 modbus_array til at tænde eller slukke.
hvis (modbus_array == 0) // Afhænger af værdien i modbus_array skrevet af Master Modbus { digitalWrite (led2, LOW); // LED OFF, hvis 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } andet { digitalWrite (led2, HIGH); // LED tændt, hvis en anden værdi end 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Ved siden af indstillingen af servomotorens vinkel udskrives den anvendte modbus_array og værdi i 16x2 LCD-displayet.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo vinkel:"); lcd.print (pwm); forsinkelse (200); lcd.clear ();
Dette afslutter programmeringen af Arduino UNO til at arbejde som MODBUS Slave. Det næste trin vil være at teste det som Modbus Slave.
Test af Arduino UNO som Rs485 Modbus Slave
Når kredsløbstilslutningerne er afsluttet, og koden er uploadet til Arduino UNO, er det tid til at forbinde USB til RS-485-modulet med pc'en, hvor Simple Modbus Master- softwaren er installeret.
Åbn enhedsadministratoren, og kontroller COM-porten i henhold til din pc, hvor USB til RS-485-modulet er tilsluttet, og åbn derefter Simply Modbus Master 8.1.1-softwaren.
1. Når Simply Modbus Software er åbnet, skal du åbne skrivemuligheden.
2. Efter Simply Modbus Master Write er åbnet. Indstil parametrene
Mode i RTU, COM-port i henhold til din pc (min var COM6), Baud ved 9600, Data Bits 8, Stop bit 1, Paritet Ingen og Slave ID som 1.
3. Derefter indstilles det første register som 40001 og værdierne til at skrive er 3 og funktionskoden som 16 (Write Holding Register).
Derefter skal du skrive 1 til 40001 (For LED1 tændt) og 1 til 40002 (For LED2 tændt) og 90 til 40003 (For servomotorvinkel) og derefter klikke på SEND-knappen.
Du kan se, at både LED-status er TIL og servovinkel ved 90 grader.
4. Indtast derefter 40001 som 1 og 40002 som 0 og 40003 som 180, og klik på knappen SEND.
5. Skriv nu 135 til 40003 og 40001 som 0 og 40002 som 1.
Sådan kan RS-485 Modbus bruges i seriel kommunikation med Arduino UNO som slave. I næste tutorial bruger vi Arduino Uno som master i MODBUS-commination.
Find den komplette kode og en demonstrationsvideo nedenfor.