Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

So verwenden Sie Modbus mit Arduino

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Professionelles RS422 / RS485-Shield für Arduino
× 1
USB-zu-RS485-Konverter
× 1
Breadboard (generisch)
× 1
LED (generisch)
× 1
Widerstand 10k Ohm
× 1
Widerstand 221 Ohm
× 1
Jumper (generisch)
× 1
SparkFun Drucktastenschalter 12 mm
× 1

Apps und Onlinedienste

Arduino-IDE
Modbustester

Über dieses Projekt

Modbus, ein serieller Kommunikationsstandard, hat sich zu einem De-facto-Standard-Kommunikationsprotokoll entwickelt und ist heute ein allgemein verfügbares Mittel zur Verbindung industrieller elektronischer Geräte. Bei Modbus RTU und Modbus ASCII wird RS485 als physikalische Schicht verwendet. Es ist möglich, einen Arduino als Slave (und mit Einschränkungen auch als Master) in Modbus-Anwendungen zu verwenden, es wird jedoch eine RS485-Schnittstelle benötigt. Unser RS422 / RS485-Shield ist ein vollständig galvanisch isoliertes serielles Kommunikations-Shield, das für die Verwendung mit dem Arduino UNO und anderen kompatiblen Boards wie Arduino 101, STM Nucleo... entwickelt wurde. Dieses Shield ist die perfekte Wahl für solche Anwendungen.

Das Ziel dieses Dokuments ist es, zu zeigen, wie man zusammen mit einem Arduino UNO ein einfaches Modbus-Slave-Gerät erstellt. Als Modbus-Master verwenden wir einen PC.

Werkzeuge und Materialien

  • Arduino UNO
  • RS485-Schild für Arduino
  • Beliebiger RS485-USB-Adapter für PC-Anschluss (oder ein günstigerer)

Optional:

  • Breadboard
  • Taste drücken
  • Rote LED
  • 220-Ohm-Widerstand
  • 10k Widerstand
  • Überbrückungsdrähte

Software

  • Arduino-IDE
  • Modbustester

Verkabelung RS485:

Die Verkabelung ist ganz einfach. Sie müssen nur die A- und B-Klemmen des Schirms mit der A- und B-Leitung des Modbus-Systems verbinden. Y- und Z-Klemmen werden für diese Art von Anwendung nicht verwendet. Für große Entfernungen wird empfohlen, für A und B verdrillte Paare zu verwenden.

Arduino verdrahten (optional):

Es wird empfohlen, dem Arduino eine LED und eine Taste hinzuzufügen, um einige Auswirkungen der Modbus-Kommunikation zu sehen. Es ist optional und nicht erforderlich.

DIP-Schaltereinstellungen:

Das RS422/RS485 Shield wird mit 3 DIP-Schalterbänken geliefert. Sie müssen diese DIP-Schalter für Modbus wie im Bild unten gezeigt einstellen.

Schalter 1:1-OFF 2-ON 3-ON 4-OFF

Schalter 2:1-AUS 2-AUS 3-EIN 4-EIN

Schalter 3:1-AUS oder EIN* 2-AUS 3-AUS 4-AUS

*Je nach Position des RS422/RS485 Shields in der Modbus-Leitung müssen Sie den Abschlusswiderstand EIN oder AUS schalten. Bitte schalten Sie den Widerstand nur dann in die ON-Position, wenn sich die Abschirmung an einem Ende der Busleitung befindet. In allen anderen Fällen schalten Sie den Abschlusswiderstand AUS:

Jumper-Einstellungen:

Auf dem Schild finden Sie 3 verschiedene Jumperbereiche. Ganz wichtig ist der Jumper JP1 für die Versorgungsspannung. Das Arduino UNO arbeitet intern mit 5V. Sie müssen diesen Jumper auf die 5V-Position setzen (für 3.3V-Boards zum Beispiel Arduino 101 auf die 3.3V-Position).

Setzen Sie außerdem die Jumper für die Kommunikationsports in der oberen linken Ecke wie im Bild oben. Der interne UART an Port 0 und 1 wird in diesem Fall mit der RS485-Schnittstelle des Shields verbunden.

