为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2021-12-29 19:42:09
我正在尝试使用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)假设我想存储一个值152to Input Register (ir)address30001和一个值276to address 30002?我应该如何调整上面的代码?
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超3个赞

假设我想将 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]


查看完整回答
反对 回复 2021-12-29
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

来自 Pymodbus 文档。


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


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

在ModbusSequentialDataBlock初始化过程中有两个arugmentsaddress和value。


address – The starting address

values –  List of values to initialise each address with. 

数据块的总大小取决于len(values).


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


商店 = 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)

请注意,使用 kwargzero_mode=True没有这个,read_input_registers针对偏移量 0 的请求将返回 276 而不是 152,这是因为没有zero_mode=Truepymodbus 尝试根据规范的第 4.4 节存储值,因此地址(0-7)将映射到(1-8)。如果您不想使用,zero_mode则将数据块初始化为ir=ModbusSequentialDataBlock(1, [152, 276]).


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 615 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号