Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Modbus gebruiken met Arduino

Componenten en benodigdheden

Arduino UNO
× 1
Professioneel RS422/RS485-schild voor Arduino
× 1
USB-naar-RS485-converter
× 1
Broodplank (algemeen)
× 1
LED (generiek)
× 1
Weerstand 10k ohm
× 1
Weerstand 221 ohm
× 1
Jumperdraden (algemeen)
× 1
SparkFun Drukknopschakelaar 12 mm
× 1

Apps en online services

Arduino IDE
Modbustester

Over dit project

Modbus, een seriële communicatiestandaard, is een de facto standaard communicatieprotocol geworden en is nu een algemeen beschikbaar middel om industriële elektronische apparaten aan te sluiten. In Modbus RTU en Modbus ASCII wordt RS485 als fysieke laag gebruikt. Het is mogelijk om een ​​Arduino als slave (en met enige beperkingen ook als master) in Modbus-toepassingen te gebruiken, maar hiervoor is een RS485-interface nodig. Ons RS422/RS485-schild is een volledig galvanisch geïsoleerd seriële communicatieschild dat is ontworpen voor gebruik met de Arduino UNO en andere compatibele kaarten zoals Arduino 101, STM Nucleo... Dit schild is de perfecte keuze voor dergelijke toepassingen.

Het doel van dit document is om te laten zien hoe je samen met een Arduino UNO een eenvoudig Modbus-slave-apparaat kunt maken. We gebruiken een pc als Modbus-master.

Gereedschappen en materialen

  • Arduino UNO
  • RS485-schild voor Arduino
  • Elke RS485-USB-adapter voor pc-verbinding (of een goedkopere)

Optioneel:

  • Broodplank
  • Drukknop
  • Rode LED
  • 220 Ohm Weerstand
  • 10k Weerstand
  • Jumperdraden

Software

  • Arduino IDE
  • Modbustester

Bedrading RS485:

De bedrading is heel eenvoudig. U hoeft alleen de A- en B-klemmen van de afscherming te verbinden met de A- en B-lijn van het Modbus-systeem. Y- en Z-klemmen worden niet gebruikt voor dit soort toepassingen. Voor lange afstanden is het aan te raden om getwiste paren te gebruiken voor A en B.

Bedrading Arduino (optioneel):

Het is aan te raden om een ​​LED en een knop aan de Arduino toe te voegen om enkele effecten van de Modbus-communicatie te zien. Het is optioneel en niet noodzakelijk.

Instellingen DIP-schakelaar:

De RS422/RS485 Shield wordt geleverd met 3 DIP-switchbanken. U moet deze DIP-switches voor Modbus instellen zoals weergegeven in de onderstaande afbeelding.

Schakelaar 1:1-UIT 2-AAN 3-AAN 4-UIT

Schakelaar 2:1-UIT 2-UIT 3-AAN 4-AAN

Schakelaar 3:1-UIT of AAN* 2-UIT 3-UIT 4-UIT

*Afhankelijk van de positie van de RS422/RS485 Shield in de Modbus-lijn moet u de afsluitweerstand AAN of UIT schakelen. Schakel de weerstand alleen in de AAN-stand als de afscherming zich aan het ene uiteinde van de buslijn bevindt. Schakel in alle andere gevallen de afsluitweerstand UIT:

Jumper-instellingen:

Op het schild vind je 3 verschillende jumpergebieden. Heel belangrijk is de Jumper JP1 voor de voedingsspanning. De Arduino UNO werkt intern met 5V. Je moet deze Jumper op de 5V-positie zetten (voor 3,3V-borden bijvoorbeeld Arduino 101 op de 3,3V-positie).

Stel verder de jumpers voor de communicatiepoorten in de linkerbovenhoek in zoals in de afbeelding hierboven. De interne UART op poort 0 en 1 wordt in dit geval aangesloten op de RS485-interface van de afscherming.

Last but not least moeten we Jumper instellen voor de RX/TX-controlepoort. We gebruiken deze Jumper niet, omdat de automatische RX/TX-omschakeling is geconfigureerd.

Installeer de Modbus-testersoftware op de pc:

We gebruiken in dit voorbeeld de pc als Modbus-master. Je moet Modbustester downloaden. Pak het zip-archief uit in een nieuwe map op uw harde schijf. Open de software en wijzig de gemarkeerde velden zoals in de onderstaande afbeelding. U moet eerst de USB-RS485-adapter aansluiten. Kies de juiste COM-poort voor deze adapter in Modbustester.

Arduino-software:

Laad de firmware in de Arduino IDE voor het compileren en programmeren.

Test je werk:

Nu is het tijd om je werk te testen!

U kunt op de knop Lezen drukken in Modbustester. Dit commando leest 8 bytes van het geheugen van ons nieuwe slave-apparaat. In adres 400008 vind je de status van de knop. Het adres 400001 - 400006 bevat waarden van de ADC-poorten.

Met de schrijfknop kun je registers in de slave manipuleren. U kunt in adres 400007 een 0 of 1 invoeren om de LED AAN of UIT te schakelen.

Code

  • Voorbeeldcode voor Arduino UNO
