Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: [1] 2   Go Down
Author Topic: modbus RS-232 and arduino  (Read 6542 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas tardes a todos,

Soy nuevo en este tema de arduino y la verdad es que no sé muy bien como va eso, o sea que perdonad si digo algo que no tiene sentido.

Me explico tengo un sensor de voltaje que funciona con protocolo RS232 (DB9), y según lo que he podido ver, utiliza los pins RX, TX, RTS y CTS (si solo pincho el RX y TX con el pc no se comunica). La idea es que el sensor vaya conectado a la placa arduino mega y esta luego al PC(mediante USB).

Mi problema es que he estado buscando como implementar el protocolo modbus RS232 en arduino, utilizando RX, TX, RTS y CTS, y no he sabido encontrar nada.

Hay podría guiarme un poco y sabría decirme, primeramente si es posible, y donde podría encontrar información?

Muchas gracias.

Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aqui lo tienes implementado:
http://sites.google.com/site/jpmzometa/arduino-mbrt

aunque para conectarlo al Arduino y que solo haga de interfaz con el PC, haz el modbus en el PC y te ahorras el Arduino.

Un saludo
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias Chiva

voy a ver si entiendo como funciona, que esto ya es otro tema...

La idea que tengo, es que dicho sensor lo que hace es enviar datos continuamente por un puerto DB9 (según las especificaciones del sensor tiene implementado el RS 232)  tenga o no tenga el pc encendido. quería utilizar el arduino, para que junto al modulo SD recoja todas las medidas del sensor y las guarde en la SD, y cuando yo conecte el PC, cada 15, 20 días  o lo que sea pueda descargar todos los datos almacenados en la SD o simplemente extraer la SD y insertar la tarjeta en el PC (lo mas probable es que los datos los tenga en un archivo .csv)

En resumen, que creo que me he liado un poco, el arduino cada x tiempo tiempo debe enviar petición de datos, y que el sensor responda. los datos que envíe el sensor guardarlos en la SD.


Solo una pregunta mas, disculpa, el tema conexionado, puedo usar cualquier pin (siempre y cuando lo defina antes) incluso para RTS Y CTS?

muchas gracias, que complicado que es iniciarse en este mundillo cuando no tienes ni idea.

Saludos!!!!
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Parece que el de la página anterior ha hecho una librería para el Arduino:
http://code.google.com/p/modbusmaster/

Una cosa muy importante es si tienes la documentación del cacharillo, ya que necesitarás el número de esclavo, o igual se puede configurar, no se, además de saber qué te va a responder y de que forma.

Un saludo
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Toda esta información la tengo, que envía que se le debe enviar, como, etc, etc,. el problema que veo es que en el link que me has pasado utiliza, a parte de arduino un maxim488EPA, o sea que hacer la comunicación directamente no debe poderse hacer.... bufffffffffffffff...
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eso es sólo para hacer la comunicación por RS485, si tu la vas a hacer por RS232 no te hace falta
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

RTS y CTS son dos lineas para decirle al dispositivo que estas listo para recibir (por ejemplo, es una forma de que no llenes el buffer de recepcion porque no te esta dando tiempo a procesar la informacion recibida = CONTROL DE FLUJO HARDWARE).

RTS => Request To Send.
CTS => Clear To Send.

Es decir, tu protocolo Modbus es por RS232 (tx y rx), las otras dos lineas son de control.

Saludos   smiley-wink


Igor R.
« Last Edit: June 29, 2010, 11:43:37 am by igorreal » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hola chivas, hola Igor,

chivas, referente a que con el RS232 no necesito el hardware RS485, significa que por ejemplo, usando el código que comentábamos antes, puedo usar los pins rx tx que correspondan, y como RTS y CTS dos mas cualquiera?

Igor, el problema es que no puedo hacer trabajar el sensor sin control de flujo, y si lo conecto al pc con rx y tx miro el puerto y no pasa nada por ahí, por lo contrario si pongo los RTS y CTS me envia los datos.
La verdad chicos es que lo mío es la mecánica y me han metido en un berenjenal que ni os cuento y tengo que presentar el proyecto en un mes.... eso es lo que pasa por ir de listo.

Seguiré buscando y probando, espero que no os molesto si hago alguna preguntita mas (aun que os parezca algo elemental)

PD: el dispositivo que me envia los datos es un Wi-LEM mesh node.
http://www.lem.com/hq/en/content/view/276/215/

Muchas gracias de verdad

Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues de lo del control de flujo, ni idea, teniendo en cuenta que no sé cómo funciona Modbus y el creador de las librerías tampoco ha perdido mucho tiempo en explicar los pines un poco, pues...

He usado Profibus y MPI en PLCs, pero allí es casi Plug and Play, no tienes que configurar casi nada, lo ideal sería que lo conectes a un PLC, pero eso cuesta su dinero o con uno de los adaptadores que vende la empresa, a un PC, pero lo mismo.

Ya lo siento, pero me pillas en malas fechas para ponerme a investigar.
Un saludo
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pero no veo el problema a lo de control de flujo, es simplemente usar dos pines digitales.
Si crees que te va a dar tiempo siempre de procesar los datos, simplemente pon el pin CTS del sensor a LOW (Clear to Send) y eso hara que este constantemente enviando datos.

Ejemplo de conexion (he buscado en imagenes de google para ver ponerte algo de referencia):
http://www.hw-group.com/products/sollae/image/kabel_rs232.gif
http://www.hw-group.com/products/sollae/image/port_rs232big.gif



 smiley-wink
« Last Edit: June 30, 2010, 06:05:39 am by igorreal » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

buenas Igor,

Tu crees pues, que con un RX y un TX de la placa mas, dos pins digitales cualquiera, uno como RTS(este supongo que siempre debería estar HIGH) y otro pin como CTS en LOW funcionaria?
lo probaré y te comento.

Muchas gracias, agradezco la ayuda de verdad. Os mantendré informados, aunque mis avances son lentos!

Saludos!!



Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

En un dispositivo el RTS es una salida y el CTS es una entrada. Entonces para conectar dos dispositivos entre si, ambas senyales van cruzadas.

Antes de transmitir, la rutina mira si el pin CTS esta LOW (que significa que el receptor esta preparado para recibir datos) y comienza a transmitir.

Imagina que no quieres hacer control de flujo, simplemente poniendo a nivel bajo el pin CTS de tu sensor, hara que siempre transmita. Me refiero,que podrias poner dicha senyal a LOW y simplemente conectar a tu arduino Rx y Tx (previa adaptacion de senyales con un max232 o similar en caso que sea necesario).

Otra cosa.... eres consciente que si tu sensor es RS232 tienes que adaptar senyales con tu arduino que es TTL, verdad???



Puedes probar, conectando al ordenador solo TX,RX y GND y poniendo a bajo CTS, que para ello puedes unirlo directamente al RTS del mismo puerto serie, y asi haces "truco del almendruco".
Mira esto:
http://www.zytrax.com/tech/layer_1/cables/heavy.htm





 smiley-wink



« Last Edit: July 01, 2010, 02:51:23 am by igorreal » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas Igor,

Si te tengo que ser sincero, no era consciente de que era necesario. He estado mirando y he visto que sirve para ajustar la tensión. de todas formas ya he conseguido un circuito que hace la conversión de voltaje de TTL a RS232 (similar a MAX232).

Ahora voy a mirar la web que me has enviado, me parece muy interesante el apartado en que muestra el bucle que hace entre RTS y CTS. este paso me ahorraría tener que utilizar dos salidas digitales como RTS  CTS. Es coger simplemente el db9 y hacer un puente entre los dos pins

Te agradezco mucho toda esta información, de verdad. supongo que el viernes habré podido hacer la primera prueba, ya te contaré que ha pasado!

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

El puente lo tienes que hacer en el conector parte sensor. (ya que es el sensor el que te requiere el control de flujo hardware). En el diagrama del post anteriror, lo que pone PC1 es tu sensor y PC2 es tu ordenador o Arduino.

 smiley-wink
« Last Edit: July 01, 2010, 02:53:55 am by igorreal » Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

una pregunta,

si le pongo este codigo al arduino:


#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3


SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  
}

void loop()
{
  
  Serial.println("F7 03 00 00 00 16 D0 92");
  Serial.println(Serial.read());
  delay(10000);
  
}

cada 10 segundos me envía el texto F7 03 00 00 00 16 D0 92 y luego porque cuando le envío per el puerto, "hola" por ejemplo no me devuelve "hola" y escribe 104, 111, 108.......

yo ya no entiendo nada.
me gustaría que yo le envíe a mi dispositivo el segmento F7 03 00 00 00 16 D0 92 que esta en hexadecimal y ver que responde
 :'(
Logged

Pages: [1] 2   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: