Search code examples
pythonmodbusmodbus-tcppymodbus

What is the pymodbus syntax to assign values to TCP server registers?


I am trying to implement a simple synchronous TCP server using the Synchronous Server Example. However, I do not understand the syntax explanations in the documentation. The example includes the following code block:

store = ModbusSlaveContext(
     di=ModbusSequentialDataBlock(0, [17]*100),
     co=ModbusSequentialDataBlock(0, [17]*100),
     hr=ModbusSequentialDataBlock(0, [17]*100),
     ir=ModbusSequentialDataBlock(0, [17]*100))

context = ModbusServerContext(slaves=store, single=True)

Suppose I want to store a value of 152 to Input Register (ir) address 30001 and a value of 276 to address 30002? How should I adapt the above code?


Solution

  • Suppose I want to store a value of 152 to 'Input Register (ir)' address 30001 and a value of 276 to address 30002? How should I adapt the above code?

    Following code is what you want:

    from pymodbus.server.sync import StartTcpServer
    from pymodbus.datastore import ModbusSequentialDataBlock
    from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
    
    import logging
    FORMAT = ('%(asctime)-15s %(threadName)-15s'
              ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
    logging.basicConfig(format=FORMAT)
    log = logging.getLogger()
    log.setLevel(logging.DEBUG)
    
    
    def run_server():
        store = ModbusSlaveContext(
            ir=ModbusSequentialDataBlock(30001, [152, 276]), 
            zero_mode=True
        )
        context = ModbusServerContext(slaves=store, single=True)
        StartTcpServer(context, address=("localhost", 5020))
    
    
    if __name__ == "__main__":
        run_server()
    

    Test Case:

    from pymodbus.client.sync import ModbusTcpClient as ModbusClient
    
    cli = ModbusClient('127.0.0.1', port=5020)
    assert cli.connect()
    res = cli.read_input_registers(30001, count=2, unit=1)
    assert not res.isError()
    print(res.registers)
    

    Out:

    [152, 276]