1
votes

I've been having connection errors on my raspberry pi 3B using pymodbus. Designed a board using MAX14854G as the RS-485 transceiver that is connected to the RPI3's UART pins (8 & 10). It's connected to the m-system energy meter (53U-1211-AD4/H) through the T1, T2 & T4 (GND) pins.

Additional info: I'm using the full functionality of the UART by using this procedure: link

Here's my code:

In [3]: import pymodbus

In [4]: import serial.rs485

In [5]: from pymodbus.client.sync import ModbusSerialClient as ModbusClient

In [6]: from pymodbus.register_read_message import ReadInputRegistersResponse

In [7]: msys = ModbusClient(method='rtu',port='/dev/ttyAMA0',stopbits=1,bytesize=8,parity='N',baudrate=9600,timeout=5)

In [8]: msys.connect()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-31c23cb3ed21> in <module>()
----> 1 msys.connect()

/usr/local/lib/python3.5/dist-packages/pymodbus/client/sync.py in connect(self)
474             self.close()
475         if self.method == "rtu":
--> 476             self.socket.interCharTimeout = self.inter_char_timeout
477             self.last_frame_end = None
478         return self.socket is not None

Update:

Followed @BenyaminJafari 's advice and changed the root permission:

sudo chmod 777 /dev/ttyAMA0

I can finally connect as per below code but resulted in a different error:

In [39]: msys.connect()
Out[39]: True

In [40]: valueHoldingRegisters = msys.read_holding_registers(1,1,unit=1)

In [41]: valueHoldingRegisters = msys.read_holding_registers(1,1,unit=1)

In [42]: valueHoldingRegisters.isError()
Out[42]: True

In [43]: print(valueHoldingRegisters)
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)

Error log:

DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x1 0x0 0x1 0xd5 0xca
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)) 
DEBUG:pymodbus.framer.rtu_framer:Frame - [b''] not ready
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Unhandled error

Update (Added some new lines):

In [1]: import pymodbus

In [2]: import serial

In [3]: from pymodbus.pdu import ModbusRequest

In [4]: from pymodbus.client.sync import ModbusSerialClient as ModbusClient

In [5]: from pymodbus.transaction import ModbusRtuFramer

In [6]: from pymodbus.register_read_message import ReadInputRegistersResponse

In [7]: import logging

In [8]: logging.basicConfig()

In [9]: log = logging.getLogger()

In [10]: log.setLevel(logging.DEBUG)

In [11]: msys = ModbusClient(method='rtu',port='/dev/ttyAMA0',stopbits=1,bytesize=8,parity='N',baudrate=9600,timeout=2)

In [12]: connection = msys.connect()

In [13]: print(connection)
True

In [14]: HR1 = msys.read_holding_registers(0,1,unit=1)
DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x0 0x0 0x1 0x84 0xa
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)) 
DEBUG:pymodbus.framer.rtu_framer:Frame - [b''] not ready
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

In [15]: print(HR1)
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)

In [25]: HR2= msys.read_holding_registers(1,1,unit=1)
DEBUG:pymodbus.transaction:Current transaction state - TRANSACTION_COMPLETE
DEBUG:pymodbus.transaction:Running transaction 2
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x1 0x0 0x1 0xd5 0xca
DEBUG:pymodbus.framer.rtu_framer:Changing state to IDLE - Last Frame End - None, Current Time stamp - 1478195437.918486
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Incomplete message received, Expected 7 bytes Recieved 0 bytes !!!!
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 
DEBUG:pymodbus.framer.rtu_framer:Frame - [b''] not ready
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

In [26]: print(HR2)
Modbus Error: [Input/Output] No Response received from the remote unit/Unable to decode response

In [27]: HR3 = msys.read_holding_registers(2,1,unit=1)
DEBUG:pymodbus.transaction:Current transaction state - TRANSACTION_COMPLETE
DEBUG:pymodbus.transaction:Running transaction 3
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x2 0x0 0x1 0x25 0xca
DEBUG:pymodbus.framer.rtu_framer:Changing state to IDLE - Last Frame End - 1478195439.927521, Current Time stamp - 1478195492.844382
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Incomplete message received, Expected 7 bytes Recieved 0 bytes !!!!
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 
DEBUG:pymodbus.framer.rtu_framer:Frame - [b''] not ready
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

In [28]: print(HR3)
Modbus Error: [Input/Output] No Response received from the remote unit/Unable to decode response

Can someone please help and suggest where I'm going wrong ?

1
Is your problem in .connect()? Is your connection value equal to False? Is this error consider to client.connect()?! Please put on your full trace of the error for better sense.Benyamin Jafari
Did you set the root permsion on /dev/ttyAMA0 with sudo chmod 777 /dev/ttyAMA0?Benyamin Jafari
Please show the COMPLETE stacktrace, not a part that also has been edited by you - NoneTyoe for sure is not what the error read.deets
@BenyaminJafari I can't connect to my energy meter at all using .connect(). Not even False but interCharTimeout. Updated original post for the full code and errors. Thank you!cknz
@deets Updated original post for the full code and errors. Thank you!cknz

1 Answers

0
votes

I set the Modbus slave logging for getting more information:

import logging
from pymodbus.client.sync import ModbusSerialClient as ModbusClient

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

msys = ModbusClient(
    method='rtu', port='/dev/ttyAMA0',
    stopbits=1, bytesize=8, parity='N',
    baudrate=9600, timeout=5
)

if msys.connect():
    try:
        valueHoldingRegisters = msys.read_holding_registers(1, 1, unit=1)

        if not valueHoldingRegisters.isError():
            print(valueHoldingRegisters.registers)

        else:
            raise ValueError(valueHoldingRegisters)

    except Exception as exc:
        print(exc)

else:
    print('Connection error')

msys.close()

[NOTE]:

Make sure your port should be has a root permission using:

sudo chmod 777 /dev/ttyAMA0