Skip to content

Issue with connecting to PLC #2639

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
mohadcoder opened this issue Apr 14, 2025 · 1 comment
Closed

Issue with connecting to PLC #2639

mohadcoder opened this issue Apr 14, 2025 · 1 comment

Comments

@mohadcoder
Copy link

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.

@janiversen janiversen closed this as not planned Won't fix, can't repro, duplicate, stale Apr 14, 2025
@janiversen
Copy link
Collaborator

You do not write which version you use, so help can only be theoretical.

but just read what the log says:

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

so you need to correct your call.

got an unexpected keyword argument 'unit' 

means what it says, it is an unknown parameter.

I guess it would help a lot if you read the documentation or at the very least follow the typing (signatures) in the API.

Of course reinstalling the library does not help, you need to change your program.

Closing this as it is evidently not a bug in pymodbus.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants