Cómo usar Modbus con Arduino © GPL3+

 

Cómo usar Modbus con Arduino

Cómo usar Modbus con Arduino © GPL3+

Esclavo Modbus DIY con Arduino UNO y RS485 Shield.

 

Componentes y Suministros

Ph a000066 iso (1) ztbmubhmho
Arduino UNO
× 1
Escudo profesional RS422 / RS485 para Arduino
× 1
Convertidor USB a RS485
× 1
12002 04
Protoboard (genérico)
× 1
09590 01
LED (genérico)
× 1
Mfr 25frf52 10k sml
resistencia de 10k ohmios
× 1
Fabricante 25fbf52 221r ​​​​pequeño
Resistencia 221 ohmios
× 1
11026 02
Alambres de unión (genérico)
× 1
Omron b3f 1000 imagen 75px
Interruptor de botón pulsador SparkFun de 12 mm
× 1

Aplicaciones y servicios en línea

idea web
IDE de Arduino
probador modbus

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 requiere una interfaz RS485. Nuestro Blindaje RS422 / RS485 es un escudo de comunicación serial completamente aislado galvánicamente diseñado para ser utilizado 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 con un Arduino UNO un dispositivo esclavo Modbus simple. Usaremos una PC como maestro Modbus.

herramientas y materiales

  • Arduino UNO
  • Escudo RS485 para Arduino
  • No importa cual Adaptador RS485-USB para conexión a PC (o un menos caro)

Opcional:

  • tabla para cortar pan
  • Pulsador
  • LED rojo
  • resistencia de 220 ohmios
  • Resistencia 10k
  • Alambres de unión

software

  • IDE de Arduino
  • probador modbus

Cableado RS485:

 

El cableado es muy simple. Solo debe conectar 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 largas distancias, se recomienda utilizar pares trenzados para A y B.

Cableado 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 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 imagen a continuación.

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 activar o desactivar la resistencia de terminación. Gire la resistencia a la posición ON solo si el blindaje está en un extremo de la línea del bus. En todos los demás casos, deshabilite la resistencia de terminación:

 

Configuración de puentes:

Puedes encontrar 3 áreas diferentes para ciclistas en el escudo. Muy importante es el puente 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, coloque los puentes para los puertos de comunicación en la esquina superior izquierda como en la imagen de arriba. El UART interno en los puertos 0 y 1 se conectará en este caso a la interfaz RS485 del escudo.

Finalmente, debemos configurar el puente para el puerto de control RX/TX. No usamos este puente, porque está configurada la conmutación automática RX/TX.

 

Instale el software del probador Modbus en la PC:

En este ejemplo, utilizaremos la PC como maestro Modbus. Necesitas descargar Modbustester. Descomprima el archivo zip en un nuevo directorio de su disco duro. Abra el software y edite los campos marcados como en la imagen de abajo. Debe conectar el adaptador USB-RS485 antes. Elija el puerto COM correcto para este adaptador en el probador modbus.

 

Programa Arduino:

Cargue el firmware en el IDE de Arduino para compilarlo y programarlo.

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 los valores de los puertos ADC.

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

codificado

Ejemplo de código para Arduino UNOarduino
/*
 *  Test program for Arduino RS422/RS485 Shield 
 *  Version 1.0
 *  Copyright (C) 2018  Hartmut Wendt  www.zihatec.de
 *  
 *  (based on sources of https://github.com/angeloc/simplemodbusng)
 *  
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/  

#include <SimpleModbusSlave.h>

#define  ledPin  12 // onboard led 
#define  buttonPin  7 // push button



/* This example code has 9 holding registers. 6 analogue inputs, 1 button, 1 digital output
   and 1 register to indicate errors encountered since started.
   Function 5 (write single coil) is not implemented so I'm using a whole register
   and function 16 to set the onboard Led on the Atmega328P.
   
   The modbus_update() method updates the holdingRegs register array and checks communication.

   Note:  
   The Arduino serial ring buffer is 128 bytes or 64 registers.
   Most of the time you will connect the arduino to a master via serial
   using a MAX485 or similar.
 
   In a function 3 request the master will attempt to read from your
   slave and since 5 bytes is already used for ID, FUNCTION, NO OF BYTES
   and two BYTES CRC the master can only request 122 bytes or 61 registers.
 
   In a function 16 request the master will attempt to write to your 
   slave and since a 9 bytes is already used for ID, FUNCTION, ADDRESS, 
   NO OF REGISTERS, NO OF BYTES and two BYTES CRC the master can only write
   118 bytes or 59 registers.
 
   Using the FTDI USB to Serial converter the maximum bytes you can send is limited 
   to its internal buffer which is 60 bytes or 30 unsigned int registers. 
 
   Thus:
 
   In a function 3 request the master will attempt to read from your
   slave and since 5 bytes is already used for ID, FUNCTION, NO OF BYTES
   and two BYTES CRC the master can only request 54 bytes or 27 registers.
 
   In a function 16 request the master will attempt to write to your 
   slave and since a 9 bytes is already used for ID, FUNCTION, ADDRESS, 
   NO OF REGISTERS, NO OF BYTES and two BYTES CRC the master can only write
   50 bytes or 25 registers.
 
   Since it is assumed that you will mostly use the Arduino to connect to a 
   master without using a USB to Serial converter the internal buffer is set
   the same as the Arduino Serial ring buffer which is 128 bytes.
*/
 

// Using the enum instruction allows for an easy method for adding and 
// removing registers. Doing it this way saves you #defining the size 
// of your slaves register array each time you want to add more registers
// and at a glimpse informs you of your slaves register layout.

//////////////// registers of your slave ///////////////////
enum 
{     
  // just add or remove registers and your good to go...
  // The first register starts at address 0
  ADC0,     
  ADC1,        
  ADC2,
  ADC3,
  ADC4,
  ADC5,  
  LED_STATE,
  BUTTON_STATE,
  TOTAL_ERRORS,
  // leave this one
  TOTAL_REGS_SIZE 
  // total number of registers for function 3 and 16 share the same register array
};

unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array
////////////////////////////////////////////////////////////

void setup()
{
  /* parameters(long baudrate, 
                unsigned char ID, 
                unsigned char transmit enable pin, 
                unsigned int holding registers size,
                unsigned char low latency)
                
     The transmit enable pin is used in half duplex communication to activate a MAX485 or similar
     to deactivate this mode use any value < 2 because 0 & 1 is reserved for Rx & Tx.
     Low latency delays makes the implementation non-standard
     but practically it works with all major modbus master implementations.
  */
  
  modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
   
}

void loop()
{
  // modbus_update() is the only method used in loop(). It returns the total error
  // count since the slave started. You don't have to use it but it's useful
  // for fault finding by the modbus master.
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
  for (byte i = 0; i < 6; i++)
  {
    holdingRegs[i] = analogRead(i);
    delayMicroseconds(50);	     
  }
  
  byte buttonState = digitalRead(buttonPin); // read button states
  
  // assign the buttonState value to the holding register
  holdingRegs[BUTTON_STATE] = buttonState; 
  
  // read the LED_STATE register value and set the onboard LED high or low with function 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;
  }
  
}

diagramas

cableado arduino
Descargar
Cableado de algunos componentes de prueba al Arduino
Ejemplo de cableado 6le6zxarqz

Fuente Arduino.cc