- RS-485 Seriell kommunikation
- Ansluter RS-485 med Arduino
- USB till RS-485 omvandlingsmodul
- Helt enkelt Modbus Master Software
- Verktyg krävs
- Kretsschema
- Programmering Arduino UNO för RS-485 MODBUS Slave
- Testar Arduino UNO som Rs485 Modbus Slave
Modbus är ett seriellt kommunikationsprotokoll som upptäcktes av Modicon 1979 och används för överföring av data över seriella linjer mellan industriella elektroniska enheter. RS-485 Modbus använder RS-485 för överföringslinjer. Det bör noteras att Modbus är ett mjukvaruprotokoll och inte ett hårdvaruprotokoll. Den är uppdelad i två delar som Modbus Master och Modbus Slave. I RS-485 Modbus-nätverk finns det en Master och 127 Slavar med en unik adress från 1 till 127. I detta MAX485 Arduino- projekt kommer vi att använda Arduino Uno som Slave för seriell kommunikation.
Modbus används mest i PLC: er (programmerbara logiska styrenheter). Bortsett från detta används Modbus också inom sjukvård, transport, hemautomation etc. Modbus har 255 funktionskoder och det finns huvudsakligen tre populära versioner av Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Vad är skillnaden mellan Modbus ASCII och Modbus RTU?
Modbus RTU och Modbus ASCII pratar samma protokoll. Den enda skillnaden är att de byte som överförs över kabeln presenteras som binära med RTU och som läsbar ASCII med Modbus RTU. Modbus RTU kommer att användas i denna handledning.
Denna handledning handlar om att använda RS-485 Modbus-kommunikation med Arduino UNO som slav. Här installerar vi Simply Modbus Master Software i PC och styr två lysdioder och Servomotor med hjälp av RS-485 som överföringsledning. Dessa lysdioder och servomotorer är anslutna till Slave Arduino och styrs genom att skicka värden med Master Modbus-programvaran. Eftersom denna handledning använder RS-485 rekommenderas det att du först går igenom RS485 seriell kommunikation mellan Arduino Uno och Arduino Nano. RS485 kan också användas med andra styrenheter för seriell kommunikation:
- RS-485 Seriekommunikation mellan Raspberry Pi och Arduino UNO
- Seriekommunikation mellan STM32F103C8 och Arduino UNO med RS-485
Låt oss börja med att utforska lite bakgrund om RS-485 och Modbus. Läs också mer om olika seriella kommunikationsprotokoll här.
RS-485 Seriell kommunikation
RS-485 är ett asynkront seriellt kommunikationsprotokoll som inte kräver klocka. Den använder en teknik som kallas differentiell signal för att överföra binär data från en enhet till en annan.
Så vad är denna differentiella signalöverföringsmetod ??
Metoden för differentiell signal fungerar genom att skapa en differentiell spänning genom att använda en positiv och negativ 5V. Det ger en halv-duplexkommunikation när du använder två ledningar och Full-duplex kräver fyra fyrar.
Genom att använda denna metod:
- RS-485 stöder högre dataöverföringshastighet på maximalt 30 Mbps.
- Det ger också maximalt dataöverföringsavstånd jämfört med RS-232-protokollet. Den överför data upp till maximalt 1200 meter.
- Den största fördelen med RS-485 jämfört med RS-232 är multipelslaven med enstaka Master medan RS-232 stöder endast enslav.
- Kan ha högst 32 enheter anslutna till RS-485-protokollet.
- En annan fördel med RS-485 är immun mot bruset eftersom de använder differentiell signalmetod för att överföra.
- RS-485 är snabbare jämfört med I2C-protokollet.
Ansluter RS-485 med Arduino
RS-485-modulen kan anslutas till vilken mikrokontroller som helst som har seriell port. För användning av RS-485-modul med mikrokontroller behövs en modul som heter 5V MAX485 TTL till RS485 som baseras på Maxim MAX485 IC eftersom den möjliggör seriell kommunikation över långa avstånd på 1200 meter. Den är dubbelriktad och halv duplex och har dataöverföringshastighet på 2,5 Mbps. Denna modul kräver en spänning på 5V.
Pin-Out av RS-485:
Pin-namn |
Stiftbeskrivning |
VCC |
5V |
A |
Icke-inverterande mottagaringång Icke-inverterande förarutgång |
B |
Inverterande mottagaringång Invertera drivrutinsutmatning |
GND |
GND (0V) |
R0 |
Receiver Out (RX-stift) |
RE |
Mottagarutgång (LOW-Enable) |
DE |
Drivrutinsutmatning (HIGH-Enable) |
DI |
Drivrutinsingång (TX-stift) |
USB till RS-485 omvandlingsmodul
Detta är en USB till RS485 Converter Adapter-modul som stöder WIN7, XP, Vista, Linux, Mac OS och ger ett lättanvänt RS485-gränssnitt med hjälp av COM-port i datorn . Denna modul är plug-and-play-enhet . Det finns inga kommandostrukturer, vad som helst som skickas till den virtuella COM-porten konverteras automatiskt till RS485 och vice versa. Modulen är helt självdriven från USB-bussen. Så inget behov av extern strömförsörjning för drift.
Den visas som en seriell / COM-port och är tillgänglig från applikationer eller hyperterminal. Denna omvandlare ger halv-duplex RS-485-kommunikation. Baudhastighetsområdet är 75 bps till 115200 bps, maximalt upp till 6 Mbps.
För att använda den här enheten finns olika Modbus-programvaror tillgängliga på internet. I denna handledning används en programvara som heter Simply Modbus Software.
Helt enkelt Modbus Master Software
Modbus Master-program behövs för att skicka data till slav Modbus RS-485 Arduino-enhet via COM.
Simply Modbus Master är en datakommunikationstestprogramvara. Du kan ladda ner Simply Modbus Master från den givna länken och lära dig mer om den genom att se programvaruhandboken.
Innan du använder programvaran är det viktigt att bekanta dig med följande terminologier.
Slav-ID:
Varje slav i ett nätverk tilldelas en unik enhetsadress från 1 till 127. När mastern begär data är den första byten som den skickar Slave-adressen. På så sätt vet varje slav efter den första byten om han eller hon ska ignorera meddelandet.
Funktionskod:
Den andra byten som skickas av mastern är funktionskoden. Det här numret berättar för slaven vilken tabell du vill komma åt och om den ska läsa från eller skriva till tabellen.
Stödda registerfunktionskoder:
Funktionskod |
Handling |
Tabellnamn |
04 (04 hex) |
Läsa |
Analoga ingångsregister |
03 (03 hex) |
Läsa |
Analoga utmatningsregister |
06 (06 hex) |
Skriv singel |
Analogt utmatningsregister |
16 (10 hex) |
Skriv flera |
Analoga utmatningsregister |
Stödda spolfunktionskoder:
Funktionskod |
Handling |
Tabellnamn |
02 (02 hex) |
Läsa |
Diskreta ingångskontakter |
01 (01 hex) |
Läsa |
Diskreta utmatningsspolar |
05 (05 hex) |
Skriv singel |
Diskret utgångsspole |
15 (0F hex) |
Skriv flera |
Diskreta utmatningsspolar |
CRC:
CRC står för Cyclic Redundancy check. Det är två byte som läggs till i slutet av varje Modbus-meddelande för feldetektering.
Verktyg krävs
Hårdvara
- Arduino UNO
- MAX-485 TTL till RS-485 omvandlingsmodul
- USB till RS-485 omvandlingsmodul
- LED (2)
- 1k-motstånd (2)
- 16x2 LCD-skärm
- 10k potentiometer
- Servomotor SG-90
programvara
- Helt enkelt Modbus Master
Kretsschema
Kretsanslutning mellan MAX-485 TTL till RS-485 omvandlingsmodul och Arduino UNO:
Arduino UNO |
MAX-485 TTL till RS-485 omvandlingsmodul |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Kretsanslutning mellan MAX-485 TTL till RS-485-modul och USB till RS-485-omvandlare:
MAX-485 TTL till RS-485 Omvandlingsmodul |
USB till RS-485-modul Ansluten till PC |
A |
A |
B |
B |
Kretsförbindelser mellan Arduino UNO och 16x2 LCD-skärm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
För att styra stift av potentiometer för kontroll av kontrast / ljusstyrka på 16x2 LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Kretsanslutning mellan två lysdioder, Servomotor och Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomotor |
2 |
Anod genom 1k motstånd |
- |
- |
5 |
- |
Anod genom 1k motstånd |
- |
6 |
- |
- |
PWM-stift (orange) |
+ 5V |
- |
- |
+ 5V (RÖD) |
GND |
Katod GND |
Katod GND |
GND (brun) |
Programmering Arduino UNO för RS-485 MODBUS Slave
Arduino UNO är konfigurerad som Modbus Slave. Dessutom är Arduino UNO fäst med två lysdioder och en servomotor. Så slaven Arduino styrs från Master Modbus Software. Kommunikationen mellan Arduino UNO och Modbus Master Software uppnås med hjälp av RS-485-modulen. För att ansluta den till PC används USB till RS-485-omvandlingsmodulen. Och Arduino UNO med MAX-485 TTL till RS-485- omvandlingsmodul, hela inställningen ser ut följande:
För att använda Modbus i Arduino UNO, ett bibliotek
Inledningsvis inkludera det önskade biblioteket. ModbusRTU-biblioteket är avsett för användning av RS-485 Modbus-kommunikation, och det flytande kristallbiblioteket är för användning av LCD med Arduino UNO, och servobiblioteket är för användning av Servomotor med Arduino UNO.
#omfatta
Nu definieras LED-anodstift som är anslutna till Arduino-stift 2 och 5 som LED1 och LED2.
#define led1 2 #define led2 5
Därefter förklaras objektet för åtkomst till flytande kristallklass med LCD-stiften (RS, E, D4, D5, D6, D7) som är anslutna till Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
När LCD är klar initierar du servoobjekt för klass Servo. Initiera också bussobjekt för klass Modbus.
Servoservo; Modbus-buss;
Nästa för lagring av värden för Modbus-kommunikation deklareras en array med de tre värdena initierade med noll.
uint16_t modbus_array = {0,0,0};
I inställningsfunktionen är LCD-skärmen först inställd i 16x2-läge och ett välkomstmeddelande visas och rensas.
lcd.begin (16,2); // LCD inställd i 16x2-läge lcd.print ("RS-485 Modbus"); // Välkomstmeddelande lcd.setCursor (0,1); lcd.print ("Arduino Slave"); fördröjning (5000); lcd.clear ();
Därefter ställs LED1 och LED2-stiften in som utgångsstift.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Servopulsstiften ansluten till PWM-stift 6 i Arduino är ansluten.
servo.attach (6);
För Modbus-kommunikationen ställs nu in följande parametrar. Första '1' representerar slav-ID, andra '1' representerar att den använder RS-485 för att överföra data och '4' representerar RS-485 DE&RE-stift ansluten till Arduino UNO.
buss = Modbus (1,1,4);
Modbus-slaven är inställd på 9600 baudrate.
Slingan börjar med definitionen av bussundersökning och bus.poll () används för att skriva och ta emot värde från master Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Den här metoden används för att kontrollera om det finns data tillgängliga i den seriella porten.
Om det finns data tillgängliga i seriell port kommer Modbus RTU-biblioteket att kontrollera meddelandet (kontrollera enhetsadressen, datalängden och CRC) och utföra den nödvändiga åtgärden.
Till exempel för att skriva eller läsa något värde från master måste ModbusRTU ta emot en osignerad 16-bitars heltalarray och dess längd från Master Modbus. Denna matris innehåller data som skrivs från mastern.
I den här handledningen finns det tre matriser för LED1, LED2 och Servomotorvinkel.
Först för att sätta PÅ eller AV, används LED1 modbus_array.
if (modbus_array == 0) // Beror på värdet i modubus_array skrivet av Master Modbus { digitalWrite (led1, LOW); // LED OFF om 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } annat { digitalWrite (led1, HIGH); // LED PÅ om ett annat värde än 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Nästa för att slå PÅ eller AV används LED2 modbus_array.
if (modbus_array == 0) // Beror på värdet i modbus_array skrivet av Master Modbus { digitalWrite (led2, LOW); // LED OFF om 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } annat { digitalWrite (led2, HIGH); // LED PÅ om ett annat värde än 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
För att ställa in vinkeln på servomotorn skrivs modbus_array som används och värdet ut på 16x2 LCD-skärmen.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servovinkel:"); lcd.print (pwm); fördröjning (200); lcd.clear ();
Detta avslutar programmeringen av Arduino UNO för att fungera som MODBUS Slave. Nästa steg kommer att testa det som Modbus Slave.
Testar Arduino UNO som Rs485 Modbus Slave
När kretsanslutningarna är slutförda och koden laddas upp till Arduino UNO, är det dags att ansluta USB till RS-485-modulen med datorn där Simple Modbus Master- programvaran är installerad.
Öppna enhetshanteraren och kontrollera COM-porten enligt din dator där USB till RS-485-modulen är ansluten och öppna därefter programvaran Simply Modbus Master 8.1.1.
1. När Simply Modbus Software har öppnats öppnar du nu alternativet Skriv.
2. Efter att Simply Modbus Master Write har öppnats. Ställ in parametrarna
Läge i RTU, COM-port enligt din PC (min var COM6), Baud vid 9600, Data Bits 8, Stop bit 1, Parity None och Slave ID som 1.
3. Därefter ställde först in registret som 40001 och värdena att skriva är 3 och funktionskoden som 16 (Write Holding Register).
Skriv därefter 1 till 40001 (för LED1 på) och 1 till 40002 (för LED2 på) och 90 till 40003 (för servomotorvinkel) och klicka sedan på SEND-knappen.
Du kan se att både LED-status är PÅ och servovinkel vid 90 grader.
4. Ange sedan 40001 som 1 och 40002 som 0 och 40003 som 180 och klicka på SEND-knappen.
5. Skriv nu 135 till 40003 och 40001 som 0 och 40002 som 1.
Så här kan RS-485 Modbus användas i seriekommunikation med Arduino UNO som slav. I nästa handledning använder vi Arduino Uno som master i MODBUS-idrifttagning.
Hitta den fullständiga koden och en demonstrationsvideo nedan.