Skip to content

Strange ModbusSlaveContext behavior if hr is used without di #2652

@Chabrol

Description

@Chabrol

Hi!

I'm using pymodbus 3.9.2. Here is a small example server with three holding resgisters:

from pymodbus.server import StartTcpServer
from pymodbus.datastore import (
    ModbusSlaveContext,
    ModbusServerContext,
    ModbusSequentialDataBlock
)

def run_sync_server():
    block = ModbusSequentialDataBlock(1, [11, 22, 33])
    store = ModbusSlaveContext(hr=block)
    context = ModbusServerContext(slaves=store, single=True)
    StartTcpServer(context, address=("0.0.0.0", 502))

if __name__ == "__main__":
    run_sync_server()

If I try to read them with this script

from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('127.0.0.1')
client.connect()
result = client.read_holding_registers(address=0, count=3, slave=1)
print(result)
client.close()

I get

ReadHoldingRegistersResponse(dev_id=1, transaction_id=1, address=0, count=0, bits=[], registers=[0, 0, 0], status=1)

I expected to get 11, 22, 33. As soon as I set something for di= (But not None), it works. Here a working version:

from pymodbus.server import StartTcpServer
from pymodbus.datastore import (
    ModbusSlaveContext,
    ModbusServerContext,
    ModbusSequentialDataBlock
)

def run_sync_server():
    block = ModbusSequentialDataBlock(1, [11, 22, 33])
    store = ModbusSlaveContext(di=ModbusSequentialDataBlock.create(), hr=block)
    context = ModbusServerContext(slaves=store, single=True)
    StartTcpServer(context, address=("0.0.0.0", 502))

if __name__ == "__main__":
    run_sync_server()

which results in the expected

ReadHoldingRegistersResponse(dev_id=1, transaction_id=1, address=0, count=0, bits=[], registers=[11, 22, 33], status=1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions