pymodbus - 如何在pymodbus中实现带有自定义功能代码的消息?
问题描述
我目前正在尝试实现具有自定义功能代码的 modbus 请求。实现基于这个例子:custom_message.py
import struct
from pymodbus.pdu import ModbusRequest, ModbusResponse
from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient('192.168.0.55')
connection = client.connect()
class CustomModbusResponse(ModbusResponse):
# some fancy decoding should be done here..
pass
class CustomModbusRequest(ModbusRequest):
function_code = 55
def __init__(self, address):
ModbusRequest.__init__(self)
self.address = address
self.count = 1
def encode(self):
return struct.pack('>HH', self.address, self.count)
def decode(self, data):
self.address, self.count = struct.unpack('>HH', data)
def execute(self, context):
if not (1 <= self.count <= 0x7d0):
return self.doException(ModbusExceptions.IllegalValue)
if not context.validate(self.function_code, self.address, self.count):
return self.doException(ModbusExceptions.IllegalAddress)
values = context.getValues(self.function_code, self.address,
self.count)
return CustomModbusResponse(values)
request = CustomModbusRequest(0)
result = client.execute(request)
print(result)
该请求按预期工作。我可以在网络层看到正确的响应。但是我无法解析结果。Pymodbus 抛出以下错误:
DEBUG:pymodbus.factory:Factory Response[55]
ERROR:pymodbus.factory:Unable to decode response Modbus Error: Unknown response 55
ERROR:pymodbus.transaction:Modbus Error: [Input/Output] Unable to decode request
该示例指出,在这种情况下,我必须:
如果您实现了当前未实现的新方法,则必须向 ClientDecoder 工厂注册请求和响应。
有没有一种优雅的方法可以在不修补库的情况下做到这一点?
解决方案
推荐阅读
- python - 解析文本文件时意外覆盖变量(python)
- html - 第二次迭代时反应组件中不必要的填充?
- ios - Mapbox iOS 集群工作,但圆形样式层和数字层没有出现/反映集群的标记密度
- python - 使用自己的数据使用 Tensor2Tensor 训练 Transformer
- javascript - 如何在不验证缓存的情况下更新背景图像
- powershell - Powershell 使用 'out-file' 省略 CRLF 输出
- freertos - OpenVPN + Radius认证如何断开用户连接
- mysql - 使用相关表的正确方法和可能的解决方法?
- javascript - 连续的 html() 调用覆盖第一个
- angular - 无法在 AOT 模式下动态生成的 Angular 模块中的动态生成组件的模板中使用异步管道