Hi EveryOne
I am trying to read energy meter (as slave) with master (ardunio uno ) ,using communication (MAX485).
I have connected PIN 9,10 as RX,TX and using PIN 7 for changing the direction.
using the following
#include <ModbusMaster.h>
define LED_13 13
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#define MAX485_DE 7
#define MAX485_RE_NEG 7
#define SSerialRX 9 //Serial Receive pin
#define SSerialTX 10 //Serial Transmit pin
#define SSerialTxControl 7
#define RS485Transmit HIGH
#define RS485Receive LOW
#define txnPinDir 7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// instantiate ModbusMaster object
ModbusMaster node;
#define Pin13LED 13
/-----( Declare objects )-----/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
lcd.clear();lcd.print("Scada System");delay(500);
//pinMode(MAX485_RE_NEG, OUTPUT);
//pinMode(MAX485_DE, OUTPUT);
pinMode(txnPinDir, OUTPUT);
digitalWrite(txnPinDir, RS485Transmit);
delay(500);digitalWrite(txnPinDir, RS485Receive);
delay(200);
// Init in receive mode
// digitalWrite(txnPinDir, RS485Transmit);
// Modbus communication runs at 115200 baud
// Serial.begin(9600);
// RS485Serial.begin(115200);
RS485Serial.begin(9600);
// Modbus slave ID 1
node.begin(1, RS485Serial);
// Callbacks allow us to configure the RS485 transceiver correctly
// node.preTransmission(preTransmission);
// node.postTransmission(postTransmission);
}
bool state = true;
void loop()
{
uint8_t result;
uint16_t data[6];
static uint32_t i;
uint8_t j;
i++;
/* lcd.clear();lcd.print("value of i");delay(500);
lcd.clear();delay(200);
lcd.print(i);delay(200);
node.setTransmitBuffer(0,lowWord(i));
lcd.clear();
lcd.setCursor(0,0);
lcd.print(lowWord(i));delay(500);
node.setTransmitBuffer(1,highWord(i));
lcd.setCursor(10,1);
lcd.print(highWord(i));delay(1000);*/
pinMode(txnPinDir, OUTPUT);
digitalWrite(txnPinDir, RS485Transmit);
delay(500);digitalWrite(txnPinDir, RS485Receive);
delay(200);
lcd.clear();lcd.print("Reading Slave");
for (int i=0; i <= 49999; i++){
lcd.clear();lcd.print("Trying Reg");lcd.setCursor(14,14);lcd.print(i);delay(500);
//analogWrite(PWMpin, i);
// lcd.clear();lcd.print("RS485Transmit");lcd.setCursor(14,14);lcd.print(RS485Transmit);delay(1000);
// digitalWrite(txnPinDir, RS485Receive);
// digitalWrite(txnPinDir, RS485Transmit);
lcd.clear();lcd.print("Reading");delay(200);
result = node.readHoldingRegisters(i, 2);
lcd.clear();lcd.print("After Read");delay(200);
lcd.clear();lcd.print("RESULT");lcd.setCursor(12,12);lcd.print(result);delay(1500);
// digitalWrite(txnPinDir, RS485Receive);
if (result == node.ku8MBSuccess) {
lcd.clear();lcd.print("Display result");delay(1000);
/* for (j = 0; j < 2; j++)
{
data[j] = node.getResponseBuffer(j);
lcd.print(data[j]);
Serial.println(data[j]);
}*/
}
//digitalWrite(txnPinDir, RS485Transmit);
lcd.print("No Success");delay(50);
delay(10);
}
//result = node.readHoldingRegisters(42004, 2);
//delay(100);lcd.clear();lcd.print(result);delay(100);
// Serial.println("Trying");Serial.println(result);
// Serial.println(txnPinDir);Serial.println(RS485Transmit);
// digitalWrite(txnPinDir, RS485Transmit);
// digitalWrite(txnPinDir, RS485Receive);
// Serial.println(txnPinDir);Serial.println(RS485Receive);
delay(100);
}
But I am getting result 226 every time.
When I tried using visual studio , ,I am able to read same slave with register 42004 address.
In above arduino code , I m trying all registers , but got no result.
Please help