modbus arduino

Buenos días, mi pregunta es : si, es posible conectar arduino por medio del protocolo modbus a otro dispositivo que maneje el mismo protocolo de comunicación?. ya tengo tiempo buscando pero no encuentro nada referente a esto, solo encuentro tutoriales que manejan los arduino como maestro y esclavo.... mi proyecto es controlar mediante arduino un variador de frecuencia por medio del rs 485, de esta manera adquirir las señales que se produce en el campo de trabajo, si alguien sabe algo referente o si se puede o no. . espero me puedan ayudar, gracias de antemano.

Look here

http://excontrol.es/Arduino-Domotica-Foro/showthread.php?tid=430&highlight=Conmutadores+y+pulsadores+en+red+Modbus
or

https://sites.google.com/site/jpmzometa/arduino-mbrt/arduino-modbus-master

gracias. pero no es lo que esperaba, es que el proyecto que tengo creo que es un poco mas complejo.

¿Qué es exactamente lo que necesitas?

controlar un variador de frecuencia marca AQUAVAR CPC. cuenta con el protocolo modbus pero no se si es posible que por medio de arduino le envie los datos para cambiar los valores de el variador o por lo menos prenderlo o a pagarlo por el momento.
también quiero monitorear el sensor de presion que tiene el variador.

Jesusancel,

Así como está el arduino, no.

Hay que agregar un transceiver para convertir de UART a RS485 (supongo usas 485). Luego, hay que escribir el protocolo y accesar los registros.

Yo tengo un ejemplo que he usado por años en múltiples plataformas.

Bueno, necesitas un MAX485 o MAX483 o el venerable 74176 de Texas Instruments.

Luego, necesitas calcular las Resistencias PullUp según la hoja de datos...no te apures, con 600 ohms lo resuelves. El bus debe estar en un estado determinado según lo explican las hojas de datos de los ICs.

Siguiente paso es escribir el programa y recordar que entre cada mensaje Modbus RTU deben existir al menos un tiempo de espera de 3.5 character-time, el cual debes calcular dependiendo del baudrate seleccionado.

Arduino solo tiene UARTs, de manera que debes conectarlo al transceiver y operar las señales de control para operar el transceiver si quieres enviar y luego recibir. Supongo tu arduino es el master, de manera que lo pones a transmitir y al finalizar, cambias el bus a modo recepcion.

Te recomiendo los simuladores de ModbusRTU grátis en la red. Ahí puedes ver y probar lo que estás enviando desde el arduino y el supuesto esclavo. Este paso te ahorrará muchos dolores de cabeza.

Necesitas conocer los Registros Modbus de tú Variador. Sin eso, no podrás hacer nada vía modbus.

Luego, creas el mensaje según ModbusRTU y dependiendo si quieres leer registros o escribir sobre un registro de tu variador. Tienes que cumplir el protocolo al pie de la letra, incluyendo el CRC del mensaje.

Te recomiendo comiences leyendo

Ve esto: - YouTube
- YouTube
Variadores + PLCs + Wireless + Software + Instrumentación + Integración - YouTube

Después de todo eso, necesitarás entonces poner de acuerdo ambos lados, tanto el arduino como el Variador. No es una tarea sencilla.

Te recomiendo los tutoriales o documentos de Mr. Gannon aquí. Son muy buenos...

gracias tengo esperanza que tal vez funciones mi proyecto x), disculpa por la demora. si estoy utilizando el max 485 voy a echarle un vistazo a los enlaces y ya les cuento como me va. subiere todo el código junto con fotos para que vean de que se trata mi proyecto.

La librería ModbusRTU master que es la que necesitas esta hecha.
http://playground.arduino.cc/Code/ModbusMaster

otra aquí

y el código aquí

Asi que nada de ponerse a escribir algo que ya está hecho.
Trabajo en lo mismo. Ojo con la impedancia en los terminales. ALgunos variadores requieren que haya 120 ohms entre RX y TX del lado diferencial del MAX485 obviamente.
También algunos ponen resistencias a VCC y a GND para estabilizar los niveles de tensión a la salida de los MAX485.
Tecnicas que ayudan en ambientes ruidosos.
Asi lo tengo implementado yo con un variador DANFOSS.

Hola !,

lo siento, he leído documentación del foro, en google, pero no consigo poner en marcha/parar/cambiar frecuencia de variador OMRON MX2 a través de Arduino UNO y RS485 arduino.

En la foto se puede ver como tengo las conexiones hardware entre arduino uno y rs485 arduino.

El codigo que utilizo es el siguiente:

     /**
*  Modbus master example 1:
*  The purpose of this example is to query an array of data
*  from an external Modbus slave device. 
*  The link media can be USB or RS232.
*
*  Recommended Modbus slave: 
*  diagslave http://www.modbusdriver.com/diagslave.html
*
*  In a Linux box, run 
*  "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
* This is:
* serial port /dev/ttyUSB0 at 19200 baud 8N1
* RTU mode and address @1
*/

#include <ModbusRtu.h>

// data array for modbus network sharing
uint16_t au16data[16];
uint8_t u8state;

/**
*  Modbus object declaration
*  u8id : node id = 0 for master, = 1..247 for slave
*  u8serno : serial port (use 0 for Serial)
*  u8txenpin : 0 for RS-232 and USB-FTDI 
*               or any pin number > 1 for RS-485
*/
Modbus master(0,0,9); // this is master and RS-232 or USB-FTDI, PIN 9 PARA INDICAR QUE TRASMITO

