将值赋给TCP服务器寄存器的pymodbus语法是什么?

问题描述 投票:1回答:2

我正在尝试使用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?我该如何调整上面的代码?

python modbus modbus-tcp pymodbus
2个回答
0
投票

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

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)

日期:

[152, 276]

0
投票

来自Pymodbus的文档。

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

 block = ModbusSequentialDataBlock(0x00, [0]*0xff)

在初始化qazxsw poi和qazxsw poi期间,ModbusSequentialDataBlock有两个论点。

address

数据块的总大小取决于value

所以看看上面的例子,我们试图创建一个大小为address – The starting address values – List of values to initialise each address with. 的序列数据块,每个地址用值len(values)初始化。类似地,在您的情况下,如果要将值152存储到“输入寄存器(ir)”地址30001,将值276存储到地址30002,则需要执行以下操作。

store = ModbusSlaveContext(

0xFF

请注意,使用kwarg 0没有这个, 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) 请求抵消偏移0将返回276而不是152,这是因为没有zero_mode=True pymodbus试图根据规范的4.4节存储值,所以地址(0-7)将映射到(1-8)。如果你不想使用read_input_registers,那么将数据块初始化为zero_mode=True

© www.soinside.com 2019 - 2024. All rights reserved.