- RS-485 nuoseklioji komunikacija
- RS-485 prijungimas prie „Arduino“
- USB į RS-485 keitiklio modulis
- Tiesiog „Modbus Master“ programinė įranga
- Reikalingi įrankiai
- Grandinės schema
- „Arduino UNO“ programavimas RS-485 MODBUS Slave
- „Arduino UNO“ bandymas kaip „Rs485 Modbus Slave“
„Modbus“ yra nuosekliojo ryšio protokolas, kurį „Modicon“ atrado 1979 m. Ir jis naudojamas duomenims perduoti nuosekliomis linijomis tarp pramoninių elektroninių prietaisų. „RS-485 Modbus“ perdavimo linijoms naudoja RS-485. Reikėtų pažymėti, kad „ Modbus“ yra programinės įrangos protokolas, o ne aparatinės įrangos protokolas. Jis yra padalintas į dvi dalis, tokias kaip „Modbus Master“ ir „Modbus Slave“. RS-485 „Modbus“ tinkle yra vienas pagrindinis ir 127 vergai, kurių kiekvienas turi unikalų adresą nuo 1 iki 127. Šiame MAX485 „Arduino“ projekte nuosekliam ryšiui naudosime „Arduino Uno“ kaip vergą.
„Modbus“ dažniausiai naudojami PLC (programuojami loginiai valdikliai). Be to, „Modbus“ taip pat naudojamas sveikatos priežiūros, transporto, namų automatikos ir kt. „Modbus“ turi 255 funkcijų kodus ir daugiausia yra trys populiarios „Modbus“ versijos:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Kuo skiriasi „Modbus ASCII“ ir „Modbus RTU“?
„Modbus RTU“ ir „Modbus ASCII“ kalba tuo pačiu protokolu. Vienintelis skirtumas yra tas, kad viela perduodami baitai pateikiami kaip dvejetainiai su RTU ir kaip skaitomi ASCII su „Modbus RTU“. Šioje pamokoje bus naudojamas „Modbus RTU“.
Ši pamoka skirta RS-485 „Modbus“ ryšio naudojimui su „Arduino UNO“ kaip vergu. Čia mes įdiegiame „ Simply Modbus Master“ programinę įrangą asmeniniame kompiuteryje ir valdome du šviesos diodus ir servovariklį naudodami RS-485 kaip perdavimo liniją. Šie šviesos diodai ir servovariklis yra sujungti su „Slave Arduino“ ir valdomi siunčiant reikšmes naudojant „Master Modbus“ programinę įrangą. Kadangi šioje pamokoje naudojamas RS-485, pirmiausia rekomenduojama pereiti RS485 nuoseklųjį ryšį tarp „Arduino Uno“ ir „Arduino Nano“. RS485 taip pat gali būti naudojamas su kitais valdikliais nuosekliam ryšiui:
- RS-485 nuoseklus ryšys tarp „Raspberry Pi“ ir „Arduino UNO“
- Serijinis ryšys tarp STM32F103C8 ir „Arduino UNO“ naudojant RS-485
Pradėkime nuo žinių apie RS-485 ir „Modbus“. Čia taip pat sužinokite daugiau apie įvairius nuosekliojo ryšio protokolus.
RS-485 nuoseklioji komunikacija
RS-485 yra asinchroninis nuoseklaus ryšio protokolas, kuriam nereikia laikrodžio. Dvejetainiams duomenims iš vieno įrenginio į kitą perduoti naudojama diferencinio signalo technika.
Taigi, koks yra diferencinio signalo perdavimo metodas?
Diferencinio signalo metodas veikia kuriant diferencinę įtampą naudojant teigiamą ir neigiamą 5 V. Naudojant du laidus, jis teikia „ Half-Duplex“ ryšį, o „ Full-Duplex“ reikalingi 4 keturi laidai.
Naudodami šį metodą:
- RS-485 palaiko didesnį duomenų perdavimo greitį, maksimalų 30Mbps.
- Tai taip pat užtikrina didžiausią duomenų perdavimo atstumą, palyginti su RS-232 protokolu. Jis perduoda duomenis iki 1200 metrų.
- Pagrindinis RS-485 privalumas, palyginti su RS-232, yra daugybė vergų su vienu pagrindiniu, o RS-232 palaiko tik vieną vergą.
- Prie RS-485 protokolo gali būti prijungti daugiausia 32 įrenginiai.
- Kitas RS-485 privalumas yra apsaugotas nuo triukšmo, nes jie perduoda diferencinio signalo metodą.
- RS-485 yra greitesnis, palyginti su I2C protokolu.
RS-485 prijungimas prie „Arduino“
RS-485 modulį galima prijungti prie bet kurio mikrovaldiklio, turinčio nuoseklųjį prievadą. Norint naudoti RS-485 modulį su mikrovaldikliais, reikalingas modulis, vadinamas „ 5V MAX485 TTL - RS485“, pagrįstas „Maxim MAX485 IC “, nes jis leidžia nuoseklųjį ryšį dideliu atstumu 1200 metrų. Jis yra dvikryptis ir pusiau dvipusis ir turi 2,5 Mbps duomenų perdavimo greitį. Šiam moduliui reikalinga 5 V įtampa.
RS-485 prisegimas:
PIN vardas |
Smeigtuko aprašymas |
VCC |
5V |
A |
Neinvertuojantis imtuvo įėjimas Neišverčianti vairuotojo išvestis |
B |
Keisti imtuvo įvestį Keičiant tvarkyklės išvestį |
BND |
BND (0 V) |
R0 |
Imtuvo išėjimas (RX kaištis) |
RE |
Imtuvo išvestis (įjungta LOW) |
DE |
Tvarkyklės išvestis (įgalinta HIGH) |
DI |
Tvarkyklės įvestis (TX kaištis) |
USB į RS-485 keitiklio modulis
Tai yra USB į RS485 keitiklio adapterio modulis, palaikantis WIN7, XP, Vista, Linux, Mac OS ir suteikiantis lengvai naudojamą RS485 sąsają naudojant kompiuterio COM prievadą . Šis modulis yra „plug-and-play“ įrenginys . Komandų struktūrų nėra, viskas, kas siunčiama į virtualųjį COM prievadą, automatiškai konvertuojama į RS485 ir atvirkščiai. Modulis visiškai maitinamas iš USB magistralės. Taigi darbui nereikia išorinio maitinimo šaltinio.
Jis rodomas kaip nuoseklusis / COM prievadas ir prieinamas iš programų ar hiperterminalo. Šis keitiklis teikia pusiau dupleksinį RS-485 ryšį. „Baud“ dažnių diapazonas yra nuo 75 iki 115200 bps, maksimalus - iki 6 Mbps.
Norėdami naudoti šį įrenginį, internete yra įvairi „Modbus“ programinė įranga. Šioje pamokoje naudojama programinė įranga, vadinama paprasčiausiai „Modbus“ programine įranga.
Tiesiog „Modbus Master“ programinė įranga
Programos „Modbus Master“ programa reikalinga norint siųsti duomenis į vergo „Modbus RS-485 Arduino“ įrenginį per COM.
Paprasčiausiai „Modbus Master“ yra duomenų perdavimo testavimo programinė įranga. Galite atsisiųsti „Simply Modbus Master“ iš pateiktos nuorodos ir sužinoti daugiau apie tai, naudodamiesi „Software Manual“
Prieš pradedant naudoti programinę įrangą, svarbu susipažinti su šiomis terminologijomis.
Vergo ID:
Kiekvienam tinklo vergui priskiriamas unikalus įrenginio adresas nuo 1 iki 127. Kai pagrindinis savininkas prašo duomenų, pirmasis jo atsiųstas baitas yra „Slave“ adresas. Tokiu būdu kiekvienas vergas po pirmo baito žino, ar nepaisyti pranešimo, ar ne.
Funkcijos kodas:
Antrasis magistro atsiųstas baitas yra funkcijos kodas. Šis skaičius nurodo vergui, prie kurios lentelės reikia prieiti, ir ar iš jos skaityti, ar rašyti.
Palaikomi registro funkcijų kodai:
Funkcijos kodas |
Veiksmas |
Lentelės pavadinimas |
04 (04 šešiakampis) |
Perskaityk |
Analoginių įvesties registrai |
03 (03 šešiakampis) |
Perskaityk |
Analoginės išvesties laikymo registrai |
06 (06 šešiakampis) |
Parašykite vieną |
Analoginės produkcijos laikymo registras |
16 (10 šešiakampių) |
Parašykite kelis |
Analoginės išvesties laikymo registrai |
Palaikomi ritės funkcijų kodai:
Funkcijos kodas |
Veiksmas |
Lentelės pavadinimas |
02 (02 šešiakampis) |
Perskaityk |
Diskretieji įvesties kontaktai |
01 (01 šešiakampis) |
Perskaityk |
Diskrečios išvesties ritės |
05 (05 šešiakampis) |
Parašykite vieną |
Diskreti išvesties ritė |
15 (0F šešiakampis) |
Parašykite kelis |
Diskrečios išvesties ritės |
CRC:
CRC reiškia „Cyclic Redundancy check“. Tai yra du baitai, pridėti prie kiekvieno „Modbus“ pranešimo pabaigos, kad būtų galima nustatyti klaidas.
Reikalingi įrankiai
Aparatinė įranga
- „Arduino UNO“
- MAX-485 TTL į RS-485 keitiklio modulis
- USB į RS-485 keitiklio modulis
- LED (2)
- 1k rezistorius (2)
- 16x2 LCD ekranas
- 10k potenciometras
- Servovariklis SG-90
Programinė įranga
- Tiesiog „Modbus Master“
Grandinės schema
Grandinės jungtis tarp MAX-485 TTL į RS-485 keitiklio modulio ir „Arduino UNO“:
„Arduino UNO“ |
MAX-485 TTL į RS-485 keitiklio modulis |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE ir RE |
+ 5 V |
VCC |
BND |
BND |
Grandinės jungtis tarp MAX-485 TTL į RS-485 modulio ir USB į RS-485 keitiklį:
Nuo MAX-485 TTL iki RS-485 Keitiklio modulis |
USB į RS-485 modulis Prijungtas prie kompiuterio |
A |
A |
B |
B |
Grandinės jungtys tarp „Arduino UNO“ ir 16x2 LCD ekrano:
16x2 LCD ekranas |
„Arduino UNO“ |
VSS |
BND |
VDD |
+ 5 V |
V0 |
Valdyti potenciometro kaištį 16x2 LCD kontrastui / ryškumui valdyti |
RS |
8 |
RW |
BND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5 V |
K. |
BND |
Grandinės jungtis tarp 2 šviesos diodų, servovariklio ir „Arduino UNO“:
„Arduino UNO“ |
LED1 |
LED2 |
Servo variklis |
2 |
Anodas per 1k rezistorių |
- |
- |
5 |
- |
Anodas per 1k rezistorių |
- |
6 |
- |
- |
PWM kaištis (oranžinis) |
+ 5 V |
- |
- |
+ 5 V (RED) |
BND |
Katodas GND |
Katodas GND |
GND (ruda) |
„Arduino UNO“ programavimas RS-485 MODBUS Slave
„Arduino UNO“ sukonfigūruotas kaip „ Modbus Slave“. Be to, „ Arduino UNO“ pritvirtinta dviem šviesos diodais ir vienu servovarikliu. Taigi vergas Arduino valdomas iš „Master Modbus“ programinės įrangos. Ryšys tarp „Arduino UNO“ ir „Modbus Master“ programinės įrangos vykdomas naudojant RS-485 modulį. Jį prijungiant prie kompiuterio, naudojamas USB į RS-485 keitiklio modulis. „Arduino UNO“ su MAX-485 TTL į RS-485 keitiklio moduliu visa sąranka atrodys taip:
Už „Modbus“ naudojimą bibliotekoje „Arduino UNO“
Iš pradžių įtraukite reikiamą biblioteką. „ModbusRTU“ biblioteka skirta naudoti RS-485 „Modbus“ ryšį, o skystųjų kristalų biblioteka - LCD su „Arduino UNO“, o servo biblioteka - „Servo“ varikliui su „Arduino UNO“.
# įtraukti
Dabar LED anodo kaiščiai, sujungti su „Arduino“ 2 ir 5 kaiščiais, yra apibrėžti kaip „LED1“ ir „LED2“.
#define led1 2 #define led2 5
Toliau objektas, skirtas patekti į skystųjų kristalų klasę, yra deklaruojamas su LCD kaiščiais (RS, E, D4, D5, D6, D7), kurie yra prijungti prie „Arduino UNO“.
„LiquidCrystal“ lcd (8,9,10,11,12,13);
Kai baigsite skystųjų kristalų ekraną, inicijuokite servo objekto klasę Servo. Taip pat inicializuokite „Modbus“ magistralės objektą.
Servo servo; „Modbus“ magistralė;
Toliau, norint išsaugoti „Modbus“ ryšio vertes, masyvas deklaruojamas, o trys reikšmės inicijuojamos nuliu.
uint16_t modbus_array = {0,0,0};
Pagal sąrankos funkciją pirmiausia LCD nustatomas 16x2 režimu, rodomas ir išvalomas pasveikinimo pranešimas.
lcd.prade (16,2); // LCD ekranas nustatytas 16x2 režimu lcd.print ("RS-485 Modbus"); // sveikinimo pranešimas lcd.setCursor (0,1); lcd.print („Arduino vergas“); vėlavimas (5000); lcd.clear ();
Po to LED1 ir LED2 kaiščiai nustatomi kaip išvesties kaiščiai.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Servo impulsinis kaištis, prijungtas prie „Arduino“ PWM 6 kaiščio, yra pritvirtintas.
servo.attach (6);
Dabar „Modbus“ ryšiui nustatyti šie parametrai. Pirmasis „1“ reiškia „Slave ID“, antrasis - „1“ reiškia, kad duomenims perduoti naudoja RS-485, o „4“ - RS-485 DE&RE kaištį, prijungtą prie „Arduino UNO“.
autobusas = „Modbus“ (1,1,4);
„Modbus“ vergas nustatytas 9600 baudos greičiu.
Kilpa prasideda apibrėžiant magistralės apklausą ir „ bus.poll“ () naudojama įrašyti ir gauti vertę iš pagrindinio „Modbus“.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Šis metodas naudojamas norint patikrinti, ar nuosekliame prievade yra duomenų.
Jei nuosekliame prievade yra duomenų, „Modbus RTU“ biblioteka patikrins pranešimą (patikrins įrenginio adresą, duomenų ilgį ir CRC) ir atliks reikiamus veiksmus.
Pavyzdžiui, norėdamas rašyti ar skaityti bet kokią reikšmę iš pagrindinio, „ModbusRTU“ turi gauti iš „Master Modbus“ nepasirašytą 16 bitų sveikojo skaičiaus masyvą ir jo ilgį. Šis masyvas turi duomenis, kurie yra parašyti iš pagrindinio.
Šioje pamokoje yra trys LED1, LED2 ir servo variklio kampo matricos.
Pirmiausia įjunkite arba išjunkite LED1 modbus_array.
if (modbus_array == 0) // Priklauso nuo modubus_array reikšmės, kurią parašė Master Modbus { digitalWrite (led1, LOW); // LED išjungta, jei 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // šviesos diodas įjungtas, jei vertė nėra 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Šalia norėdami įjungti arba išjungti LED2 modbus_array yra naudojamas.
if (modbus_array == 0) // Priklauso nuo modbus_array reikšmės, kurią parašė Master Modbus { digitalWrite (led2, LOW); // LED išjungtas, jei 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // šviesos diodas įjungtas, jei vertė nėra 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Šalia norėdami nustatyti servo variklio kampą, naudojamas modbus_array ir vertė atspausdinama 16x2 LCD ekrane.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo kampas:"); lcd.print (pwm); vėlavimas (200); lcd.clear ();
Tai baigia programuoti „Arduino UNO“, kad jis veiktų kaip „MODBUS Slave“. Kitas žingsnis bus išbandyti jį kaip „Modbus Slave“.
„Arduino UNO“ bandymas kaip „Rs485 Modbus Slave“
Užbaigus grandinės jungtis ir įkeliant kodą į „Arduino UNO“, laikas prijungti USB prie RS-485 modulį su kompiuteriu, kuriame įdiegta „ Simple Modbus Master“ programinė įranga.
Atidarykite įrenginių tvarkytuvę ir patikrinkite COM prievadą pagal savo kompiuterį, kuriame prijungtas USB – RS-485 modulis, ir po to atidarykite „Simply Modbus Master 8.1.1“ programinę įrangą.
1. Atidarius „ Simply Modbus“ programinę įrangą, dabar atidarykite rašymo parinktį.
2. Atidarius „ Simply Modbus Master Write“. Nustatykite parametrus
Režimas RTU, COM prievadas pagal jūsų kompiuterį (mano buvo COM6), „Baud“ ties 9600, „Data Bits 8“, „Stop bit 1“, „Parity None“ ir „Slave ID“ kaip 1.
3. Po to nustatykite pirmą registrą kaip 40001, o reikšmės rašyti yra 3, o funkcijos kodas - 16 (Write Holding Register).
Po to parašykite nuo 1 iki 40001 (LED1 įjungtas) ir nuo 1 iki 40002 (LED2 įjungtas) ir nuo 90 iki 40003 (servovariklio kampui) ir spustelėkite mygtuką Siųsti.
Matote, kad šviesos diodų būsena įjungta, o servo kampas - 90 laipsnių kampu.
4. Po to įveskite 40001 kaip 1 ir 40002 kaip 0 ir 40003 kaip 180 ir spustelėkite mygtuką Siųsti.
5. Dabar užrašykite nuo 135 iki 40003 ir 40001 kaip 0 ir 40002 kaip 1.
Štai kaip RS-485 Modbus galima naudoti nuosekliame ryšyje su „Arduino UNO“ kaip „Slave“. Kitoje pamokoje mes naudosime „Arduino Uno“ kaip MODBUS smulkinimo meistrą.
Žemiau rasite visą kodą ir demonstracinį vaizdo įrašą.