Help regarding MODBUS MAX485 code


hi everyone

i trying read energy meter (as slave) master (ardunio uno ) ,using communication (max485).

i have connected pin 9,10 rx,tx , using pin 7 changing direction.


using 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 @ 115200 baud
 // serial.begin(9600);
 // rs485serial.begin(115200);
 rs485serial.begin(9600);
  // modbus slave id 1
  node.begin(1, rs485serial);
  // callbacks allow configure 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");

  (int i=0; <= 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);
                          /* (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 getting result 226 every time.
when tried using visual studio , ,i able read same slave register 42004 address.
in above arduino code , m trying registers , got no result.

please help

did read sticky post @ top of forum?

enclose code code tags (that's "</>" button in editor) because otherwise forum system mangles code , may hide important parts.

you forgot post links hardware used: rs-485 module arduino, datasheet of energy meter you're trying connect , wiring you're using.

you should post link library you're using because there lot of libraries doing modbus on arduino , many of them have similar names different functionality.

if energy meter follow modbus rtu standard cannot use softwareserial connect because emulation doesn't provide necessary serial parameters (modbus not support 8n1 8n2, 8e1 , 8o1). there devices says support modbus uses 8n1 not following standard.

even if device uses 8n1 advise not use softwareserial. have lcd connected can display debugging information on don't need hardware serial interface computer. softwareserial needs timing tolerant counterpart. if device bit more strict in timing issues won't connect arduino softwareserial if hardware serial interface used.



Arduino Forum > Using Arduino > Networking, Protocols, and Devices (Moderator: fabioc84) > Help regarding MODBUS MAX485 code


arduino

Comments

Popular posts from this blog

DHT11 Time out error using v0.4.1library

Sketch upload fails with Java error (___REMOVE___/bin/avrdude)!

Arduino Uno + KTY81/210 temperature sensor