In summary, I can not get to work writing the slaves.
Reading, OK .. The Master, which received slaves shipped, (Function READ_HOLDING_REGISTERS) without problems... ; but in the other direction, no .. , Communication writing to slaves, always fails .. (function: 0x16 PRESET_MULTIPLE_REGISTERS)
IDE 1.0.2 y 1.0.3
Mega 2560
Modulo 485 de Sparfun
http://code.google.com/p/simple-modbus/http://code.google.com/p/simple-modbus/downloads/listMAESTRO
#include <SimpleModbusMaster1.h>
// led to indicate that a communication error is present
#define connection_error_led 13
//////////////////// Port information ///////////////////
#define baud 57600
#define timeout 1000
#define polling 200 // the scan rate
#define retry_count 3
// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 23
enum
{
PACKET1,
PACKET2,
// leave this last entry
TOTAL_NO_OF_PACKETS
};
// Create an array of Packets for modbus_update()
Packet packets[TOTAL_NO_OF_PACKETS];
// The data from the PLC will be stored
// in the regs array
unsigned int regs[9];
void setup()
{
Serial.begin (115200);
// read 3 registers starting at address 0
packets[PACKET1].id = 2;
packets[PACKET1].function = READ_HOLDING_REGISTERS;
packets[PACKET1].address = 0;
packets[PACKET1].no_of_registers = 3;
packets[PACKET1].register_array = regs;
// write the 2 registers to the PLC starting at address 3
packets[PACKET2].id = 2;
packets[PACKET2].function = PRESET_MULTIPLE_REGISTERS;
packets[PACKET2].address = 3;
packets[PACKET2].no_of_registers = 6;
packets[PACKET2].register_array = regs;
// P.S. the register_array entries above can be different arrays
// Initialize communication settings etc...
modbus_configure(baud, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS);
pinMode(connection_error_led, OUTPUT);
}
void loop()
{
unsigned int connection_status = modbus_update(packets);
if (connection_status != TOTAL_NO_OF_PACKETS)
{
digitalWrite(connection_error_led, HIGH);
// You could re-enable the connection by:
packets[connection_status].connection = true;
delay (50);
}
else
digitalWrite(connection_error_led, LOW);
// LO QUE LLEGA
Serial.print (regs[0]); Serial.print (" ");
Serial.print (regs[1]); Serial.print (" ");
Serial.print (regs[2]);
Serial.print (" - ");
Serial.print (packets[PACKET1].requests); Serial.print (" ");
Serial.print (packets[PACKET1].successful_requests); Serial.print (" ");
Serial.print (packets[PACKET1].incorrect_id_returned); Serial.print (" ");
Serial.print (packets[PACKET1].incorrect_function_returned); Serial.print (" ");
Serial.print (packets[PACKET1].incorrect_bytes_returned); Serial.print (" ");
Serial.print (packets[PACKET1].checksum_failed); Serial.print (" ");
Serial.print (packets[PACKET1].buffer_errors); Serial.print (" ");
Serial.print (packets[PACKET1].illegal_function); Serial.print (" ");
Serial.print (packets[PACKET1].illegal_data_address); Serial.print (" ");
Serial.print (packets[PACKET1].illegal_data_value); Serial.print (" ");
Serial.print (packets[PACKET1].misc_exceptions); Serial.print (" ");
Serial.print (packets[PACKET1].total_errors);
Serial.print (" // ");
// LO QUE ENVIO AL EXCLAVO
regs[3] = 30;
regs[4] = 40;
regs[5] = 50;
regs[6] = 60;
regs[7] = 70;
regs[8] = 80;
Serial.print (regs[3]); Serial.print (" ");
Serial.print (regs[4]); Serial.print (" ");
Serial.print (regs[5]); Serial.print (" ");
Serial.print (regs[6]); Serial.print (" ");
Serial.print (regs[7]); Serial.print (" ");
Serial.print (regs[8]);
Serial.print (" - ");
Serial.print (packets[PACKET2].requests); Serial.print (" ");
Serial.print (packets[PACKET2].successful_requests); Serial.print (" ");
Serial.print (packets[PACKET2].incorrect_id_returned); Serial.print (" ");
Serial.print (packets[PACKET2].incorrect_function_returned); Serial.print (" ");
Serial.print (packets[PACKET2].incorrect_bytes_returned); Serial.print (" ");
Serial.print (packets[PACKET2].checksum_failed); Serial.print (" ");
Serial.print (packets[PACKET2].buffer_errors); Serial.print (" ");
Serial.print (packets[PACKET2].illegal_function); Serial.print (" ");
Serial.print (packets[PACKET2].illegal_data_address); Serial.print (" ");
Serial.print (packets[PACKET2].illegal_data_value); Serial.print (" ");
Serial.print (packets[PACKET2].misc_exceptions); Serial.print (" ");
Serial.print (packets[PACKET2].total_errors); Serial.println (" ");
delay (100);
}
ESCLAVO
#include <SimpleModbusSlave1.h>
//////////////// registers of your slave ///////////////////
enum
{
// just add or remove registers and your good to go...
// The first register starts at address 0
OUT1,
OUT2,
OUT3,
REC1,
REC2,
REC3,
REC4,
REC5,
REC6,
TOTAL_ERRORS,
// leave this one
TOTAL_REGS_SIZE
// total number of registers for function 3 and 16 share the same register array
};
unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array
////////////////////////////////////////////////////////////
void setup()
{
Serial.begin (115200);
/* parameters(long baudrate,
unsigned char ID,
unsigned char transmit enable pin,
unsigned int holding registers size)
The transmit enable pin is used in half duplex communication to activate a MAX485 or similar
to deactivate this mode use any value < 2 because 0 & 1 is reserved for Rx & Tx
*/
modbus_configure(57600, 2, 23, TOTAL_REGS_SIZE);
}
void loop()
{
holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
for (byte i = 0; i < 3; i++)
{
holdingRegs[i] = analogRead(i+8);
delayMicroseconds(500);
}
// LO QUE ENVIA EL EXCLAVO
Serial.print (holdingRegs[OUT1]); Serial.print (" ");
Serial.print (holdingRegs[OUT2]); Serial.print (" ");
Serial.print (holdingRegs[OUT3]);
Serial.print (" // ");
// RECIBE EL EXCLAVO
Serial.print (holdingRegs[REC1]); Serial.print (" ");
Serial.print (holdingRegs[REC2]); Serial.print (" ");
Serial.print (holdingRegs[REC3]); Serial.print (" ");
Serial.print (holdingRegs[REC4]); Serial.print (" ");
Serial.print (holdingRegs[REC5]); Serial.print (" ");
Serial.print (holdingRegs[REC6]);
Serial.print (" - ");
Serial.println (holdingRegs[TOTAL_ERRORS]);
delay (100);
}
The lib in the sketch, are edited to work with the serial 1
Any suggestions of what could be the mistake I'm making?
thank you very much
Greetings