F
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:
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):<pre>
#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);
}</pre>
<i>Arduino request signal:</i> <i>USB/RS485 converter signal:</i> <i>Overlap of the two signals:</i>
I read about TTL and level conversions, and I put on a circuit like this on a breadboard:
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):<pre>
#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);
}</pre>
<i>Arduino request signal:</i> <i>USB/RS485 converter signal:</i> <i>Overlap of the two signals:</i>