ModBus library on LoPy : no data received from slave
-
Hello,
I am trying to read ModBus data from a slave using ModBus library. I am continuously getting error "OSError: no data received from slave". Below is the code I am using
######################### RTU SERIAL MODBUS #########################
uart_id = 0x01
modbus_obj = Serial(uart_id, pins=('P3', 'P4'))###################### READ HOLDING REGISTERS ##################
slave_addr=0x01
starting_address=0x110
register_quantity=10
signed=Trueregister_value = modbus_obj.read_holding_registers(slave_addr, starting_address, register_quantity, signed)
print('Holding register value: ' + ' '.join('{:d}'.format(x) for x in register_value))I tried reading the same slave from a ModBus master simulator and getting the expected data. But it is failing with the LoPy. Below is the error msg. Please check.
Traceback (most recent call last):
File "<stdin>", line 46, in <module>
File "/flash/lib/uModBus/serial.py", line 127, in read_holding_registers
File "/flash/lib/uModBus/serial.py", line 86, in _send_receive
File "/flash/lib/uModBus/serial.py", line 91, in _validate_resp_hdr
OSError: no data received from slaveRegards,
Sameer
-
Hello,
I'm working on a modbus project using the pycom controller to read a few input registers. But there I get the same error as you Sameer and I'm not able to make the code run correctly.
What did you do that the code work?Regards,
Jancurrent code:
######################### RTU SERIAL MODBUS #########################
uart_id = 0x01
modbus_obj = Serial(uart_id, pins=('P3', 'P4'))###################### READ INPUT REGISTERS ##################
slave_addr=0x01
starting_address=0x04
register_quantity=2
signed=Trueregister_value = modbus_obj.read_input_registers(slave_addr, starting_address, register_quantity, signed)
print('Input register value: ' + ' '.join('{:d}'.format(x) for x in register_value))
-
@sameerchouksey this might be a long shot, but I would try using the original micropython modbus code.
The pycom modbus code is different and adds the signed option. (which I find strange because endianess is not a given in modbus (ie not defined) so can vary from platform to platform) which would be required to correctly interpret signed values. The original doesn't include this extra code.
-
@timh Yes. I have used Modbus Poll simulator and I can read 10 registers there.
Regards
Sameer
-
@sameerchouksey have you confirmed you can read multiple registers from this device using some other software/hardware other than pycom ?
T
-
@timh I tried reading 2 adjacent registers. But getting only one value.
There is no hole between two registers. You can see in the screenshot that I first reading register address 0x110 with register count as 2. And then I am reading register address 0x111. In the second call I can read the second register.
Please check the screenshot.
-
Oh I didn't know you could read a single register. That information missing from you post above.
Have you checked that the contiguous register range is valid (ie no holes).
We talk to a number of devices that have large holes in the register range . We can read multiple registers if we avoid the holes. ie registers 50 to 100 (decimal) might have two unused registers at 68 & 69. So we can't read from address 50 for a length of 50. We have read start register 50, length of 27, then from 70 with a length of 30.
Can you read 2 adjacent registers or are you limited to a single register?
Tim
-
Thanks for the support. I am able to read it with a potential divider circuit.
One query, how many registers can I read in one single call?? I am setting up register_quantity=10, but still I am able to read only one register at a time.
Regards
Sameer
-
You can use something like that
Search for "XY-017 RS485" in google you'll find it everywhere starting less than $2 (on ebay for example)
-
@sameerchouksey have you tried using TTL and a different library on something like a raspberry pi ?
One of things we have had issues with various serial modbus adaptors is the timeout for the read is too short, which typically gives you OSError: no data received from slave. For instance an ATLAS COPCO engine controller I couldn't get to work using modbus_tk, but could with PyModbus due to the way modbus_tk was handling serial timeouts (and I didn't then want to spend time debugging modbus_tk ;-)
The other obvious things are checking comms details and slave address which will also generally give you the same error.
You code example isn't showing baud etc...T
-
Hello,
Thanks for your prompt response. Yes, the device supports RS485 and I am using a Rs485 to TTL converter between PyCom board and the ModBus slave. Still getting same error.
Regards,
Sameer
-
@timh
Yes, it is TTL only.@SameerChouksey
you must use converter e.g.SN65HVD230
- direct connection can brake your device as it is 3V3 levels device only.
-
Hi this might be a silly question, but most MODBUS RTU devices are serial RS323 or RS485. I personally haven't seen any industrial modbus devices that use TTL.
I am pretty sure the serial UART on the ESP32 is TTL so it won't work with any RS232/RS485 devices with out something like a MAX3232
Cheers
Tim