/**
* This is an structe which contains a query to an slave device
*/
modbus_t telegram;

unsigned long u32wait;

void setup() {
master.begin( 9600 ); // baud-rate at 19200
master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
u32wait = millis() + 1000;
u8state = 0; 
}

void loop() {
switch( u8state ) {
case 0: 
  if (millis() > u32wait) u8state++; // wait state
  break;
case 1: 
  telegram.u8id = 1; // slave address
  telegram.u8fct = 5; // function code (this one is registers read)
  telegram.u16RegAdd = 0; // start address in slave
  telegram.u16CoilsNo = 2; // number of elements (coils or registers) to read
  //telegram.au16reg = au16data; // pointer to a memory array in the Arduino
 
  // PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 05 00 00 FF 00 -> START
  // 01 -> ESCLAVO (VARIADOR OMRON)
  // 05 -> ESCRIBIR EN UNA BOBINA
  //  00 00 -> DIRECCION DE LA BOBINA
  // FF 00 -> VALOR A ESCRIBIR EN LA BOBINA PARA LA PUESTA EN MARCHA
  
  telegram.au16reg[0] = 0; 
  telegram.au16reg[1] = 0;
  telegram.au16reg[2] = 0;
  telegram.au16reg[3] = 0;
  telegram.au16reg[4] = 0;
  telegram.au16reg[5] = 0;
  telegram.au16reg[6] = 0;
  telegram.au16reg[7] = 0;

  telegram.au16reg[8] = 1;
  telegram.au16reg[9] = 1;
  telegram.au16reg[10] = 1;
  telegram.au16reg[11] = 1;
  telegram.au16reg[12] = 1;
  telegram.au16reg[13] = 1;
  telegram.au16reg[14] = 1;
  telegram.au16reg[15] = 1;
  
  
  master.query( telegram ); // send query (only once)
  delay(3500);

  telegram.u8id = 1; // slave address
  telegram.u8fct = 6; // function code (this one is registers read)
  telegram.u16RegAdd = 1; // start address in slave
  telegram.u16CoilsNo = 4; // number of elements (coils or registers) to read
  //telegram.au16reg = au16data; // pointer to a memory array in the Arduino
  //telegram.au16reg = 0000000111110100;

  // PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 06 00 01 01 F4 -> CAMBIO FRECUENCIA
  // 01 -> ESCLAVO (VARIADOR OMRON)
  // 06 -> ESCRIBIR EN UN REGISTRO
  // 00 01 -> DIRECCION DEL REGISTRO
  // 01 F4 -> VALOR A ESCRIBIR EN LA BOBINA PARA LA PUESTA EN MARCHA

  telegram.au16reg[0] = 0;
  telegram.au16reg[1] = 0;
  telegram.au16reg[2] = 0;
  telegram.au16reg[3] = 0;
  telegram.au16reg[4] = 0;
  telegram.au16reg[5] = 0;
  telegram.au16reg[6] = 0;
  telegram.au16reg[7] = 1;

  telegram.au16reg[8] = 1;
  telegram.au16reg[9] = 1;
  telegram.au16reg[10] = 1;
  telegram.au16reg[11] = 1;
  telegram.au16reg[12] = 0;
  telegram.au16reg[13] = 1;
  telegram.au16reg[14] = 0;
  telegram.au16reg[15] = 0;
  
  master.query( telegram ); // send query (only once)
  delay(3500);
  telegram.u8id = 1; // slave address
  telegram.u8fct = 5; // function code (this one is registers read)
  telegram.u16RegAdd = 1; // start address in slave
  telegram.u16CoilsNo = 2; // number of elements (coils or registers) to read
  //telegram.au16reg = au16data; // pointer to a memory array in the Arduino

  // PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 05 00 00 00 00 -> STOP
  // 01 -> ESCLAVO (VARIADOR OMRON)
  // 05 -> ESCRIBIR EN UNA BOBINA
  // 00 00 -> DIRECCION DE LA BOBINA
  // 00 00 -> VALOR A ESCRIBIR EN LA BOBINA PARA STOP

  telegram.au16reg[0] = 0;
  telegram.au16reg[1] = 0;
  telegram.au16reg[2] = 0;
  telegram.au16reg[3] = 0;
  telegram.au16reg[4] = 0;
  telegram.au16reg[5] = 0;
  telegram.au16reg[6] = 0;
  telegram.au16reg[7] = 0;
  telegram.au16reg[8] = 0;
  telegram.au16reg[9] = 0;
  telegram.au16reg[10] = 0;
  telegram.au16reg[11] = 0;
  telegram.au16reg[12] = 0;
  telegram.au16reg[13] = 0;
  telegram.au16reg[14] = 0;
  telegram.au16reg[15] = 0;
  master.query( telegram ); // send query (only once)
  delay(3500);
  u8state++;
  break;
case 2:
  master.poll(); // check incoming messages
  if (master.getState() == COM_IDLE) {
    u8state = 0;
    u32wait = millis() + 100; 
  }
  break;
}
}

Muchas gracias.

Buenas a todos, yo tb estoy intentado controlar un variador. Lo habeis conseguido??

Si algún alma caritativa me hecha una mano...

muchas gracias.

Buenas,

Me gustaría recuperar este post para saber si se pudo resolver el tema de comunicar un arduino con un variador de OMRON MX2 mediante Modbus RTU.

He pensado en realizar éste proyecto y querría saber si alguno de vosotros consiguió sacar algo a delante .

Gracias