Python 为TCP服务器寄存器分配值的pymodbus语法是什么?

Python 为TCP服务器寄存器分配值的pymodbus语法是什么?,python,modbus,modbus-tcp,pymodbus,Python,Modbus,Modbus Tcp,Pymodbus,我正在尝试使用实现一个简单的同步TCP服务器。但是,我不理解文档中的语法解释。该示例包括以下代码块: store = ModbusSlaveContext( di=ModbusSequentialDataBlock(0, [17]*100), co=ModbusSequentialDataBlock(0, [17]*100), hr=ModbusSequentialDataBlock(0, [17]*100), ir=ModbusSequentialDat

我正在尝试使用实现一个简单的同步TCP服务器。但是,我不理解文档中的语法解释。该示例包括以下代码块:

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)

假设我想将
152
的值存储到
输入寄存器(ir)
地址
30001
,将
276
的值存储到地址
30002
?我应该如何调整上述代码?

来自Pymodbus文档

数据存储只响应它们初始化到的地址 因此,如果将数据块初始化为0x00到0xFF的地址,则 对0x100的请求将以无效地址异常进行响应。这是 因为许多设备都表现出这种行为(但不是全部):

modbusequentialdatablock
在初始化
地址
过程中需要两段数据

address – The starting address
values –  List of values to initialise each address with. 
数据块的总大小取决于
len(值)

因此,看看上面的例子,我们试图创建一个大小为
0xFF
的顺序数据块,每个地址都用值
0
初始化。同样地 在您的情况下,如果要将值152存储到“输入寄存器(ir)”地址30001,将值276存储到地址30002,则必须执行以下操作

store=ModbusSlaveContext(

请注意,使用kwarg
zero_mode=True
时,如果没有此项,
read_input_registers
针对偏移量0的请求将返回276而不是152,这是因为如果没有out
zero_mode=True
pymodbus尝试根据规范第4.4节存储值,因此地址(0-7)将映射到(1-8)。如果不想使用
zero\u模式
,则将数据块初始化为
ir=modbus顺序数据块(1[152,276])

假设我想将值152存储到“输入寄存器(ir)”地址30001,将值276存储到地址30002?我应该如何调整上述代码

以下代码是您想要的:
测试用例: 输出:

address – The starting address
values –  List of values to initialise each address with. 
         di=ModbusSequentialDataBlock(0, [17]*100),
         co=ModbusSequentialDataBlock(0, [17]*100),
         hr=ModbusSequentialDataBlock(0, [17]*100),
         ir=ModbusSequentialDataBlock(0, [152, 276]), zero_mode=True)

context = ModbusServerContext(slaves=store, single=True)
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()
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)
[152, 276]