如何从 Modbus Slave 读取所有的保持寄存器?
How to read all Holding Registers from Modbus Slave?
我用的是台达PLC,支持modbus232通讯。
包含数据的保持寄存器不是连续的。
i.e., 4246,6622,6626,6676,6624,6496,6658,4096,4346.
所以要读取每个寄存器,我需要分别请求。
actual_floor = client.read_holding_registers(4246,1,unit=0x01)
fault = client.read_holding_registers(6622,1,unit=0x01)
如果我想读取超过 200 个寄存器,这是一项非常艰巨的任务。
有没有办法一次读取所有保持寄存器,从而以 json 或任何其他格式提供所有寄存器及其数据?
把你需要的寄存器全部读一遍,从头到尾,它们会以数组的形式传给你,从中自然可以提取出你想要的索引对应的值。
首先,你应该得到最小和最大寄存器,然后通过带有count
参数的请求读取,然后你必须为每个寄存器分配考虑值。
注意:最大计数为125
。
像这样:
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 个请求):
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)
我用的是台达PLC,支持modbus232通讯。
包含数据的保持寄存器不是连续的。
i.e., 4246,6622,6626,6676,6624,6496,6658,4096,4346.
所以要读取每个寄存器,我需要分别请求。
actual_floor = client.read_holding_registers(4246,1,unit=0x01)
fault = client.read_holding_registers(6622,1,unit=0x01)
如果我想读取超过 200 个寄存器,这是一项非常艰巨的任务。
有没有办法一次读取所有保持寄存器,从而以 json 或任何其他格式提供所有寄存器及其数据?
把你需要的寄存器全部读一遍,从头到尾,它们会以数组的形式传给你,从中自然可以提取出你想要的索引对应的值。
首先,你应该得到最小和最大寄存器,然后通过带有count
参数的请求读取,然后你必须为每个寄存器分配考虑值。
注意:最大计数为125
。
像这样:
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 个请求):
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)