Zu guter Letzt müssen wir noch Jumper für den RX/TX-Steuerungsport setzen. Wir verwenden diesen Jumper nicht, da die automatische RX/TX-Umschaltung konfiguriert ist.

Installieren Sie die Modbus-Tester-Software auf dem PC:

Wir verwenden in diesem Beispiel den PC als Modbus-Master. Sie müssen Modbustester herunterladen. Bitte entpacken Sie das Zip-Archiv in ein neues Verzeichnis auf Ihrer Festplatte. Öffnen Sie die Software und ändern Sie die markierten Felder wie im Bild unten. Vorher muss der USB-RS485-Adapter angeschlossen werden. Bitte wählen Sie den richtigen COM-Port für diesen Adapter im Modbustester aus.

Arduino-Software:

Bitte laden Sie die Firmware zum Kompilieren und Programmieren in die Arduino IDE.

Testen Sie Ihre Arbeit:

Jetzt ist es an der Zeit, Ihre Arbeit zu testen!

Sie können die Schaltfläche Lesen im Modbustester drücken. Dieser Befehl liest 8 Bytes des Speichers unseres neuen Slave-Geräts. Unter Adresse 400008 finden Sie den Status der Schaltfläche. Die Adresse 400001 - 400006 enthält Werte der ADC-Ports.

Mit der Schaltfläche Schreiben können Sie Register im Slave manipulieren. Sie können in Adresse 400007 eine 0 oder 1 eingeben, um die LED ein- oder auszuschalten.

Code

  • Beispielcode für Arduino UNO
