我使用modbus-tk模拟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位
发布于 2021-09-27 09:42:53
问题是您创建了两个不同的块。
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上有一个由_read_registers
调用的名为_get_block_and_offset
的函数。当您从从服务器读取时,服务器调用返回_read_registers
结果的函数_read_holding_registers
,但是当它到达对_get_block_and_offset
的调用时,它会引发ModbusError(defines.ILLEGAL_DATA_ADDRESS)
,因为条件address >= block.starting_address
和block.size >= offset + length
不满足,所以永远不会到达return block, offset
。
https://stackoverflow.com/questions/68403745
复制相似问题