Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Modbus从机读取所有保持寄存器?_Python_Json_Serial Port_Modbus_Pymodbus - Fatal编程技术网

Python 如何从Modbus从机读取所有保持寄存器?

Python 如何从Modbus从机读取所有保持寄存器?,python,json,serial-port,modbus,pymodbus,Python,Json,Serial Port,Modbus,Pymodbus,我使用的是支持modbus232通信的Delta PLC 包含数据的保持寄存器不是顺序的 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多个寄存

我使用的是支持modbus232通信的Delta PLC

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

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或任何其他格式提供所有寄存器及其数据?

只需从第一个到最后读取所需的所有寄存器,它们就会以数组的形式呈现给您,您自然可以从中提取与所需索引对应的值。

首先,你应该得到Min和Max登记,然后用一个请求读取,用代码>计数< /C>参数,然后你必须把考虑值分配给每个寄存器。 注意:最大计数为
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个请求):


请注意,
count=max\u reg-min\u reg+1
在我的回答中是正确的,但是
count=len(寄存器)
是错误的,因为它返回
9
但是
max\u reg-min\u reg+1
返回
2581
,大于
125
,因此,我们必须将其分块到
4
请求,正如我在回答中提到的那样。
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)