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

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

Stack Overflow用户
提问于 2020-01-21 03:26:33
回答 1查看 1.4K关注 0票数 0

我试图使用modbus-tk通过RS-485网络通过Modbus RTU与设备进行串行通信。

为了理解如何使用modbus-tk,我试图查询:

  • 输入寄存器:Year of Manufacture
  • 注册地址:0x7543 = 30019
  • 设备:1
  • 数据类型:16位整数
  • Value = 2019 (使用免费主modbus模拟器验证)。

下面是我使用的代码,主要基于example.py。输入:

代码语言:javascript
复制
#!/usr/bin/env python3


import time
from collections import namedtuple
from logging import Logger

from serial import Serial
from modbus_tk import modbus_rtu
import modbus_tk.defines as cst  # cst = constants
from modbus_tk.utils import create_logger


PORT = "COM3"
SLAVE_NUM = 1
MODBUS_MASTER_TIMEOUT_SEC = 5.0

ModbusReg = namedtuple("ModbusInputRegister", ["name", "block_type", "address"])

year_of_manuf = ModbusReg(
    "year of manufacture", cst.HOLDING_REGISTERS, 18
)  # 0x7543 = 30019


logger = create_logger(name="console")  # type: Logger
serial_ = Serial(PORT)
modbus_master = modbus_rtu.RtuMaster(serial_)
modbus_master.set_timeout(MODBUS_MASTER_TIMEOUT_SEC)
modbus_master.set_verbose(True)
time.sleep(2)  # Per https://github.com/ljean/modbus-tk/issues/73#issuecomment-284800980

logger.info(
    modbus_master.execute(
        slave=SLAVE_NUM,
        function_code=cst.READ_INPUT_REGISTERS,
        starting_address=year_of_manuf.address,
    )
)

输出:

代码语言:javascript
复制
2020-01-21 10:38:09,031 INFO    modbus_rtu.__init__     MainThread      RtuMaster COM3 is opened
2020-01-21 10:38:11,048 DEBUG   modbus.execute  MainThread      -> 1-4-0-18-0-0-80-15
2020-01-21 10:38:11,077 DEBUG   modbus.execute  MainThread      <- 1-132-3-3-1
---------------------------------------------------------------------------
ModbusError                               Traceback (most recent call last)
<ipython-input-2-9afaebcf3a35> in <module>
      7     slave=SLAVE_NUM,
      8     function_code=cst.READ_INPUT_REGISTERS,
----> 9     starting_address=year_of_manuf.address,
     10 )

c:\path\to\venv\lib\site-packages\modbus_tk\utils.py in new(*args, **kwargs)
     37             ret = fcn(*args, **kwargs)
     38         except Exception as excpt:
---> 39             raise excpt
     40         finally:
     41             if threadsafe:

c:\path\to\venv\lib\site-packages\modbus_tk\utils.py in new(*args, **kwargs)
     35             lock.acquire()
     36         try:
---> 37             ret = fcn(*args, **kwargs)
     38         except Exception as excpt:
     39             raise excpt

c:\path\to\venv\lib\site-packages\modbus_tk\modbus.py in execute(self, slave, function_code, starting_address, quantity_of_x, output_value, data_format, expected_length)
    312                 # the slave has returned an error
    313                 exception_code = byte_2
--> 314                 raise ModbusError(exception_code)
    315             else:
    316                 if is_read_function:

ModbusError: Modbus Error: Exception code = 3

看起来这个异常是因为如果the slave has returned an error

你觉得我做错了什么?我是这个图书馆的新手。

我所读到的

  • tk,我在用pyserial >= 3.1
  • 还有modbus-tk标签下的所有其他问题,Google组中的一些帖子,以及回购公司的示例+ README.md

设备规范

  • 器件: SST传感的OXY-LC-485
  • Modbus RTU,9600/8-N-1
  • 用户指南 ( 7.1.2.1节包含一组输入寄存器)
  • 设备插入到我运行Python脚本的Windows机器中

我在Windows 10上使用Python3.6。

代码语言:javascript
复制
pyserial==3.4
modbus-tk==1.1.0

**编辑1**

在@Brits注释中,我更新了我的注册表地址,使其成为正确的函数代码和数据帧地址。

**编辑2**

更新的问题,因为我得到了一个不同的错误后,更正确的库使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-22 03:10:31

我的问题是对Master.execute方法缺乏了解。我没有意识到quantity_of_x参数需要变成非零。特别感谢@Brits帮助我指出了我的原始代码中的几个关键问题。

当arg function_code == defines.READ_INPUT_REGISTERS时,quantity_of_x是指读取(,第138行)的H数量(C类型,无符号短,长度=2字节=16位,来源)。

由于设备的year_of_manuf寄存器数据类型为16位无符号整数,正确的更改是添加quantity_of_x=1作为参数。

职能投入:

代码语言:javascript
复制
logger.info(
    modbus_master.execute(
        slave=SLAVE_NUM,
        function_code=cst.READ_INPUT_REGISTERS,
        starting_address=year_of_manuf.address,
        quantity_of_x=1,
    )
)

输出:

代码语言:javascript
复制
2020-01-21 18:42:05,520 DEBUG   modbus.execute  MainThread      -> 1-4-0-18-0-1-145-207
2020-01-21 18:42:05,560 DEBUG   modbus.execute  MainThread      <- 1-4-2-7-227-250-137
2020-01-21 18:42:05,562 INFO    <ipython-input-1-2d4d0280e33d>.<module> MainThread      (2019,)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59833802

复制
相关文章

相似问题

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