Today is...
Monday, August 20, 2018
Welcome to Control.com, the global online
community of automation professionals.
Featured Video...
Featured Video
EtherCAT with CTC’s master lets your multivendor network play well together...
Our Advertisers
Help keep our servers running...
Patronize our advertisers!
Visit our Post Archive
Querying a Modbus Slave with an Arduino
Having trouble trying to query a Modbus slave with an Arduino through RS485

Having some troubles trying to query a modbus slave with an Arduino through RS485. I've already succeeded in querying a software modbus slave running on my PC through the USB/COM port using the ModbusMaster library, hence it shouldn't be a software issue.

I read about TTL and level conversions, and I put on a circuit like this on a breadboard:
https://i.stack.imgur.com/Ff8Vo.png

Using the same firmware/sketch that worked for the software slave, I connected the arduino pin TX and RX to the max485, and A and B to the Modbus slave and I issued several requests.

I can see the signals converted by the MAX485(http://www.kynix.com/Detail/240679/MAX485.html) (CPA1114) though the oscilloscope and it seems to be right. The led on the Modbus slave lights on as it sees a modbus transaction. Still, what I read as result of the request is always 0xE0 (invalid slave id) or 0xE2 (timeout).

I queried the slave with the same equal request using another tool (a RS485/USB converter and CAS Modbus Scanner), and it gives the expected results, that is data 0x01.

This is the code I'm running on an Arduino Ethernet (with a display for debug purpose):


#include <ModbusMaster.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);

ModbusMaster node(1);

void setup() {

pinMode(3, OUTPUT);
node.begin(19200);
lcd.begin(16, 2);

}

void loop() {

uint16_t m_startAddress=1;
uint8_t m_length=1;
uint8_t result;

digitalWrite(3, HIGH); // TX
result = node.readHoldingRegisters(m_startAddress, m_length);

lcd.clear();

if (result == node.ku8MBSuccess) {
lcd.print("DATA:");
digitalWrite(3, LOW); // RX
for (uint8_t j = 0; j < m_length; j++) lcd.print( node.getResponseBuffer(j), HEX );
} else {
lcd.print("ERR ");
lcd.print(result, HEX);
}

delay(500);

}


Arduino request signal:https://i.stack.imgur.com/xzL0s.png
USB/RS485 converter signal:https://i.stack.imgur.com/kqkRW.png
Overlap of the two signals:https://i.stack.imgur.com/ydwQd.png