【问题标题】:modbus-tk getting Modbus Error: Exception code = 2modbus-tk 得到 Modbus 错误:异常代码 = 2
【发布时间】:2021-09-24 22:45:07
【问题描述】:

我正在使用 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 位

【问题讨论】:

    标签: python-3.x modbus-tcp modbus-tk


    【解决方案1】:

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

    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_addressblock.size >= offset + length 不是满意,所以永远不会到达return block, offset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2020-01-11
      相关资源
      最近更新 更多