Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Comment utiliser Modbus avec Arduino

Composants et fournitures

Arduino UNO
× 1
Shield professionnel RS422 / RS485 pour Arduino
× 1
Convertisseur USB vers RS485
× 1
Planche à pain (générique)
× 1
LED (générique)
× 1
Résistance 10k ohm
× 1
Résistance 221 ohm
× 1
Câbles de raccordement (générique)
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
× 1

Applications et services en ligne

Arduino IDE
Modbustester

À propos de ce projet

Modbus, une norme de communication série, est devenu un protocole de communication standard de facto et est désormais un moyen couramment disponible pour connecter des appareils électroniques industriels. Dans Modbus RTU et Modbus ASCII, RS485 est utilisé comme couche physique. Il est possible d'utiliser un Arduino en tant qu'esclave (et avec certaines restrictions également en tant que maître) dans les applications Modbus, mais une interface RS485 est nécessaire. Notre blindage RS422 / RS485 est un blindage de communication série entièrement isolé galvaniquement conçu pour être utilisé avec l'Arduino UNO et d'autres cartes compatibles comme Arduino 101, STM Nucleo... Ce blindage est le choix parfait pour ce type d'applications.

L'objectif de ce document est de montrer comment créer avec un Arduino UNO un simple appareil esclave Modbus. Nous utiliserons un PC comme maître Modbus.

Outils et matériaux

  • Arduino UNO
  • Shield RS485 pour Arduino
  • Tout adaptateur RS485-USB pour connexion PC (ou moins cher)

Facultatif :

  • Planche à pain
  • Bouton poussoir
  • LED rouge
  • Résistance 220 Ohm
  • Résistance 10k
  • Cavaliers

Logiciel

  • IDE Arduino
  • Modbustester

Câblage RS485 :

Le câblage est très simple. Vous devez connecter uniquement les bornes A et B du blindage avec les lignes A et B du système Modbus. Les bornes Y et Z ne sont pas utilisées pour ce type d'application. Pour les longues distances, il est recommandé d'utiliser des paires torsadées pour A et B.

Câblage Arduino (facultatif) :

Il est recommandé d'ajouter une LED et un bouton à l'Arduino pour voir certains effets de la communication Modbus. C'est facultatif et pas nécessaire.

Paramètres du commutateur DIP :

Le blindage RS422/RS485 est livré avec 3 banques de commutateurs DIP. Vous devez régler ces commutateurs DIP pour Modbus comme indiqué dans l'image ci-dessous.

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

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

Interrupteur 3 :1-OFF ou ON* 2-OFF 3-OFF 4-OFF

*Selon la position du blindage RS422/RS485 dans la ligne Modbus, vous devez activer ou désactiver la résistance de terminaison. Veuillez mettre la résistance en position ON uniquement si le Shield est à une extrémité de la ligne de bus. Dans tous les autres cas, désactivez la résistance de terminaison :

Paramètres des cavaliers :

Vous pouvez trouver 3 zones de cavaliers différentes sur le bouclier. Le cavalier JP1 est très important pour la tension d'alimentation. L'Arduino UNO fonctionne en 5V en interne. Vous devez régler ce cavalier sur la position 5V (pour les cartes 3,3V par exemple Arduino 101 sur la position 3,3V).

De plus, placez les cavaliers pour les ports de communication dans le coin supérieur gauche comme dans l'image ci-dessus. L'UART interne sur les ports 0 et 1 sera dans ce cas connecté à l'interface RS485 du shield.

Enfin, nous devons définir un cavalier pour le port de contrôle RX/TX. Nous n'utilisons pas ce cavalier, car la commutation automatique RX/TX est configurée.

Installez le logiciel de testeur Modbus sur PC :

Nous utiliserons dans cet exemple le PC comme maître Modbus. Vous devez télécharger Modbustester. Veuillez décompresser l'archive zip dans un nouveau répertoire sur votre disque dur. Ouvrez le logiciel et modifiez les champs marqués comme dans l'image ci-dessous. Vous devez avant tout connecter l'adaptateur USB-RS485. Veuillez choisir le bon port COM pour cet adaptateur dans Modbustester.

Logiciel Arduino :

Veuillez charger le firmware dans l'IDE Arduino pour la compilation et la programmation.

Testez votre travail :

Il est maintenant temps de tester votre travail !

Vous pouvez appuyer sur le bouton Lire dans Modbustester. Cette commande va lire 8 octets de la mémoire de notre nouvel appareil esclave. A l'adresse 400008 vous pouvez trouver l'état du bouton. L'adresse 400001 - 400006 contient les valeurs des ports ADC.

Avec le bouton d'écriture, vous pouvez manipuler les registres dans l'esclave. Vous pouvez entrer dans l'adresse 400007 un 0 ou 1 pour allumer ou éteindre la LED.

Code

  • Exemple de code pour Arduino UNO
