PyModbus运行效率与顺序不同的寄存器和不同功能

2024-10-04 05:20:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始使用PyModbus,发现用ModbusTCPClient和read\u holding\u registers函数进行基本的轮询非常容易

我现在对构造更复杂的记录器的最佳方法感兴趣-非连续寄存器、不同的函数代码、不同的Endian编码等等

例如,为了避免对设备的每个标记进行单独的“read\u holding\u registers”调用,我构建了一个函数,将所有连续的标记寄存器分组,以减少调用次数

我计划为二进制PayloadDecoders实现一个类似的功能—按具有相同字节顺序和字顺序的寄存器分组,以减少解码器实例的数量

def polldevicesfast(client, device, taglist):
   #loop through tags, order by address, group consecutive addresses in single reads, merge resulting lists, decode
   orderedtaglist = sorted(taglist, key = lambda i: i['address'])
   callgroups = sorttogroups(orderedtaglist)
   allreturns = []
   results = []

   for acall in callgroups:
       areturn = client.read_holding_registers(acall['start'], (1 + (acall['end'] - acall['start'])), unit=device['device_id'])
       allreturns = allreturns + areturn.registers

   decoder = BinaryPayloadDecoder.fromRegisters(allreturns, byteorder=Endian.Big, wordorder=Endian.Big)

   for tag in orderedtaglist:
       results.append({'tagname': tag['name'], 'value': str(tag['autoScaling']['slope'] * mydecoder(tag['dataType'], decoder)), 'unit': tag['unit']})

   client.close()
   return results

这一切都不是非常复杂-它只是似乎已经有了一个公认的标准或模板,这在某个地方,我似乎找不到他们的任何文件在线


Tags: 函数inclientreaddevicetagunitresults