Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Cómo utilizar Modbus con Arduino

Componentes y suministros

Arduino UNO
× 1
Escudo RS422 / RS485 profesional para Arduino
× 1
Convertidor de USB a RS485
× 1
Breadboard (genérico)
× 1
LED (genérico)
× 1
Resistencia de 10k ohmios
× 1
Resistencia 221 ohm
× 1
Cables de puente (genéricos)
× 1
Interruptor de botón SparkFun de 12 mm
× 1

Aplicaciones y servicios en línea

Arduino IDE
Modbustester

Acerca de este proyecto

Modbus, un estándar de comunicación en serie, se ha convertido en un protocolo de comunicación estándar de facto y ahora es un medio comúnmente disponible para conectar dispositivos electrónicos industriales. En Modbus RTU y Modbus ASCII, RS485 se utiliza como capa física. Es posible usar un Arduino como esclavo (y con algunas restricciones también como maestro) en aplicaciones Modbus, pero se necesita una interfaz RS485. Nuestro escudo RS422 / RS485 es un escudo de comunicación en serie completamente aislado galvánicamente diseñado para usar con Arduino UNO y otras placas compatibles como Arduino 101, STM Nucleo ... Este escudo es la elección perfecta para este tipo de aplicaciones.

El objetivo de este documento es mostrar cómo crear junto con un Arduino UNO un dispositivo esclavo Modbus simple. Usaremos una PC como maestro Modbus.

Herramientas y materiales

  • Arduino UNO
  • Escudo RS485 para Arduino
  • Cualquier adaptador RS485-USB para conexión a PC (o uno más económico)

Opcional:

  • Protoboard
  • Botón pulsador
  • LED rojo
  • Resistencia de 220 ohmios
  • Resistencia de 10k
  • Cables de puente

Software

  • IDE de Arduino
  • Modbustester

Cableado RS485:

El cableado es muy sencillo. Debe conectar solo los terminales A y B del blindaje con la línea A y B del sistema Modbus. Los terminales Y y Z no se utilizan para este tipo de aplicación. Para distancias largas, se recomienda utilizar pares trenzados para A y B.

Cableado de Arduino (opcional):

Se recomienda agregar un LED y un botón al Arduino para ver algunos efectos de la comunicación Modbus. Es opcional y no es necesario.

Configuración del interruptor DIP:

El escudo RS422 / RS485 viene con 3 bancos de interruptores DIP. Debe configurar estos interruptores DIP para Modbus como se muestra en la siguiente imagen.

Interruptor 1:1-APAGADO 2-ENCENDIDO 3-ENCENDIDO 4-APAGADO

Interruptor 2:1-APAGADO 2-APAGADO 3-ENCENDIDO 4-ENCENDIDO

Interruptor 3:1-APAGADO o ENCENDIDO * 2-APAGADO 3-APAGADO 4-APAGADO

* Dependiendo de la posición del blindaje RS422 / RS485 en la línea Modbus, debe encender o apagar la resistencia de terminación. Cambie la resistencia a la posición ON solo si el blindaje está en un extremo de la línea de bus. En todos los demás casos, apague la resistencia de terminación:

Configuración del puente:

Puede encontrar 3 áreas de puente diferentes en el escudo. Muy importante es el Jumper JP1 para la tensión de alimentación. El Arduino UNO funciona con 5V internamente. Debe configurar este puente en la posición de 5 V (para placas de 3,3 V, por ejemplo, Arduino 101 en la posición de 3,3 V).

Además, configure los puentes para los puertos de comunicación en la esquina superior izquierda como se muestra en la imagen de arriba. El UART interno en los puertos 0 y 1 se conectará en este caso a la interfaz RS485 del blindaje.

Por último, pero no menos importante, tenemos que configurar el puente para el puerto de control RX / TX. No usamos este puente, porque la conmutación automática RX / TX está configurada.

Instale el software Modbus Tester en la PC:

Usaremos en este ejemplo el PC como maestro Modbus. Tienes que descargar Modbustester. Descomprima el archivo zip en un nuevo directorio de su disco duro. Abra el software y cambie los campos marcados como se muestra en la siguiente imagen. Debe conectar el adaptador USB-RS485 antes. Elija el puerto COM correcto para este adaptador en Modbustester.

Software Arduino:

Cargue el firmware en el IDE de Arduino para compilar y programar.

Pon a prueba tu trabajo:

¡Ahora es el momento de probar tu trabajo!

Puede presionar el botón Leer en Modbustester. Este comando leerá 8 bytes de la memoria de nuestro nuevo dispositivo esclavo. En la dirección 400008 puede encontrar el estado del botón. La dirección 400001 - 400006 contiene valores de los puertos ADC.

Con el botón de escritura puede manipular registros en el esclavo. Puede ingresar en la dirección 400007 un 0 o 1 para encender o apagar el LED.

Código

  • Código de muestra para Arduino UNO