Exemple de code pour Arduino UNOArduino
/* * Programme de test pour Arduino RS422/RS485 Shield * Version 1.0 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de * * (basé sur les sources de https://github.com/angeloc/simplemodbusng) * * * Ce programme est un logiciel libre :vous pouvez le redistribuer et/ou le modifier * selon les termes de la GNU General Public License telle que publiée par * la Free Software Foundation, soit la version 3 de la Licence, soit * (à votre choix) toute version ultérieure. * * Ce programme est distribué dans l'espoir qu'il vous sera utile, * mais SANS AUCUNE GARANTIE; sans même la garantie implicite de * QUALITÉ MARCHANDE ou D'ADAPTATION À UN USAGE PARTICULIER. Voir la * Licence publique générale GNU pour plus de détails. * * Vous devriez avoir reçu une copie de la GNU General Public License * avec ce programme. Sinon, voir .*/ #include #define ledPin 12 // led embarquée #define buttonPin 7 // push button/* Cet exemple de code a 9 registres d'exploitation. 6 entrées analogiques, 1 bouton, 1 sortie numérique et 1 registre pour indiquer les erreurs rencontrées depuis le démarrage. La fonction 5 (écrire une seule bobine) n'est pas implémentée, j'utilise donc un registre entier et la fonction 16 pour régler la Led embarquée sur l'Atmega328P. La méthode modbus_update() met à jour le tableau de registres holdingRegs et vérifie la communication. Remarque :la mémoire tampon en anneau série Arduino est de 128 octets ou 64 registres. La plupart du temps, vous connecterez l'arduino à un maître via série à l'aide d'un MAX485 ou similaire. Dans une requête de fonction 3, le maître tentera de lire à partir de votre esclave et puisque 5 octets sont déjà utilisés pour ID, FONCTION, NO OF BYTES et deux BYTES CRC, le maître ne peut demander que 122 octets ou 61 registres. Dans une requête de fonction 16, le maître tentera d'écrire sur votre esclave et comme un 9 octets est déjà utilisé pour ID, FONCTION, ADRESSE, NO OF REGISTERS, NO OF BYTES et deux BYTES CRC, le maître ne peut écrire que 118 octets ou 59 registres . En utilisant le convertisseur FTDI USB vers série, le nombre maximum d'octets que vous pouvez envoyer est limité à sa mémoire tampon interne qui est de 60 octets ou 30 registres int non signés. Ainsi :Dans une requête de fonction 3, le maître tentera de lire à partir de votre esclave et puisque 5 octets sont déjà utilisés pour ID, FONCTION, NO OF BYTES et deux BYTES CRC, le maître ne peut demander que 54 octets ou 27 registres. Dans une requête de fonction 16, le maître tentera d'écrire sur votre esclave et comme un 9 octets est déjà utilisé pour ID, FONCTION, ADRESSE, NO OF REGISTERS, NO OF BYTES et deux BYTES CRC, le maître ne peut écrire que 50 octets ou 25 registres . Puisqu'il est supposé que vous utiliserez principalement l'Arduino pour vous connecter à un maître sans utiliser de convertisseur USB vers série, le tampon interne est défini de la même manière que le tampon en anneau série Arduino qui est de 128 octets. */ // L'utilisation de l'instruction enum permet pour une méthode simple pour ajouter et // supprimer des registres. Faire de cette façon vous évite de #définir la taille // de votre tableau de registres esclaves chaque fois que vous souhaitez ajouter plus de registres // et vous informe en un coup d'œil de la disposition de vos registres esclaves./////////// ///// les registres de votre esclave ///////////////////enum { // il suffit d'ajouter ou de supprimer des registres et c'est parti... // Le premier registre commence à l'adresse 0 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // laisse celui-ci TOTAL_REGS_SIZE // nombre total de registres pour la fonction 3 et 16 partagent le même tableau de registres} unsigned int holdingRegs[ TOTAL_REGS_SIZE] ; // tableau des fonctions 3 et 16 registres//////////////////////////////////////// /////////////////void setup(){ /* parameters (long baudrate, unsigned char ID, unsigned char transmit enable pin, unsigned int holding registers size, unsigned char faible latence ) La broche d'activation de transmission est utilisée dans la communication semi-duplex pour activer un MAX485 ou similaire. Pour désactiver ce mode, utilisez n'importe quelle valeur <2 car 0 et 1 sont réservés pour Rx et Tx. Les faibles délais de latence rendent l'implémentation non standard, mais cela fonctionne pratiquement avec toutes les principales implémentations de maître Modbus. */ modbus_configure (9600, 1, 6, TOTAL_REGS_SIZE, 0); pinMode(ledPin, SORTIE); pinMode (boutonPin, INPUT); }void loop(){ // modbus_update() est la seule méthode utilisée dans loop(). Il renvoie le nombre total d'erreurs // depuis le démarrage de l'esclave. Vous n'êtes pas obligé de l'utiliser mais c'est utile // pour la recherche de pannes par le maître modbus. holdingRegs[TOTAL_ERRORS] =modbus_update(holdingRegs); for (octet i =0; i <6; i++) { holdingRegs[i] =analogRead(i); délaiMicrosecondes (50); } octet buttonState =digitalRead(buttonPin); // lecture des états des boutons // assigne la valeur buttonState au registre de maintien holdingRegs[BUTTON_STATE] =buttonState; // lire la valeur du registre LED_STATE et régler la LED intégrée à l'état haut ou bas avec la fonction 16 octets ledState =holdingRegs[LED_STATE] ; if (ledState) // set led { digitalWrite (ledPin, HIGH); } else if (ledState ==0) // réinitialiser la led { //digitalWrite(ledPin, LOW); holdingRegs[LED_STATE] =0 ; } }

Schémas

Câblage de certains composants de test à l'Arduino

Processus de fabrication

  1. File d'attente C# avec exemples :qu'est-ce que la file d'attente C# et comment l'utiliser ?
  2. Variation des lumières avec PWM à l'aide du bouton-poussoir
  3. Jeu de gyroscope Arduino avec MPU-6050
  4. Unopad - Contrôleur MIDI Arduino avec Ableton
  5. Capteur d'obstacles simple avec Arduino
  6. Trouvez-moi
  7. Joystick Arduino
  8. Est-il facile d'utiliser une thermistance ? !
  9. Comment faire de la musique avec un Arduino