Skip to content

Issue with connecting to PLC #2639

Closed as not planned
Closed as not planned
@mohadcoder

Description

@mohadcoder

Hello,

trying to use pymodbus to read from a controller that uses TCP/IP communication , serial communication from the controller will be converted to TCP/IP using Moxa NPort IA-5150.. wasn't able to get it to read any register or a coil data. I'm sure that I'm missing some input.

from pymodbus.client import ModbusTcpClient

def connect_to_modbus_server():
    # Create a Modbus TCP client instance
    client = ModbusTcpClient('xx.x.xx.xx', port=502, timeout=5)

    print(f"Attempting to connect to xx.x.xx.xx on port 502...")
    connection = client.connect()

    if connection:
        print("Successfully connected...")
        print(f"Socket details: {client.socket}")
        print(f"Socket connected: {client.socket is not None}")
        print(f"Socket timeout: {client.socket.gettimeout()}")

        try:
            # Try different slave IDs (in older versions it's called 'slave' not 'unit')
            print("\n--- Testing different Slave IDs ---")
            for slave_id in range(1, 6):  # Try slave IDs 1-5
                try:
                    print(f"\nTrying Slave ID: {slave_id}")
                    response = client.read_holding_registers(0, 1, slave=slave_id)
                    print(f"Response: {response if response.isError() else response.registers}")
                except Exception as e:
                    print(f"Exception: {e}")

            # Try different register types with slave ID 1
            print("\n--- Testing different register types ---")
            slave_id = 1  # Default Modbus slave ID

            try:
                print("\nTrying Input Registers (function code 4)")
                response = client.read_input_registers(0, 1, slave=slave_id)
                print(f"Response: {response if response.isError() else response.registers}")
            except Exception as e:
                print(f"Exception: {e}")

            try:
                print("\nTrying Coils (function code 1)")
                response = client.read_coils(0, 1, slave=slave_id)
                print(f"Response: {response if response.isError() else response.bits}")
            except Exception as e:
                print(f"Exception: {e}")

            try:
                print("\nTrying Discrete Inputs (function code 2)")
                response = client.read_discrete_inputs(0, 1, slave=slave_id)
                print(f"Response: {response if response.isError() else response.bits}")
            except Exception as e:
                print(f"Exception: {e}")

            # Try a few different address ranges for holding registers
            print("\n--- Testing different address ranges ---")
            for address in [0, 100, 1000, 3000, 4000]:
                try:
                    print(f"\nTrying Holding Registers at address {address}")
                    response = client.read_holding_registers(address, 1, slave=slave_id)
                    print(f"Response: {response if response.isError() else response.registers}")
                except Exception as e:
                    print(f"Exception: {e}")

            # Try Modbus device ID function (0x11)
            try:
                print("\n--- Testing Modbus Device Identification ---")
                rq = client.execute(0x11, b'\x00')
                print(f"Device ID response: {rq}")
            except Exception as e:
                print(f"Device ID exception: {e}")

        except Exception as e:
            print(f"General exception: {e}")
        finally:
            # Close the connection when done
            client.close()
            print("\nConnection closed")
    else:
        print("Failed to connect to the Modbus server. Check IP, port, and network connectivity.")


if __name__ == "__main__":
    connect_to_modbus_server()

And here is the output i get:

Attempting to connect to xx.x.xx.xx on port 502...
Successfully connected...
Socket details: <socket.socket fd=288, family=2, type=1, proto=0, laddr=('10.248.67.69', 54883), raddr=('xx.x.xx.xx', 502)>
Socket connected: True
Socket timeout: 5.0

--- Testing different Slave IDs ---

Trying Slave ID: 1
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Slave ID: 2
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Slave ID: 3
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Slave ID: 4
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Slave ID: 5
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

--- Testing different register types ---

Trying Input Registers (function code 4)
Exception: ModbusClientMixin.read_input_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Coils (function code 1)
Exception: ModbusClientMixin.read_coils() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Discrete Inputs (function code 2)
Exception: ModbusClientMixin.read_discrete_inputs() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

--- Testing different address ranges ---

Trying Holding Registers at address 0
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Holding Registers at address 100
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Holding Registers at address 1000
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Holding Registers at address 3000
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

Trying Holding Registers at address 4000
Exception: ModbusClientMixin.read_holding_registers() takes 2 positional arguments but 3 positional arguments (and 1 keyword-only argument) were given

--- Testing Modbus Device Identification ---
Device ID exception: 'bytes' object has no attribute 'transaction_id'

Connection closed

Note that whenever i run the following:
response = client.read_holding_registers(address=0, count=1, unit=1)

I get:
TypeError: ModbusClientMixin.read_holding_registers() got an unexpected keyword argument 'unit'

I have uninstalled and installed the library several times already, which didn't help.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions