2

我目前正在尝试实现具有自定义功能代码的 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 工厂注册请求和响应。

有没有一种优雅的方法可以在不修补库的情况下做到这一点?

4

0 回答 0