Voorbeeldcode voor Arduino UNOArduino
/* * Testprogramma voor Arduino RS422/RS485 Shield * Versie 1.0 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de * * (gebaseerd op bronnen van https://github.com/angeloc/simplemodbusng) * * * Dit programma is vrije software:u kunt het opnieuw distribueren en/of wijzigen * onder de voorwaarden van de GNU General Public License zoals gepubliceerd door * de Free Software Foundation, ofwel versie 3 van de licentie, of * (naar uw keuze) elke latere versie. * * Dit programma wordt verspreid in de hoop dat het nuttig zal zijn, * maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van * VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de * GNU General Public License voor meer details. * * U zou samen met dit programma een kopie van de GNU General Public License * moeten hebben ontvangen. Zo niet, ga dan naar .*/ #include #define ledPin 12 // onboard led #define buttonPin 7 // push button/* Deze voorbeeldcode heeft 9 bezitsregisters. 6 analoge ingangen, 1 knop, 1 digitale uitgang en 1 register om fouten aan te geven die zijn opgetreden sinds de start. Functie 5 (schrijf enkele spoel) is niet geïmplementeerd, dus ik gebruik een heel register en functie 16 om de ingebouwde led op de Atmega328P in te stellen. De methode modbus_update() werkt de holdingRegs-registerarray bij en controleert de communicatie. Opmerking:de seriële ringbuffer van Arduino is 128 bytes of 64 registers. Meestal sluit je de arduino via serieel aan op een master met behulp van een MAX485 of iets dergelijks. In een functie 3-verzoek zal de master proberen om van uw slave te lezen en aangezien 5 bytes al worden gebruikt voor ID, FUNCTIE, NO OF BYTES en twee BYTES CRC, kan de master slechts 122 bytes of 61 registers aanvragen. In een functie 16-verzoek zal de master proberen naar uw slave te schrijven en aangezien er al 9 bytes worden gebruikt voor ID, FUNCTIE, ADRES, NO OF REGISTERS, NO OF BYTES en twee BYTES CRC, kan de master slechts 118 bytes of 59 registers schrijven . Met behulp van de FTDI USB-naar-serieel-converter is het maximale aantal bytes dat u kunt verzenden beperkt tot de interne buffer die 60 bytes of 30 niet-ondertekende int-registers is. Dus:In een functie 3-verzoek zal de master proberen om van uw slave te lezen en aangezien 5 bytes al worden gebruikt voor ID, FUNCTIE, NO OF BYTES en twee BYTES CRC, kan de master slechts 54 bytes of 27 registers aanvragen. In een functie 16-verzoek zal de master proberen naar uw slave te schrijven en aangezien er al 9 bytes worden gebruikt voor ID, FUNCTIE, ADRES, NO OF REGISTERS, NO OF BYTES en twee BYTES CRC, kan de master slechts 50 bytes of 25 registers schrijven . Aangezien wordt aangenomen dat u de Arduino meestal zult gebruiken om verbinding te maken met een master zonder een USB-naar-serieel-converter te gebruiken, is de interne buffer hetzelfde ingesteld als de Arduino seriële ringbuffer, die 128 bytes is. */ // Het gebruik van de enum-instructie maakt het mogelijk voor een gemakkelijke methode voor het toevoegen en // verwijderen van registers. Door het op deze manier te doen, bespaart u #definiëren van de grootte // van uw slaves-registerarray elke keer dat u meer registers wilt toevoegen// en in een oogopslag informeert u over de lay-out van uw slavesregister./////////// ///// registers van je slaaf ///////////////////enum { // voeg gewoon registers toe of verwijder ze en je kunt beginnen... // Het eerste register begint op adres 0 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // laat deze TOTAL_REGS_SIZE // totaal aantal registers voor functie 3 en 16 delen dezelfde registerarray};unsigned int holdingRegs[ TOTAL_REGS_SIZE]; // functie 3 en 16 register array////////////////////////////////////////// //////////////////void setup(){ /* parameters (lange baudrate, niet-ondertekende char-ID, niet-ondertekende char-transmissie-pin, niet-ondertekende int-holdingregisters grootte, niet-ondertekende char lage latentie ) De zendinschakelpin wordt gebruikt in half-duplexcommunicatie om een ​​MAX485 of iets dergelijks te activeren om deze modus te deactiveren. Gebruik een waarde <2 omdat 0 &1 is gereserveerd voor Rx &Tx. Lage latentievertragingen maken de implementatie niet-standaard, maar praktisch werkt het met alle belangrijke modbus-masterimplementaties. */ modbus_configure (9600, 1, 6, TOTAL_REGS_SIZE, 0); pinMode (ledPin, UITGANG); pinMode (knopPin, INPUT); }void loop(){ // modbus_update() is de enige methode die in loop() wordt gebruikt. Het geeft de totale fout // telling terug sinds de slave is gestart. U hoeft het niet te gebruiken, maar het is handig // voor het opsporen van fouten door de modbus-master. holdingRegs [TOTAL_ERRORS] =modbus_update (holdingRegs); for (byte i =0; i <6; i++) {holdingRegs[i] =analogRead(i); vertraging Microseconden (50); } byte buttonState =digitalRead (buttonPin); // lees knop statussen // wijs de buttonState waarde toe aan het holding register holdingRegs [BUTTON_STATE] =buttonState; // lees de LED_STATE registerwaarde en stel de ingebouwde LED hoog of laag in met functie 16 byte ledState =holdingRegs [LED_STATE]; if (ledState) // set led {digitalWrite (ledPin, HIGH); } else if (ledState ==0) // reset led {//digitalWrite (ledPin, LOW); holdingRegs[LED_STATE] =0; } }

Schema's

Bedrading van enkele testcomponenten naar de Arduino

Productieproces

  1. C# Queue met voorbeelden:wat is C# Queue en hoe te gebruiken?
  2. Licht dimmen met PWM met drukknop
  3. Arduino-gyroscoopspel met MPU-6050
  4. Unopad - Arduino MIDI-controller met Ableton
  5. Eenvoudige obstakelsensor met Arduino
  6. Vind mij
  7. Arduino-joystick
  8. Hoe gemakkelijk is het om een ​​thermistor te gebruiken?!
  9. Muziek maken met een Arduino
  10. Hoe NMEA-0183 te gebruiken met Arduino
  11. Hoe maak je op Arduino gebaseerde automatische deuropening