python - 如何从 Modbus Slave 读取所有保持寄存器?

标签 python json serial-port modbus pymodbus

我使用的是台达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)

关于python - 如何从 Modbus Slave 读取所有保持寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55729543/

相关文章:

linux - 为什么在 Linux 上使用 RS-232 时 CTRL+C 不起作用?

通过Android模拟器无法读取但可以写入串口

python - 一个通用的树实现?

Python - 'call' 一个类

python - 在 TextField 中呈现 Django 应用程序

java - 如何使用 jackson 创建json数组

python - 运行 scikit 学习示例时 matplotlib 出错

javascript - 如何使用 onLoad 加载 jQuery JSON。从表格上的邮政编码获取城市和州?

c# - 验证 JSON 中键值对中的值

python - 如何在 Windows 上的 Python 中创建 COM 端口