Print Page - Modbus Arduino
Print Page - Modbus Arduino
Print Page - Modbus Arduino
International => Español => Topic started 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.
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)
gracias. pero no es lo que esperaba, es que el proyecto que tengo creo que es un poco mas complejo.
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,
Hay que agregar un transceiver para convertir de UART a RS485 (supongo usas 485). Luego, hay que escribir el protocolo y accesar los registros.
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.
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.
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)
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>
/**
* 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;
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
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;
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;
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.
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