我正在尝试使用modbus-tk
通过RS-485网络通过Modbus RTU与设备进行串行通信。
要了解如何使用modbus-tk
,我正在尝试查询:
Year of Manufacture
0x7543 = 30019
1
2019
(使用free master modbus simulator验证)。这是我使用的代码,主要基于rtumaster_example.py。输入:
#!/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,
)
)
输出:
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
看来是例外情况>
您认为我做错了什么?我是这个图书馆的新手。
我读过的内容
pyserial >= 3.1
modbus-tk
标记下的所有其他问题,Google网上论坛中的一些帖子以及回购示例[+ README.md
设备详细信息
包裹
我正在Windows 10上使用Python 3.6。
pyserial==3.4 modbus-tk==1.1.0
**编辑1 **
根据@Brits的评论,我将注册表地址更新为正确的功能代码和数据框地址。
**编辑2 **
已更新问题,因为在更正确地使用库后出现另一个错误。
我正在尝试使用modbus-tk在RS-485网络上通过Modbus RTU与设备进行串行通信。为了了解如何使用modbus-tk,我尝试查询:输入寄存器:制造年份...
我的问题是对Master.execute
方法缺乏了解。我没有意识到需要将quantity_of_x
参数设置为非零。特别感谢@Brits帮助指出我的原始代码中存在的几个关键问题。