Эффективность PyModbus при неупорядоченных регистрах и различных функциях

#python #modbus #pymodbus

#python #modbus #pymodbus

Вопрос:

Недавно я начал использовать PyModbus и обнаружил, что очень легко выполнять базовый опрос с помощью их функций ModbusTCPClient и read_holding_registers.

Сейчас меня интересуют наилучшие способы структурирования более сложного регистратора — непоследовательные регистры, разные коды функций, различная кодировка в конце строки и т.д.

Например, чтобы избежать отдельного вызова ‘read_holding_registers’ для каждого тега устройства, я создал функцию, которая группирует все последовательные регистры тегов, чтобы уменьшить количество вызовов.

Я планирую реализовать аналогичную вещь для двоичных файлов — группировать по регистрам с одинаковыми byteorder и wordorder, чтобы уменьшить количество экземпляров декодера.

 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
  

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

Комментарии:

1. вы можете использовать один и тот же декодер, вызывая decoder.reset() перед каждым действием декодирования, чтобы каждый раз иметь дело с новым набором регистров.