Buenas noches amigos, necesito ayuda en cuanto a la comunicación entre un Arduino y un módulo PID.
Me explico, quiero poder comunicar un módulo PID(TRS Fieldbus - http://www.trs-fieldbus.com/Support/Download/Docs/Fox-Series/BusCoupler/TRS-V-BA-GB-0088.pdf) y un Arduino Mega, tengo problemas ya que el módulo PID trabaja con una interface Profibus mediante un conector DB9, con la cual nunca he tenido la oportunidad de trabajar, y tengo dudas sobre como poner a hablar a estos dos equipos ya que la hoja de especificaciones del PID tiene información muy vaga en cuanto a la comunicación.
He estado investigando y sobre como realizar esta comunicación pero no he encontrado mayor información, he leído sobre circuitos de acople del RS-485 pero no estoy seguro si es necesario implementar dicho circuito en este caso ni de que manera se conectaría el Arduino al db9.
Si alguien me pudiera guiar un poco en este tema se lo agradecería mucho.
Profibus es un protocolo bajo los mismos criterios electriocs que Modbus, o sea usando RS485 asi que aunque no es tarea fácil, puedes escribir tu propia librería porque no hay mucha información.
Solo algunas cosas que puedan servirte Design of an Arduino based low-cost error generator for PROFIBUS DP
Hola, disculpen que tarde en responder, siguiendo el consejo de otra persona he implementado un circuito para el estándar RS-485 usando un MAX485 guiándome de otro tópico de este foro en inglés, de la siguiente manera:
Conectando las salidas A y B de dicho circuito al módulo PID antes mencionado.
Ahora la idea es mantener una comunicación half-duplex entre el Arduino y el módulo PID, de manera de estar constantemente leyendo los datos enviados por el PID y cambiar a modo de envio el MAX485 colocando en LOW los pines RE y DE solo cuando vaya a enviar datos al módulo.
Ahora para el código, según entiendo en la hoja de información técnica del fabricante (TRS Fieldbus - PBX 21 AXIS ) se dice que este se comunica mediante una interface de 6 bytes donde el primer byte es de Control o Status según se esté enviando o recibiendo información respectivamente, el segundo un byte de dirección y los otros 4 son bytes de información, por lo cual intenté enviar una trama de 6 bytes similar a la que comenta el fabricante mediante el siguiente código:
const int ledPin = 13;
const int ControlPin = 3; // HIGH:TX y LOW:RX
byte StatusTX = 0b00100000;
byte AdressTX = 0b00000001;
byte Dato1TX = 0b00000000;
byte Dato2TX = 0b00000000;
byte Dato3TX = 0b00000000;
byte Dato4TX = 0b00000000;
byte ControlRX = 0b00000000;
byte AdressRX = 0b00000000;
byte Dato1RX = 0b00000000;
byte Dato2RX = 0b00000000;
byte Dato3RX = 0b00000000;
byte Dato4RX = 0b00000000;
void setup()
{
Serial.begin(9600);
//Serial.setTimeout(100); //establecemos un tiempo de espera de 100ms
// inicializamos los pines
pinMode(ControlPin, OUTPUT);
digitalWrite(ControlPin, HIGH); //RS485 como Transmisor
// se envia la trama
Serial.print(StatusTX);
Serial.print(AdressTX);
Serial.print(Dato1TX);
Serial.print(Dato2TX);
Serial.print(Dato3TX);
Serial.print(Dato4TX);
}
void loop()
{
while(Serial.available())
{
digitalWrite(ControlPin, LOW); // RS485 como receptor
ControlRX = Serial.read();
AdressRX = Serial.read();
Dato1RX = Serial.read();
Dato2RX = Serial.read();
Dato3RX = Serial.read();
Dato4RX = Serial.read();
if(ControlPin, LOW)
{
digitalWrite(ledPin, HIGH); //enciende el led
}
}
}
Según la hoja del fabricante antes de recibir información del módulo es necesario enviarle una primera trama con el byte de Control indicando que estoy listo para recibir su información (más específicamente en el primer bit del byte de control que se manda en 1 para escribir y en 0 para leer).
Bueno, he intentado esto y no me ha funcionado ya que solo recibo un número(3210000) que para mi no tiene mucho sentido, además que lo envía una sola vez y ya,no estoy seguro si es mi manera de enviar y recibir la trama (creo que el problema está allí).
Vaya no me di cuenta que el código que te sugerí esta en Python.
Pero como siempre digo el que busca encuentra.
Google Profibus C library, muchas opciones algunas para WinXP o NT (viejas pero muy completas y el código sirve solo que es complejo).
Algo mas de nuestro estilo es esto en alemán, traductor Google por medio a Inglés y suena coherente http://www.mikrocontroller.net/topic/106174
Hay dos códigos, uno en C y su header.
Estan hechos para MPS430 de Texas Instrument.
Pero tienes algo con que trabajar y retirando las cuestiones específicas del MPS430 y del C en que fue programado deberías poder hacerlo funcionar.
Tiene mucha programación en bajo nivel al estilo AVR (ATMEGA) pero se puede convertir
Adjunto los archivos