0

我正在使用 modbus-tk 为 unittest 模拟 modbus 设备。

我添加了 2 个块数据。

def add_test_1(self):
    point = "Test_1"
    addr = 40003
    self.slave_1.add_block(point, mbdefines.HOLDING_REGISTERS, addr, 1)
    self.slave_1.set_values(point, addr, 5)

def add_test_2(self):
    point = "Test_2"
    addr = 40004
    self.slave_1.add_block(point, mbdefines.HOLDING_REGISTERS, addr, 2)
    self.slave_1.set_values(point, addr, (16560, 0))

但是当我使用 modbus-tk 读取多寄存器时。

result = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40003, 3)
print(result)

引发异常。

Modbus Error: Exception code = 2

同时,我仍然可以使用这个在真实的 Modbus 设备中读取多个数据

result = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40003, 3)
print(result)

数据看起来像块数据,我之前展示过

我正在使用 python 3.7.3 64 位

4

1 回答 1

0

问题是您创建了两个不同的块。

def add_test_1(self):
    point = "Test_1"
    addr = 40003
    self.slave_1.add_block(point, mbdefines.HOLDING_REGISTERS, addr, 1)
    self.slave_1.set_values(point, addr, 5)

def add_test_2(self):
    point = "Test_2"
    addr = 40004
    self.slave_1.add_block(point, mbdefines.HOLDING_REGISTERS, addr, 2)
    self.slave_1.set_values(point, addr, (16560, 0))

两个块都可以读取,但使用两个不同的命令:

result_test_1 = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40003, 1)
print(result_test_1 )
# (5, )

result_test_2 = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40004, 2)
print(result_test_2 )
# (16560, 0, )

您还可以创建一个块并读取它:

def add_test():
    point = "Test_1"
    addr = 40003
    slave_1.add_block(point, cst.HOLDING_REGISTERS, addr, 3)
    slave_1.set_values(point, addr, (5, 16560, 0))

result_test = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40003, 3)
print(result_test)
# (5, 16560, 0, )

正如您在 github 上看到的那样,有一个_get_block_and_offset被调用的函数_read_registers。当您从从属服务器读取结果时,服务器调用_read_holding_registers返回结果的函数_read_registers,但是当它到达对它的调用时,_get_block_and_offset由于ModbusError(defines.ILLEGAL_DATA_ADDRESS)条件不满足,所以address >= block.starting_address永远不会到达。block.size >= offset + lengthreturn block, offset

于 2021-09-27T09:42:52.577 回答