- Zaporedna komunikacija RS-485
- Povezava RS-485 z Arduinom
- Pretvorniški modul USB v RS-485
- Preprosto Modbus Master Software
- Potrebna orodja
- Shema vezja
- Programiranje Arduino UNO za podrejeno RS-485 MODBUS
- Testiranje Arduino UNO kot Rs485 Modbus Slave
Modbus je protokol serijske komunikacije, ki ga je Modicon odkril leta 1979 in se uporablja za prenos podatkov po serijskih linijah med industrijskimi elektronskimi napravami. RS-485 Modbus uporablja RS-485 za daljnovode. Treba je opozoriti, da je Modbus protokol programske opreme in ne strojni protokol. Razdeljen je na dva dela, kot sta Modbus Master in Modbus Slave. V omrežju RS-485 Modbus je en glavni in 127 podrejenih, vsak z edinstvenim naslovom od 1 do 127. V tem projektu MAX485 Arduino bomo Arduino Uno uporabili kot podrejenega za serijsko komunikacijo.
Modbus se večinoma uporablja v PLC-jih (Programabilni logični krmilniki). Poleg tega se Modbus uporablja tudi v zdravstvu, transportu, avtomatizaciji itd. Modbus ima 255 funkcijskih kod in obstajajo predvsem tri priljubljene različice Modbusa:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Kakšna je razlika med Modbus ASCII in Modbus RTU?
Modbus RTU in Modbus ASCII govorita isti protokol. Edina razlika je v tem, da so bajti, ki se prenašajo po žici, predstavljeni kot binarni z RTU in kot berljivi ASCII z Modbus RTU. V tej vadnici bo uporabljen Modbus RTU.
Ta vadnica govori o uporabi RS-485 Modbus komunikacije z Arduino UNO kot suženj. Tu namestimo programsko opremo Simply Modbus Master v računalnik in nadzorujemo dve LED in servo motor z uporabo RS-485 kot daljnovoda. Te LED in servo motorji so povezani s podrejenim Arduino in jih nadzira s pošiljanjem vrednosti s pomočjo programske opreme Master Modbus. Ker ta vadnica uporablja RS-485, je priporočljivo najprej uporabiti serijsko komunikacijo RS485 med Arduino Uno in Arduino Nano. RS485 se lahko uporablja tudi z drugimi krmilniki za serijsko komunikacijo:
- Zaporedna komunikacija RS-485 med Raspberry Pi in Arduino UNO
- Zaporedna komunikacija med STM32F103C8 in Arduino UNO z uporabo RS-485
Začnimo z raziskovanjem ozadja o RS-485 in Modbusu. Tukaj izveste tudi več o različnih protokolih serijske komunikacije.
Zaporedna komunikacija RS-485
RS-485 je asinhroni serijski komunikacijski protokol, ki ne zahteva ure. Uporablja tehniko, imenovano diferencialni signal, za prenos binarnih podatkov iz ene naprave v drugo.
Torej, kaj je ta diferencialna metoda prenosa signala ??
Metoda diferencialnega signala deluje tako, da ustvari diferenčno napetost z uporabo pozitivnih in negativnih 5V. Zagotavlja Half-Duplex komunikacije ob uporabi dveh žic in Full-Duplex zahteva 4 štiri žice.
S to metodo:
- RS-485 podpira višjo hitrost prenosa podatkov do največ 30 Mb / s.
- Zagotavlja tudi največjo razdaljo prenosa podatkov v primerjavi s protokolom RS-232. Prenaša podatke do največ 1200 metrov.
- Glavna prednost RS-485 pred RS-232 je več pomožnih enot z enim samim glavnim, medtem ko RS-232 podpira samo enega pomožnika.
- Lahko ima največ 32 naprav, povezanih s protokolom RS-485.
- Druga prednost RS-485 je odpornost na hrup, saj za prenos uporabljajo metodo diferencialnega signala.
- RS-485 je hitrejši od protokola I2C.
Povezava RS-485 z Arduinom
Modul RS-485 je mogoče priključiti na kateri koli mikrokrmilnik, ki ima serijska vrata. Za uporabo modula RS-485 z mikrokrmilniki je potreben modul, imenovan 5V MAX485 TTL do RS485, ki temelji na Maxim MAX485 IC, saj omogoča serijsko komunikacijo na dolgi razdalji 1200 metrov. Je dvosmerna in pol dupleksna, s hitrostjo prenosa podatkov 2,5 Mbps. Ta modul zahteva napetost 5V.
Pin-out RS-485:
Pripnite ime |
Opis pin |
VCC |
5V |
A |
Neinvertirajoči vhod sprejemnika Izhod gonilnika, ki se ne spreminja |
B |
Spreminjanje vhoda sprejemnika Pretvarjanje izhodnih podatkov gonilnika |
GND |
GND (0 V) |
R0 |
Izhod sprejemnika (RX pin) |
RE |
Izhod sprejemnika (LOW-Enable) |
DE |
Izhod gonilnika (HIGH-Enable) |
DI |
Vhod za gonilnik (TX pin) |
Pretvorniški modul USB v RS-485
To je modul pretvornika USB v RS485, ki podpira WIN7, XP, Vista, Linux, Mac OS in nudi enostaven za uporabo vmesnik RS485 z uporabo vrat COM v računalniku . Ta modul je naprava plug-and-play . Ni ukaznih struktur, karkoli je poslano v navidezna vrata COM, se samodejno pretvori v RS485 in obratno. Modul se popolnoma napaja iz vodila USB. Torej, zunanje napajanje ni potrebno za delovanje.
Prikaže se kot serijska / COM vrata in je dostopen iz aplikacij ali hiper-terminala. Ta pretvornik zagotavlja poldupleksno komunikacijo RS-485. Razpon hitrosti prenosa je od 75 bps do 115200 bps, največ do 6 Mbps.
Za uporabo te naprave je v internetu na voljo različna programska oprema Modbus. V tej vadnici je uporabljena programska oprema Simply Modbus Software.
Preprosto Modbus Master Software
Programska aplikacija Modbus Master je potrebna za pošiljanje podatkov v podrejeno napravo Modbus RS-485 Arduino prek COM.
Preprosto Modbus Master je testna programska oprema za podatkovno komunikacijo. Simply Modbus Master lahko prenesete z dane povezave in izveste več o njem v navodilih za uporabo programske opreme.
Pred uporabo programske opreme se je treba seznaniti z naslednjo terminologijo.
ID sužnja:
Vsakemu pomožnemu omrežju je dodeljen unikatni naslov enote od 1 do 127. Ko poveljnik zahteva podatke, je prvi bajt, ki ga pošlje, podrejeni naslov. Tako vsak suženj že po prvem bajtu ve, ali bo sporočilo prezrl ali ne.
Funkcijska koda:
Drugi bajt, ki ga pošlje poveljnik, je koda funkcije. Ta številka pove pomožniku, do katere tabele naj dostopa in ali naj bere iz nje ali piše v tabelo.
Podprte kode funkcij registra:
Koda funkcije |
Ukrepanje |
Ime tabele |
04 (04 šestnajstiška) |
Preberite |
Registri analognih vhodov |
03 (03 šestnajstiška) |
Preberite |
Registri za zadrževanje analognih izhodov |
06 (06 šestnajstiška) |
Pišite samsko |
Register hrambe analognih izhodov |
16 (10 šestnajstiških) |
Napišite več |
Registri za zadrževanje analognih izhodov |
Podprte kode funkcij tuljave:
Koda funkcije |
Ukrepanje |
Ime tabele |
02 (02 šestnajstiška) |
Preberite |
Diskretni vhodni kontakti |
01 (01 šestnajstiška) |
Preberite |
Diskretne izhodne tuljave |
05 (05 šestnajstiška) |
Pišite samsko |
Diskretna izhodna tuljava |
15 (0F šestnajstiška) |
Napišite več |
Diskretne izhodne tuljave |
CRC:
CRC je kratica za preverjanje ciklične odvečnosti. Gre za dva bajta, dodana na konec vsakega sporočila Modbus za odkrivanje napak.
Potrebna orodja
Strojna oprema
- Arduino UNO
- Pretvorniški modul MAX-485 TTL v RS-485
- Pretvorniški modul USB v RS-485
- LED (2)
- 1k upor (2)
- LCD zaslon 16x2
- 10k potenciometer
- Servo motor SG-90
Programska oprema
- Preprosto Modbus Master
Shema vezja
Povezava vezja med pretvorniškim modulom MAX-485 TTL v RS-485 in Arduino UNO:
Arduino UNO |
Pretvorniški modul MAX-485 TTL v RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4. |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Povezava vezja med modulom MAX-485 TTL na RS-485 in pretvornikom USB v RS-485:
MAX-485 TTL do RS-485 Pretvorniški modul |
Modul USB na RS-485 Povezano z osebnim računalnikom |
A |
A |
B |
B |
Vezja med Arduino UNO in 16x2 LCD zaslonom:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Za nadzor zatiča potenciometra za nadzor kontrasta / svetlosti LCD 16x2 |
RS |
8. |
RW |
GND |
E |
9. |
D4 |
10. |
D5 |
11. |
D6 |
12. |
D7 |
13. |
A |
+ 5V |
K |
GND |
Povezava vezja med 2 LED, servo motorjem in Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servo motor |
2. |
Anoda skozi upor 1k |
- |
- |
5. |
- |
Anoda skozi upor 1k |
- |
6. |
- |
- |
PWM zatič (oranžna) |
+ 5V |
- |
- |
+ 5V (RDEČA) |
GND |
Katoda GND |
Katoda GND |
GND (rjava) |
Programiranje Arduino UNO za podrejeno RS-485 MODBUS
Arduino UNO je konfiguriran kot Modbus Slave. Prav tako je Arduino UNO pritrjen z dvema LED in enim servo motorjem. Torej podrejeni Arduino nadzoruje glavna programska oprema Modbus. Komunikacija med Arduino UNO in programsko opremo Modbus Master se izvaja z uporabo modula RS-485. Za povezavo z osebnim računalnikom se uporablja pretvorniški modul USB v RS-485. In pretvorniški modul Arduino UNO s pretvorniškim modulom MAX-485 TTL v RS-485 bo celotna nastavitev izgledala takole:
Za uporabo Modbusa v knjižnici Arduino UNO
Sprva vključite zahtevano knjižnico. Knjižnica ModbusRTU je za uporabo RS-485 Modbus komunikacije, knjižnica s tekočimi kristali pa za uporabo LCD-ja z Arduino UNO, servo knjižnica pa za uporabo servo motorja z Arduino UNO.
#include
Zdaj so anodni zatiči LED, ki so povezani z Arduino zatiči 2 in 5, definirani kot LED1 in LED2.
#define led1 2 #define led2 5
Nato je predmet za dostop do razreda Liquid Crystal prijavljen z zatiči LCD (RS, E, D4, D5, D6, D7), ki so povezani z Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Ko je LCD končan, inicializirajte objekt servo za razred Servo. Inicializirajte tudi objekt vodila za razred Modbus.
Servo servo; Modbus vodilo;
Naslednje za shranjevanje vrednosti za komunikacijo Modbus je deklarirano polje s tremi vrednostmi, inicializiranimi z nič.
uint16_t modbus_array = {0,0,0};
V nastavitveni funkciji je LCD najprej nastavljen v način 16x2 in prikazano in izbrisano pozdravno sporočilo.
lcd.begin (16,2); // Lcd nastavljen v načinu 16x2 lcd.print ("RS-485 Modbus"); // pozdravno sporočilo lcd.setCursor (0,1); lcd.print ("Arduino Slave"); zamuda (5000); lcd.clear ();
Po tem so zatiči LED1 in LED2 nastavljeni kot izhodni zatiči.
pinMode (led1, IZHOD); pinMode (led2, IZHOD);
Pritrjen je servo pulzni zatič, povezan s PWM zatičem 6 Arduina.
servo.attach (6);
Zdaj so za komunikacijo Modbus nastavljeni naslednji parametri. Prvi '1' predstavlja podrejeni ID, drugi '1' pomeni, da za prenos podatkov uporablja RS-485, '4' pa predstavlja RS-485 DE&RE pin, povezan z Arduino UNO.
vodilo = Modbus (1,1,4);
Podrejeni Modbus je nastavljen na 9600 baudrate.
Zanka se začne z definicijo ankete vodila in bus.poll () se uporablja za pisanje in sprejemanje vrednosti iz glavnega Modbusa.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Ta metoda se uporablja za preverjanje, ali so na serijskih vratih na voljo podatki.
Če so na serijskih vratih na voljo podatki, bo knjižnica Modbus RTU preverila sporočilo (preverila naslov naprave, dolžino podatkov in CRC) in izvedla zahtevano dejanje.
Če želite na primer zapisati ali prebrati katero koli vrednost iz glavne enote, mora ModbusRTU od glavnega Modbusa prejeti nepodpisano 16-bitno celoštevilsko matriko in njeno dolžino. Ta matrika vsebuje podatke, ki so zapisani iz glavne enote.
V tej vadnici so trije nizi za LED1, LED2 in kot servo motorja.
Najprej se vklopi ali izklopi LED1 modbus_array.
if (modbus_array == 0) // Odvisno od vrednosti v modubus_array, ki jo je napisal Master Modbus { digitalWrite (led1, LOW); // LED IZKLOPLJEN, če je 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED VKLOPI, če vrednost ni 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Za vklop ali izklop se uporabi LED2 modbus_array.
if (modbus_array == 0) // Odvisno od vrednosti v modbus_array, ki ga je napisal Master Modbus { digitalWrite (led2, LOW); // LED IZKLOPLJEN, če je 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED VKLOPLJEN, če vrednost ni 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Nato za nastavitev kota servo motorja se na zaslonu LCD 16x2 natisne uporabljeni modbus_array in vrednost.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo kot:"); lcd.print (pwm); zamuda (200); lcd.clear ();
S tem se Arduino UNO programira tako, da deluje kot MODBUS Slave. Naslednji korak bo preizkus kot Modbus Slave.
Testiranje Arduino UNO kot Rs485 Modbus Slave
Ko so povezave vezja končane in koda prenesena na Arduino UNO, je čas, da povežete modul USB z RS-485 z osebnim računalnikom, kjer je nameščena programska oprema Simple Modbus Master.
Odprite upravitelja naprav in preverite vrata COM glede na svoj računalnik, kamor je priključen modul USB do RS-485, nato pa odprite programsko opremo Simply Modbus Master 8.1.1.
1. Po odprtju programske opreme Simply Modbus odprite možnost Write.
2. Ko se odpre Simply Modbus Master Write. Nastavite parametre
Način v RTU, vrata COM glede na vaš osebni računalnik (moj je bil COM6), Baud pri 9600, podatkovni bit 8, stop bit 1, parnost Brez in podrejeni ID kot 1.
3. Po tem nastavite prvi register kot 40001 in vrednosti za zapis je 3, funkcijska koda pa 16 (Write Holding Register).
Po tem napišite 1 do 40001 (za LED1 vklopljen) in 1 do 40002 (za LED2 vklopljen) in 90 do 40003 (za kot servo motorja) in nato kliknite gumb POŠLJI.
Stanje LED je vklopljeno in kot servo pogona je 90 stopinj.
4. Po tem vnesite 40001 kot 1 in 40002 kot 0 in 40003 kot 180 in kliknite gumb POŠLJI.
5. Zdaj pišemo 135 na 40003 in 40001 kot 0 in 40002 kot 1.
Tako lahko RS-485 Modbus uporabljamo v serijski komunikaciji z Arduino UNO kot podrejeni. V naslednji vadnici bomo uporabili Arduino Uno kot master v sestavljanju MODBUS.
Spodaj poiščite celotno kodo in predstavitveni video.