Beispielcode für Arduino UNOArduino
/* * Testprogramm für Arduino RS422/RS485 Shield * Version 1.0 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de * * (basierend auf Quellen von https://github.com/angeloc/simplemodbusng) * * * Dieses Programm ist freie Software:Sie können es unter den Bedingungen der GNU General Public License, wie sie von * der Free Software Foundation veröffentlicht wurde, entweder Version 3 der Lizenz oder * (nach Ihrer Wahl) weitergeben und/oder modifizieren. jede spätere Version. * * Dieses Programm wird in der Hoffnung verteilt, dass es nützlich ist, * jedoch OHNE JEGLICHE GEWÄHRLEISTUNG; auch ohne die stillschweigende Garantie der * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Informationen finden Sie in der * GNU General Public License. * * Sie sollten eine Kopie der GNU General Public License * zusammen mit diesem Programm erhalten haben. Wenn nicht, siehe .*/ #include #define ledPin 12 // Onboard-LED #define buttonPin 7 // push button/* Dieser Beispielcode hat 9 Halteregister. 6 analoge Eingänge, 1 Taster, 1 digitaler Ausgang und 1 Register zur Anzeige von seit dem Start aufgetretenen Fehlern. Funktion 5 (Einzelspule schreiben) ist nicht implementiert, daher verwende ich ein ganzes Register und Funktion 16, um die Onboard-LED des Atmega328P einzustellen. Die Methode modbus_update() aktualisiert das HoldingRegs-Register-Array und überprüft die Kommunikation. Hinweis:Der serielle Ringpuffer von Arduino ist 128 Byte oder 64 Register. Meistens werden Sie das Arduino mit einem MAX485 oder ähnlichem seriell an einen Master anschließen. Bei einer Anforderung von Funktion 3 versucht der Master, von Ihrem Slave zu lesen, und da bereits 5 Byte für ID, FUNCTION, NO OF BYTES und zwei BYTES CRC verwendet werden, kann der Master nur 122 Byte oder 61 Register anfordern. In einer Funktion 16-Anfrage versucht der Master, auf Ihren Slave zu schreiben, und da bereits 9 Bytes für ID, FUNCTION, ADDRESS, NO OF REGISTERS, NO OF BYTES und zwei BYTES CRC verwendet werden, kann der Master nur 118 Bytes oder 59 Register schreiben . Bei Verwendung des FTDI USB-Seriell-Konverters ist die maximale Anzahl von Bytes, die Sie senden können, auf den internen Puffer begrenzt, der 60 Bytes oder 30 vorzeichenlose Int-Register beträgt. Also:Bei einer Anforderung von Funktion 3 versucht der Master, von Ihrem Slave zu lesen und da bereits 5 Byte für ID, FUNCTION, NO OF BYTES und zwei BYTES CRC verwendet werden, kann der Master nur 54 Byte oder 27 Register anfordern. In einer Funktion 16-Anfrage versucht der Master, auf Ihren Slave zu schreiben, und da bereits 9 Bytes für ID, FUNCTION, ADDRESS, NO OF REGISTERS, NO OF BYTES und zwei BYTES CRC verwendet werden, kann der Master nur 50 Bytes oder 25 Register schreiben . Da davon ausgegangen wird, dass Sie das Arduino meistens verwenden, um eine Verbindung zu einem Master ohne einen USB-zu-Seriell-Konverter zu verwenden, wird der interne Puffer auf den gleichen Wert wie der Arduino Serial Ringbuffer eingestellt, der 128 Byte groß ist. * / // Die Verwendung des Enum-Befehls ermöglicht für eine einfache Methode zum Hinzufügen und // Entfernen von Registern. Auf diese Weise ersparen Sie sich das #Definieren der Größe // Ihres Slave-Register-Arrays jedes Mal, wenn Sie weitere Register hinzufügen möchten // und informiert Sie auf einen Blick über das Layout Ihres Slave-Registers./////////// ///// Register deines Slaves ///////////////////enum { // einfach Register hinzufügen oder entfernen und schon kann es losgehen... // Das erste Register beginnt bei Adresse 0 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // belasse diese TOTAL_REGS_SIZE // Gesamtzahl der Register für Funktion 3 und 16 teilen sich das gleiche Register-Array};unsigned int holdingRegs[ TOTAL_REGS_SIZE]; // Funktion 3 und 16 Register Array ///////////////////////////////////////// //////////////////void setup () { /* Parameter (lange Baudrate, unsigned char ID, unsigned char send enable pin, unsigned int holding registers size, unsigned char low latency ) Der Sendeaktivierungsstift wird in der Halbduplex-Kommunikation verwendet, um einen MAX485 oder ähnliches zu aktivieren, um diesen Modus zu deaktivieren. Verwenden Sie einen Wert <2, da 0 &1 für Rx &Tx reserviert sind. Niedrige Latenzverzögerungen machen die Implementierung nicht standardisiert, aber praktisch funktioniert sie mit allen wichtigen Modbus-Master-Implementierungen. */ modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0); pinMode (ledPin, AUSGANG); pinMode (buttonPin, INPUT); }void loop(){ // modbus_update() ist die einzige Methode, die in loop() verwendet wird. Es gibt die Gesamtfehlerzahl // seit dem Start des Slaves zurück. Sie müssen es nicht verwenden, aber es ist nützlich // für die Fehlersuche durch den Modbus-Master. holdingRegs[TOTAL_ERRORS] =modbus_update(holdingRegs); for (Byte i =0; i <6; i++) {holdingRegs[i] =analogRead(i); VerzögerungMikrosekunden (50); } byte buttonState =digitalRead (buttonPin); // Schaltflächenzustände lesen // ButtonState-Wert dem Halteregister zuweisen holdingRegs[BUTTON_STATE] =buttonState; // Lesen Sie den LED_STATE-Registerwert und setzen Sie die Onboard-LED hoch oder niedrig mit der Funktion 16 Byte ledState =holdingRegs[LED_STATE]; if (ledState) // setze LED { DigitalWrite (ledPin, HIGH); aufrechtzuerhalten. Sonst if (ledState ==0) // LED zurücksetzen {//digitalWrite (ledPin, LOW); holdingRegs[LED_STATE] =0; } }

Schaltpläne

Verdrahtung einiger Testkomponenten zum Arduino

Herstellungsprozess

  1. C#-Warteschlange mit Beispielen:Was ist C#-Warteschlange und wie wird sie verwendet?
  2. Dimmen von Lichtern mit PWM über Drucktasten
  3. Arduino-Gyroskop-Spiel mit MPU-6050
  4. Unopad - Arduino MIDI-Controller mit Ableton
  5. Einfacher Hindernissensor mit Arduino
  6. Finde mich
  7. Arduino-Joystick
  8. Wie einfach ist es, einen Thermistor zu verwenden?!
  9. Wie man mit einem Arduino Musik macht
  10. So verwenden Sie NMEA-0183 mit Arduino