首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取来自Modbus奴隶的所有持有登记簿?

如何读取来自Modbus奴隶的所有持有登记簿?
EN

Stack Overflow用户
提问于 2019-04-17 14:09:55
回答 2查看 1.2K关注 0票数 1

我正在使用Delta,它支持modbus232通信。

包含数据的保持寄存器不是顺序的。

代码语言:javascript
复制
i.e., 4246,6622,6626,6676,6624,6496,6658,4096,4346.

因此,要读取每个寄存器,我需要分别请求。

代码语言:javascript
复制
actual_floor = client.read_holding_registers(4246,1,unit=0x01)
fault = client.read_holding_registers(6622,1,unit=0x01)

如果我想阅读200多个寄存器,这是一个相当大的任务。

是否有任何方法一次读取所有的保存寄存器,给出所有寄存器及其数据的json或任何其他格式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-18 06:55:40

首先,您应该获得min和max寄存器,然后通过带有count参数的请求读取,然后必须为每个寄存器分配考虑值。

注意事项:最大计数是125

就像这样:

代码语言:javascript
复制
def chunking(registers):
    # do stuff.

def assignment_regs_to_values(values, registesr):
   # do stuff.

registers = [4246,6622,6626,6676,6624,6496,6658,4096,4346]
min_reg = min(registers)
max_reg = max(registers)
count_ = max_reg - min_reg + 1

if count_ > 125:
    sub_regs = chunking(registers)
    # get min & max of each sub_reg list ...
else:
    sorted_regs = sorted(registers)
    res = client.read_holding_registers(min_reg, count=count_ , unit=1)  # Note
    assignment_regs_to_values(res.registes, sorted_regs)

在您的情况下,请求的最佳数量将是4个请求(而不是9个请求):

代码语言:javascript
复制
sub_regs1 = [6676, 6658, 6626, 6624, 6622]
sub_regs2 = [6496]
sub_regs3 = [4336, 4246]
sub_regs3 = [4096]

count1 = max(sub_regs1) - min(sub_regs1) + 1
res1 = client.read_holding_registers(min(sub_regs1), count=count1, unit=1)
res2 = client.read_holding_registers(6496, count=1, unit=1)
count3 = max(sub_regs3) - min(sub_regs3) + 1
res3 = client.read_holding_registers(min(sub_regs3), count=count3, unit=1)
res4 = client.read_holding_registers(4096, count=1, unit=1)
票数 1
EN

Stack Overflow用户

发布于 2019-04-17 15:23:55

只需读取所需的所有寄存器,从第一个到最后,它们将在一个数组中传递给您,从它中,您自然可以提取与您想要的索引对应的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55729543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档