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

Domina Modbus en Arduino: Guía Paso a Paso

Componentes y suministros

Arduino UNO 1
Shield RS422/RS485 profesional para Arduino 1
Convertidor USB a RS485 1
Protoboard (genérica) 1
LED (genérico) 1
Resistencia 10k ohm 1
Resistencia 221 ohm 1
Cables jumper (genéricos) 1
Pulsador SparkFun 12mm 1

Aplicaciones y servicios online

Sobre este proyecto

Modbus, un estándar de comunicación serie, se ha convertido en un protocolo de facto para conectar dispositivos electrónicos industriales. En Modbus RTU y 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 Shield RS422/RS485 es un shield de comunicación serie completamente aislado galvánicamente, diseñado para Arduino UNO y otras placas compatibles como Arduino 101, STM Nucleo, etc. Este shield es la opció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

Opcional

Software

Cableado RS485

El cableado es muy simple. Solo hay que conectar los terminales A y B del shield con las líneas A y B del sistema Modbus. Los terminales Y y Z no se usan para este tipo de aplicación. Para largas distancias se recomienda usar pares trenzados para A y B.

Cableado Arduino (Opcional)

Se recomienda añadir un LED y un pulsador al Arduino para visualizar algunos efectos de la comunicación Modbus. Es opcional y no estrictamente necesario.

Configuración de interruptores DIP

El Shield RS422/RS485 viene con 3 bancos de interruptores DIP. Debe configurarlos para Modbus como se muestra a continuación:

*Dependiendo de la posición del Shield RS422/RS485 en la línea Modbus, debe activar o desactivar la resistencia de terminación. Active la resistencia en posición ON solo si el Shield está en un extremo de la línea de bus. En todos los demás casos, desactive la resistencia de terminación (OFF).

Configuración de jumpers

En el shield hay 3 áreas de jumpers diferentes. El jumper JP1 para la tensión de alimentación es muy importante. El Arduino UNO funciona internamente a 5V. Debe configurar este jumper en la posición 5V (para placas de 3.3V como Arduino 101, en la posición 3.3V).

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

Por último, configure el jumper para el puerto de control RX/TX. No usamos este jumper porque está configurado el cambio automático RX/TX.

Instalar software Modbus Tester en PC

En este ejemplo usaremos la PC como maestro Modbus. Debe descargar Modbustester. Descomprima el archivo zip en un nuevo directorio en su disco duro. Abra el software y cambie los campos marcados como en la imagen. Debe conectar el adaptador USB-RS485 antes. Seleccione el puerto COM correcto para este adaptador en Modbustester.

Software Arduino

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

Pruebe su trabajo

Ahora es hora de probar su 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 encontrará el estado del pulsador. Las direcciones 400001 - 400006 contienen los valores de los puertos ADC.

Con el botón Escribir 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 ejemplo para Arduino UNO

/* 
 * 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
 * bajo 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.
 */

#include <SimpleModbusSlave.h>

#define ledPin 12 // LED integrado
#define buttonPin 7 // Pulsador

/* Este código de ejemplo tiene 9 registros de retención.
 * 6 entradas analógicas, 1 pulsador, 1 salida digital y 1 registro para indicar errores.
 * La función 5 (escribir bobina simple) no está implementada, así que uso un registro completo
 * y la función 16 para establecer el LED integrado en el Atmega328P.
 * El método modbus_update() actualiza el array holdingRegs y verifica la comunicación.
 */

// Usando enum para facilitar la adición/eliminación de registros
enum {
  ADC0, ADC1, ADC2, ADC3, ADC4, ADC5,
  LED_STATE, BUTTON_STATE, TOTAL_ERRORS,
  TOTAL_REGS_SIZE // total de registros para funciones 3 y 16
};

unsigned int holdingRegs[TOTAL_REGS_SIZE]; // array de registros para funciones 3 y 16

void setup() {
  /* Parámetros: (baudrate, ID, pin habilitación transmisión, tamaño registros, baja latencia)
   * El pin de habilitación de transmisión se usa en comunicación half-duplex
   * 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.
   */
  modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // modbus_update() es el único método usado en loop(). Retorna el total de errores.
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
  
  for (byte i = 0; i < 6; i++) {
    holdingRegs[i] = analogRead(i);
    delayMicroseconds(50);
  }
  
  byte buttonState = digitalRead(buttonPin);
  holdingRegs[BUTTON_STATE] = buttonState;
  
  byte ledState = holdingRegs[LED_STATE];
  if (ledState) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
    holdingRegs[LED_STATE] = 0;
  }
}

Proceso de manufactura

  1. Control de Brillo LED con PWM mediante Pulsador en Arduino Mega
  2. Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
  3. Unopad: Controlador MIDI Arduino para Ableton Live sin complicaciones
  4. Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
  5. Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
  6. Construye un volante joystick personalizado con Arduino para gaming
  7. Uso Fácil de Termistor: Guía Paso a Paso con Arduino
  8. Genera Tonos Musicales con Arduino: Guía Paso a Paso
  9. Conexión de Arduino a NMEA‑0183: Guía Paso a Paso
  10. Puerta automática con Arduino y sensor ultrasónico HC-SR04
  11. Dominando Queues en C#: Enqueue, Dequeue y Operaciones Primero-En-Entrar-Primero-En-Salir Explicadas