"'#include <ModbusMaster.h>
/*!
We're using a MAX485-compatible RS485 Transceiver.
Rx/Tx is hooked up to the hardware serial port at 'Serial'.
The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE 13
#define MAX485_RE_NEG 12
#define DEBUGON 1
// Transmission delay between modbus calls
#define XMITDELAY 1000
// 0 for 0-based, 1 for 1-based numbering
#define BASED_NUMBERING 1
// instantiate ModbusMaster object
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// Modbus communication runs at 115200 baud
Serial.begin(9600);
Serial2.begin(9600);
// Modbus slave ID 1
node.begin(1, Serial2);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
bool state = true;
void loop()
{
uint16_t data[50];
Serial.println("Data Register of 143: ");
getHoldingRegisterData( 0143,2,data);
Serial.println();
delay(1000);
Serial.println("Data Register of 177: ");
getHoldingRegisterData( 27,10,data);
Serial.println();
node.clearResponseBuffer();
node.clearTransmitBuffer();
Serial2.flush();
Serial.flush();
}
bool getHoldingRegisterData(uint16_t registerAddress, uint16_t regSize, uint16_t* data){
uint8_t j, result, test;
if(DEBUGON){
/*Serial.print(F("Reading register: "));
Serial.print(registerAddress);
Serial.print(F(" regSize: "));
Serial.print(regSize);
Serial.print(F(" sizeof(data): "));
Serial.print(sizeof(&data));
Serial.print(F(" XMITDELAY: "));
Serial.println(XMITDELAY);
Serial.println(""); */
}
// Delay and get register data.
//result = node.readInputRegisters(registerAddress-BASED_NUMBERING, regSize);
result = node.readHoldingRegisters(0x08F, 5);
Serial.print("Result is time 1: ");
Serial.println(result);
delay(XMITDELAY);
// LT is sleeping, ping it a couple more times.
if (result == node.ku8MBSuccess) {
if(DEBUGON){
Serial.print(F("LT: Success, Received data: "));
}
for (j = 0; j < regSize; j++) {
data[j] = node.getResponseBuffer(j);
if(DEBUGON){
Serial.print(data[j], HEX);
Serial.print(F(" "));
}
}
if(DEBUGON){
Serial.println("");
}
node.clearResponseBuffer();
node.clearTransmitBuffer();
return true;
}
if(result ==node.ku8MBResponseTimedOut){
if(DEBUGON){
Serial.println(F("LT: Response timed out. Trying again. "));
}
int i =0;
while(i < 50){
result = node.readInputRegisters(registerAddress-BASED_NUMBERING, regSize);
Serial.print("Result is time 2: ");
Serial.println(result);
delay(XMITDELAY);
if(result == node.ku8MBResponseTimedOut){
if(DEBUGON) Serial.println(F("LT: Failed. Response timed out. Adjust the XMITDELAY and/or ku8MBResponseTimeout? "));
}
else break;
i++;
}
}
else{
if(DEBUGON){
Serial.print(F("Failed, Response Code: "));
Serial.println(result, HEX);
}
}
node.clearResponseBuffer();
node.clearTransmitBuffer();
return false;
} '''
My project is regarding to read the (Voltage,Load,Current )and so on..By using Multifunction meter connected with RS-485 through Arduino mega2560p.If anyone has worked on something like this, i would require you to help me.
I have facing issues in the above code can anybody help me through it. and please ensure that the above program is Right or not.'''