Muy recomendable una lectura a las normas del foro.
Muchas Gracias a todos,
Despues de mucho tiempo de leer los blogs , encontre la solucion.
Todos los modulos RS485 son HalfDuplex, y los Controladores de presión que yo queria usar era FullDuplex, (Gracias "Surbyte"!) y era por esto que ninguna libreria me funcionaba.
Al final en un blog encontre una solución muy sencilla para convertertir el FulDuplex de el controlador a HalfDuplex, y asi poder usar las librerias de arduino.
Conexion entre el Controlador y Arduino (Probado con Nano y Mega2560)
RS485 half full
D+ -----.---------------RX+
|
D- --.------------------RX-
| |
| | 100R
| -////------TX+
-----/////-----TX-
y ahora el código....
#include <SimpleModbusMasterSoftwareSerial.h>
#include <SoftwareSerial.h>
#define baud 9600
#define timeout 1000
#define polling 10 // the scan rate
#define retry_count 10
int SSerialRX =11 ;// RO //RS485 Receive pin
int SSerialTX=10; // DI //RS485 Transmit pin
int SSerialTxControl=5; // DE //RS485 Direction pin
int GroundRE=6 ; // RE
SoftwareSerial RS485Serial(SSerialRX, SSerialTX);
enum
{
//PACKET1,
PACKET2,
//PACKET3,
//PACKET4,
//PACKET5,
//PACKET6,
//PACKET7,
//PACKET8,
//PACKET9,
//PACKET10,
//PACKET11,
//PACKET12,
//PACKET13,
//PACKET14,
//PACKET15,
//PACKET16,
//PACKET17,
//PACKET18,
//PACKET19,
//PACKET20,
//PACKET21,
//PACKET22,
//PACKET23,
//PACKET24,
//PACKET25,
//PACKET26,
//PACKET27,
//PACKET28,
//PACKET29,
//PACKET30,
//PACKET31,
//PACKET32,
//PACKET33,
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
#define TOTAL_NO_OF_REGISTERS 5
unsigned int regs[TOTAL_NO_OF_REGISTERS];
void setup()
{
Serial.begin(9600);
pinMode(SSerialTxControl, OUTPUT);
pinMode(GroundRE, OUTPUT);
digitalWrite(GroundRE,LOW);
modbus_construct(&packets[PACKET2], 1, READ_HOLDING_REGISTERS, 8017, 5, 0);
modbus_configure(&RS485Serial, baud, SERIAL_8N1, timeout, polling, retry_count, SSerialTxControl, packets, TOTAL_NO_OF_PACKETS, regs);
}
void loop()
{
modbus_update();
delay(2000);
Serial.println(regs[0],DEC);
Serial.println(regs[1],DEC);
Serial.println(regs[2],DEC);
Serial.println(regs[3],DEC);
Serial.println(regs[4],DEC);
Serial.print("Request: ");
Serial.println(packets[PACKET2].requests);
Serial.print("Susesfull Request: ");
Serial.println(packets[PACKET2].successful_requests);
Serial.print("Fail Request: ");
Serial.println(packets[PACKET2].failed_requests);
delay(599);
}
Espero que esto le sirva a alguien Saludos desde Argentina.
!!
Hola todos,
He estado leyendo sobre lo tratado en este foro y aun no encuentro respuestas claras a lo que yo pretendo.
Quisiera implementar ARDUINO UNO como maestro para enviar una pregunta a un esclavo y almacenar la respuesta...
Esto debo hacerlo mediante modbus RTU y puerto RS485 ya que es lo que tiene disponible el esclavo.
Si alguien puede explicarme como usar la libreria para enviar la pregunta (01 03 0026 0001 65C1, hex) por medio de rs485 seria de muchisima ayuda...
Dispongo de Arduino UNO, modulo con MAX485 y modulo para SD
Graaaacias!
Hola a todos!..
Amigo jd_castano.
Al igual que tu he estado leyendo en todo el foro respecto a este tema de la comunicacion Modbus.
Yo estoy trabajando en establecer conexion y efectuar la lectura de un registro para despues la respuesta ser almacenada.
estoy trabajando con medidor de agua electromagnetico con comunicacion modbus con bus RS485
mi proposito es realizar la lectura del registro donde contiene la medicion acumulada por el medidor y guardar en una variable para posteriormente mostrarla en terminar de arduino IDE
la peticion es para el medidor
Direccion: 1
Funcion: 03 read holding
Registro: 0024
Numero de bits: 2
de esta manera quedaria la construccion de paquete 1
modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 0024, 1, 0);
para mostrarlo aun sin exito quisiera la ayuda de alguien del foro para mostar en terminal
dejo el codigo completo para alguna observacion
#include <SimpleModbusMaster.h>
//////////////////// Port information ///////////////////
#define baud 9600
#define timeout 1000
#define polling 1000 // the scan rate
#define retry_count 10
// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 2
#define LED 13
// 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()
{
Serial.begin(9600);
// Initialize each packet
modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 0024, 0, 0);
//modbus_construct(&packets[PACKET2], 1, PRESET_MULTIPLE_REGISTERS, 1, 1, 0);
// Initialize the Modbus Finite State Machine
modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
pinMode(LED, OUTPUT);
}
unsigned long dato;
void loop()
{
modbus_update();
unsigned long dato;
float lectura;
dato= regs[0] << 16 | regs[1];
lectura = regs[0];
Serial.println("lectura");
Serial.println(lectura, DEC);
delay (1000);
}
adjunto imagen de conexion para comunicacion usando MAX485 con arduino UNO
imagen de monitor serial.
Gracias espero alguna ayuda de su parte
he probado ese codigo que pones pero no arroja un error: que la funcion modbus_constructor no ha sido declarada....
Aun estoy intentando realizar la comunicación si tienes información para compartir me seria de gran ayuda!
Gracias
Hola todos,,,, Ya estoy terminando mi proyecto por ultimo solo me falta colocar un mensaje en caso de que la comunicación falle... pero no se que función de la librería me ayuda a verificar que la conexión se encuentra establecida,,, si alguien me puede colaborar con esto se lo agradezco....
Gracias!!
Que pasó con canovas43 y surbyte ?? llegaron a algo? saludos!
Yo si, pero los que consultaban acá también o no lo has visto?

