#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()
перед каждым действием декодирования, чтобы каждый раз иметь дело с новым набором регистров.