python - PyModbus 效率与乱序寄存器和不同的功能
问题描述
我最近开始使用 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
这一切都不是非常复杂 - 似乎在某个地方已经有一个公认的标准或模板,我似乎在他们的任何在线文档中都找不到。
解决方案
推荐阅读
- jupyter-notebook - 查看本地和远程分支之间的 jupyter notebook 差异
- php - unserialize():在第 150 行的 /home1/chiqmvaz/public_html/admin/model/extension/module/so_megamenu.php 中的 11300 字节偏移 5399 处出错
- php - Transliterator 音译规则
- angular - 如何从角度的下拉列表中删除选定的选项
- haskell - 无法将预期类型 '[foo]' 与实际类型 'Maybe [foo]' 匹配
- indexing - 对netbeans“启用源自动扫描”选项感到困惑
- r - 在 R 中将数值数据变量更改为日期格式以合并两个数据集
- python - NameError:名称“文件”未定义。在使用 tkinter 线程时
- powershell - 未为 PS Core RunspacePool 调用 InitialSessionState 中的 StartupScripts
- pandas - Pandas 数据框将特征划分为高相关性组