我最近开始使用PyModbus,发现使用其ModbusTCPClient和read_holding_registers函数进行基本轮询非常容易。
我现在对构建更复杂的记录器的最佳方法感兴趣-非连续寄存器,不同的功能代码,不同的Endian编码等。
例如-为了避免对设备的每个标签进行单独的“ read_holding_registers”调用,我构建了一个对所有连续标签寄存器进行分组的函数,以减少调用次数。
我正计划对BinaryPayloadDecoders实现类似的操作-按字节序和字序相同的寄存器分组,以减少解码器实例的数量。
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
这些都不是非常复杂的-似乎必须已经有一个公认的标准或模板,这在我的任何在线文档中都找不到。