我正在尝试使用Synchronous Server Example实现一个简单的同步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
的值存储到Input Register (ir)
地址30001
并将276
的值存储到地址30002
?我应该如何修改上面的代码?
答案 0 :(得分:0)
来自Pymodbus文档。
数据存储区仅响应其初始化为的地址 因此,如果将DataBlock初始化为0x00到0xFF的地址,则 对0x100的请求将以无效的地址异常响应。这是 因为许多设备都表现出这种行为(但不是全部):
block = ModbusSequentialDataBlock(0x00, [0]*0xff)
ModbusSequentialDataBlock
在初始化address
和value
期间要进行两次折算。
address – The starting address
values – List of values to initialise each address with.
数据块的总大小取决于len(values)
。
因此,请看上面的示例,我们试图创建一个大小为0xFF
的顺序数据块,并用值0
初始化每个地址。相似地
在您的情况下,如果要将值152存储到“输入寄存器(ir)”地址30001,将值276存储到地址30002,则必须执行此操作。
store = ModbusSlaveContext(
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)
请注意,不使用kwarg zero_mode=True
,针对偏移量0的read_input_registers
请求将返回276而不是152,这是因为pymodbus尝试存储zero_mode=True
时会尝试存储值基于规范的第4.4节,因此地址(0-7)将映射为(1-8)。如果您不想使用zero_mode
,则将数据块初始化为ir=ModbusSequentialDataBlock(1, [152, 276])
。
答案 1 :(得分:0)
假设我要将值152存储到“输入寄存器(ir)”地址30001,并将值276存储到地址30002?我应该如何修改上面的代码?
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]