Ayuda con librería Modbus Master, conexión con PLC

Hola bro’s, primero que todo les quería dar la gracias por la gran ayuda que siempre nos dan a los nuevitos en esto,

tengo una duda con la librería Modbus Master no se utilizarla bien, anteriormente logré con la ayuda de ustedes comunicar un PLC Mitsubishi de la serie FX con un Arduino UNO y MEGA, en ese entonces el PLC era Maestro y el Arduino era Esclavo, todo funciono perfecto. Ahora quisiera cambiar los papeles y dejar al Arduino de Maestro y al PLC de Esclavo,

Me podrian ayudar con la libreria?, estoy utilizando la ModbusMasterV2

Otra cosa, para la conexión entre ambos estoy utilizando un conversor TTL a RS485 y los conecto de la siguiente manera

Acá les dejo la librería

#include <SimpleModbusMaster.h>

/*
   The example will use packet1 to read a register from address 0 (the adc ch0 value)
   from the arduino slave (id=1). It will then use this value to adjust the brightness
   of an led on pin 9 using PWM.
   It will then use packet2 to write a register (its own adc ch0 value) to address 1 
   on the arduino slave (id=1) adjusting the brightness of an led on pin 9 using PWM.
*/

//////////////////// Port information ///////////////////
#define baud 9600
#define timeout 1000
#define polling 200 // the scan rate
#define retry_count 10

// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 2 

#define LED 9

// The total amount of available memory on the master to store data
#define TOTAL_NO_OF_REGISTERS 1

// This is the easiest way to create new packets
// Add as many as you want. TOTAL_NO_OF_PACKETS
// is automatically updated.
enum
{
  PACKET1,
  PACKET2,
  TOTAL_NO_OF_PACKETS // leave this last entry
};

// Create an array of Packets to be configured
Packet packets[TOTAL_NO_OF_PACKETS];

// Masters register array
unsigned int regs[TOTAL_NO_OF_REGISTERS];

void setup()
{
  // Initialize each packet
  modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 0, 1, 0);
  modbus_construct(&packets[PACKET2], 1, PRESET_MULTIPLE_REGISTERS, 1, 1, 0);
  
  // Initialize the Modbus Finite State Machine
  modbus_configure(&Serial, baud, SERIAL_8N2, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
  
  pinMode(LED, OUTPUT);
}

void loop()
{
  modbus_update();
  
  regs[0] = analogRead(0); // update data to be written to arduino slave
  
  analogWrite(LED, regs[0]>>2); // constrain adc value from the arduino slave to 255
}

Hola Dieguintz!,

lo primero lamento decirte que no tengo tu solución. Yo estoy exactamente igual que tu, pero intentando leer de un PMAC-903 (un medidor de energía). Llevo dos semanas intentando comunicarme con él y no hay manera :/. He estado leyendo muchísimo y he probado las siguientes librerías:

SimpleModbus
ModbusMaster
RS485forArduino
Modbus-Master-Slave-for-Arduino-master

y alguna más creada por personas de manera altruista. Te las enlazo por si tu fueras capaz de ponerlas en marcha ;).

Estoy usando un arduino UNO y tu mismo conversor rs-485 .

Ayer me dijo una persona que lo mismo es que nuestro problema es que estamos intentando leer con el monitor serie y es posible que eso machaque el buffer en el que tenemos los datos…no sé a mi no me convenció mucho la idea, pero oye, lo mismo lleva razón.

Al menos vamos a intentar darle algo de vidilla al post ;).

Mucha suerte y ¡ánimo compañero!, ya verás como lo conseguimos.

Modbus-Master-Slave-for-Arduino-master.zip (197 KB)

RS485_for_Arduino.zip (37.2 KB)

SimpleModbusMasterV2rev2.zip (20.2 KB)

SimpleModbusMasterV12.zip (21.6 KB)

SimpleModbusMasterArduinoV2ref2-PubSubClient-OTA-miq.ino (13.8 KB)

Kunti:
Hola Dieguintz!,

lo primero lamento decirte que no tengo tu solución. Yo estoy exactamente igual que tu, pero intentando leer de un PMAC-903 (un medidor de energía). Llevo dos semanas intentando comunicarme con él y no hay manera :/. He estado leyendo muchísimo y he probado las siguientes librerías:

SimpleModbus
ModbusMaster
RS485forArduino
Modbus-Master-Slave-for-Arduino-master

y alguna más creada por personas de manera altruista. Te las enlazo por si tu fueras capaz de ponerlas en marcha ;).

Estoy usando un arduino UNO y tu mismo conversor rs-485 .

Ayer me dijo una persona que lo mismo es que nuestro problema es que estamos intentando leer con el monitor serie y es posible que eso machaque el buffer en el que tenemos los datos...no sé a mi no me convenció mucho la idea, pero oye, lo mismo lleva razón.

Al menos vamos a intentar darle algo de vidilla al post ;).

Mucha suerte y ¡ánimo compañero!, ya verás como lo conseguimos.

Gracias Kunti,
Si tengo resultados te avisaré, ya verás que nos resultará :wink:

¡Lo tengo! ^^, o al menos a mi me funciona.

Tenía dos problemas:

1.- Intervalos de tiempo.
2.- Tensiones.
3.- Problemas con el monitor serie.

Para solucionar el problema 1 he tenido que meter una pequeña librería para hacer peticiones cada segundo, cada dos segundos…lo que se quiera. Pero un mínimo de tiempo si que he necesitado. Seguramente se pueda quitar, pero yo no me atrevo xD.

Para solucionar el problema 2 he tenido que quitar los cables de GND y VCC al módulo adaptador del RS485. Eso sí, ahora para compilar y subir el código tengo que quitar los cables de los pines RX y TX y cuando ya está cargado, ponerlos.

Para solucionar el problema 3 he tenido que crearme un puerto serie nuevo en los pines 10 y 11, conectar un módulo USB y leer en un monitor serie aparte.

Te adjunto una foto de como ha quedado todo el cableado y circuitaje, así como los archivos fuente que uso.

Si necesitas cualquier cosa, no dudes en preguntármelo que te ayudo!Y si quieres mi mail personal para no llenar mucho el hilo, también te lo paso por privado ;).

SimpleTimer.zip (3.54 KB)

modbusMiercoles.zip (20.4 KB)