Эффективность PyModbus с неработающими регистрами и различными функциями - PullRequest
1 голос
/ 18 марта 2019

Я недавно начал использовать 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

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

...