Está en la página 1de 3

Arduino Forum

International => Español => Topic started by: jesussancel on May 17, 2014, 08:14 pm

Title: modbus arduino


Post by: jesussancel on May 17, 2014, 08:14 pm

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.

Title: Re: modbus arduino


Post by: surbyte on May 17, 2014, 09:21 pm

Look here

http://excontrol.es/Arduino-Domotica-Foro/showthread.php?tid=430&highlight=Conmutadores+y+pulsadores+en+red+Modbus (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 (https://sites.google.com/site/jpmzometa/arduino-mbrt/arduino-modbus-master)

Title: Re: modbus arduino


Post by: jesussancel on May 29, 2014, 06:27 pm

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

Title: Re: modbus arduino


Post by: Jose_76 on May 30, 2014, 04:03 pm

¿Qué es exactamente lo que necesitas?

Title: Re: modbus arduino


Post by: jesussancel on Jun 10, 2014, 07:12 pm

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.

Title: Re: modbus arduino


Post by: freestyler on Jun 11, 2014, 12:16 am

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.

Title: Re: modbus arduino


Post by: CarlosAEstrada on Jun 11, 2014, 02:33 am

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: https://www.youtube.com/watch?v=PEO0T7_caKo (https://www.youtube.com/watch?v=PEO0T7_caKo)


https://www.youtube.com/watch?v=daCkK-Rvztc (https://www.youtube.com/watch?v=daCkK-Rvztc)
https://www.youtube.com/watch?v=lNaqGMZJnWs (https://www.youtube.com/watch?v=lNaqGMZJnWs)

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...

Title: Re: modbus arduino


Post by: jesussancel on Aug 09, 2014, 03:28 am

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.

Title: Re: modbus arduino


Post by: surbyte on Aug 13, 2014, 08:38 pm

La librería ModbusRTU master que es la que necesitas esta hecha.


http://playground.arduino.cc/Code/ModbusMaster (http://playground.arduino.cc/Code/ModbusMaster)

otra aquí
http://arduino-experience.blogspot.com.es/2014/01/modbus-master-slave-library.html (http://arduino-experience.blogspot.com.es/2014/01/modbus-master-slave-library.html)
y el código aquí
https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino (https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino)

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.

Title: Re: modbus arduino


Post by: simulamur on Nov 05, 2015, 12:40 pm

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:

Code: [Select]
/**
* 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.

Title: Re: modbus arduino


Post by: alpeal on Feb 12, 2016, 12:36 pm

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

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

muchas gracias.

Title: Re: modbus arduino


Post by: SG1001 on Sep 30, 2016, 03:29 pm

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

SMF 2.1 Beta 1 © 2014, Simple Machines

También podría gustarte