Código de muestra para Arduino UNO Arduino
 / * * Programa de prueba para Arduino RS422 / RS485 Shield * Versión 1.0 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de * * (basado en fuentes de https://github.com/angeloc/simplemodbusng) * * * Este programa es software libre:puede redistribuirlo y / o modificarlo * según los términos de la Licencia Pública General GNU publicada por * la Free Software Foundation, ya sea la versión 3 de la Licencia, o * (a su elección) cualquier versión posterior. * * Este programa se distribuye con la esperanza de que sea útil, * pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de * COMERCIALIZACIÓN o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la * Licencia pública general GNU para obtener más detalles. * * Debería haber recibido una copia de la Licencia Pública General GNU * junto con este programa. De lo contrario, consulte . * / #Include  #define ledPin 12 // led integrado #define buttonPin 7 // pulsador / * Este código de ejemplo tiene 9 registros de explotación. 6 entradas analógicas, 1 botón, 1 salida digital y 1 registro para indicar errores encontrados desde el inicio. La función 5 (escribir una sola bobina) no está implementada, por lo que estoy usando un registro completo y la función 16 para configurar el LED integrado en el Atmega328P. El método modbus_update () actualiza la matriz de registros holdingRegs y verifica la comunicación. Nota:El búfer de anillo serial de Arduino es de 128 bytes o 64 registros. La mayoría de las veces, conectará el arduino a un maestro a través de serie utilizando un MAX485 o similar. En una solicitud de función 3, el maestro intentará leer de su esclavo y dado que ya se usan 5 bytes para ID, FUNCIÓN, NO DE BYTES y dos BYTES CRC, el maestro solo puede solicitar 122 bytes o 61 registros. En una solicitud de función 16, el maestro intentará escribir en su esclavo y dado que ya se usan 9 bytes para ID, FUNCIÓN, DIRECCIÓN, NO DE REGISTROS, NO DE BYTES y dos BYTES CRC, el maestro solo puede escribir 118 bytes o 59 registros . Usando el convertidor FTDI USB a Serie, el máximo de bytes que puede enviar está limitado a su búfer interno, que es de 60 bytes o 30 registros int sin firmar. Así:En una solicitud de función 3, el maestro intentará leer de su esclavo y dado que ya se usan 5 bytes para ID, FUNCIÓN, NO DE BYTES y dos BYTES CRC, el maestro solo puede solicitar 54 bytes o 27 registros. En una solicitud de función 16, el maestro intentará escribir en su esclavo y dado que ya se usan 9 bytes para ID, FUNCIÓN, DIRECCIÓN, NO DE REGISTROS, NO DE BYTES y dos BYTES CRC, el maestro solo puede escribir 50 bytes o 25 registros . Dado que se supone que usará principalmente Arduino para conectarse a un maestro sin usar un convertidor de USB a serie, el búfer interno se configura igual que el búfer de anillo de serie Arduino, que es de 128 bytes. * / // El uso de la instrucción enum permite para un método fácil de agregar y // eliminar registros. Hacerlo de esta manera le ahorra #definir el tamaño // de su matriz de registros esclavos cada vez que desee agregar más registros // y de un vistazo le informa de la distribución de sus registros esclavos ./////////// ///// registros de su esclavo ///////////////////// enum {// solo agregue o elimine registros y listo ... // El primer registro comienza en la dirección 0 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // deje este TOTAL_REGS_SIZE // número total de registros para la función 3 y 16 comparten la misma matriz de registros}; unsigned int holdingRegs [ TOTAL_REGS_SIZE]; // matriz de registros de funciones 3 y 16 //////////////////////////////////////////// ////////////////// void setup () {/ * parámetros (velocidad en baudios larga, ID de caracteres sin firmar, pin de habilitación de transmisión de caracteres sin firmar, tamaño de registros de retención int sin firmar, baja latencia de caracteres sin firmar ) El pin de habilitación de transmisión se usa en la comunicación semidúplex para activar un MAX485 o similar. Para desactivar este modo, use cualquier valor <2 porque 0 y 1 están reservados para Rx y Tx. Los retrasos de baja latencia hacen que la implementación no sea estándar, pero prácticamente funciona con todas las principales implementaciones maestras de Modbus. * / modbus_configure (9600, 1, 6, TOTAL_REGS_SIZE, 0); pinMode (ledPin, SALIDA); pinMode (buttonPin, INPUT); } void loop () {// modbus_update () es el único método usado en loop (). Devuelve el error // total desde que se inició el esclavo. No tiene que usarlo, pero es útil // para la búsqueda de fallas por parte del maestro modbus. holdingRegs [TOTAL_ERRORS] =modbus_update (holdingRegs); para (byte i =0; i <6; i ++) {holdingRegs [i] =analogRead (i); delayMicroseconds (50); } byte buttonState =digitalRead (buttonPin); // leer los estados del botón // asignar el valor buttonState al registro de retención holdingRegs [BUTTON_STATE] =buttonState; // lee el valor del registro LED_STATE y configura el LED integrado en alto o bajo con la función de 16 bytes ledState =holdingRegs [LED_STATE]; if (ledState) // establecer led {digitalWrite (ledPin, HIGH); } else if (ledState ==0) // reset led {// digitalWrite (ledPin, LOW); holdingRegs [LED_STATE] =0; }} 

Esquemas

Cableado de algunos componentes de prueba al Arduino

Proceso de manufactura

  1. C# Queue con ejemplos:¿Qué es C# Queue y cómo usarlo?
  2. Atenuación de luces con PWM usando el botón pulsador
  3. Juego de giroscopio Arduino con MPU-6050
  4. Unopad - Controlador MIDI Arduino con Ableton
  5. Sensor de obstáculos simple con Arduino
  6. Encuéntrame
  7. Joystick de Arduino
  8. ¡¿Qué tan fácil es usar un termistor ?!
  9. Cómo hacer música con un Arduino
  10. Cómo utilizar NMEA-0183 con Arduino
  11. Cómo hacer una apertura automática de puerta basada en Arduino