首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >modbus-tk获取Modbus错误:异常代码=2

modbus-tk获取Modbus错误:异常代码=2
EN

Stack Overflow用户
提问于 2021-07-16 13:12:17
回答 1查看 116关注 0票数 0

我使用modbus-tk模拟modbus设备进行单元测试。

我被添加了2块数据。

代码语言:javascript
运行
复制
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读取多个寄存器时。

代码语言:javascript
运行
复制
result = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40003, 3)
print(result)

将引发异常。

Modbus Error: Exception code = 2

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

代码语言:javascript
运行
复制
result = modbus_client.execute(1, mbdefines.READ_HOLDING_REGISTERS, 40003, 3)
print(result)

由于数据看起来像块数据,所以我之前展示了它

我使用的是python 3.7.3 64位

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-27 09:42:53

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

代码语言:javascript
运行
复制
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))

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

代码语言:javascript
运行
复制
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, )

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

代码语言:javascript
运行
复制
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_addressblock.size >= offset + length不满足,所以永远不会到达return block, offset

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68403745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档