Я недавно начал использовать 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
Ничто из этого не является чрезвычайно сложным- просто кажется, что где-то уже должен быть принятый стандарт или шаблон, который я не могу найти ни в одной из их документации в Интернете.