首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Modbus错误:[输入/输出]未收到来自远程单元的响应

Modbus错误:[输入/输出]未收到来自远程单元的响应
EN

Stack Overflow用户
提问于 2017-12-15 00:05:54
回答 3查看 4.4K关注 0票数 3

我正在尝试从我的Mac笔记本电脑连接到Modbus设备(MR-SI4),使用串行连接,使用USB RS485转换器,它可以“安装”到/dev/cu.SLAB_USBtoUART

这是我的代码:

代码语言:javascript
运行
复制
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

from pymodbus.constants import Endian
from pymodbus.constants import Defaults
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.transaction import ModbusRtuFramer

# settings for USB-RS485 adapter
SERIAL = '/dev/cu.SLAB_USBtoUART'
BAUD = 19200

# set Modbus defaults

Defaults.UnitId = 1
Defaults.Retries = 5

client = ModbusClient(method='rtu', port=SERIAL, stopbits=1, bytesize=8, timeout=3, baudrate=BAUD, parity='E')

connection = client.connect()
print "Readout started"

#result = client.read_discrete_inputs(0)
#result = client.read_holding_registers(12,19)
result = client.read_input_registers(0,1)
print(result)

控制台中的输出为:

代码语言:javascript
运行
复制
$ sudo python test.py 
Readout started
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:send: 0x1 0x4 0x0 0x0 0x0 0x1 0x31 0xca
DEBUG:pymodbus.client.sync:will sleep to wait for 3.5 char
DEBUG:pymodbus.transaction:recv: 
DEBUG:pymodbus.transaction:getting transaction 1
Modbus Error: [Input/Output] No Response received from the remote unit

我希望能得到一些帮助来理解我所得到的错误。我尝试了pymodbus的配置,也尝试了不同的函数,如read_discrete_inputsread_holding_registers。有什么帮助吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2018-01-22 21:37:19

在使用modbus时,即使您使用的是高级库,在手边有官方的modbus documentation也总是很有用的。有了文档,您可以检查帧的每个字节的含义:

代码语言:javascript
运行
复制
0x01 0x04 0x00 0x00 0x00 0x01 0x31 0xCA

第一个字节是设备地址(0x01)

第二个字节是功能代码(0x04, Read Input Registers)

第三个和第四个字节是起始位置(0x00, 0x00)

第五和第六个字节是输出(0x00, 0x01)的数量

最后2个字节是CRC控制(0x31, 0xCA)

这意味着您从地址为1 (0x00, 0x01)的器件的内存(0x00, 0x00)中的第一个位置请求输入寄存器(0x04)中的一个(0x00, 0x01)寄存器。

帧本身是正确的,如果设备软件/固件遵循modbus标准,您应该会得到一个答案:您要求的寄存器或错误帧(0x01, 0x80, crc, crc)

这就是说,我们可以检查为什么您的设备没有收到应答。要做到这一点,如果你不确定你的代码/你问的是什么/你的设备是如何工作的,你可以使用外部工具来比较结果。我建议你像docklight一样思考,它可以帮助你建立连接和发送/接收modbus帧。

我首先要检查的是连接参数:

代码语言:javascript
运行
复制
client = ModbusClient(method='rtu', port=SERIAL, stopbits=1, bytesize=8, timeout=3, baudrate=BAUD, parity='E')

方法是正确的,因为这是您请求的协议。

端口正确,否则将返回系统错误。

超时是引发错误的原因:在给定的时间内,没有收到响应。无论如何,问题可能不在这里,因为您为timeout设置了一个较高的值。

停止位不应干扰帧接收。

问题可能出在波特率和奇偶校验上:这里的错误可能会导致代码引发的错误。

如果您不知道波特率和/或奇偶校验值的正确值,可以尝试使用most commons baudrates和奇偶校验值:'N', 'E', 'O', 'M', 'S' (代表:无、偶、奇、标记、空格。默认值为None)。

如果我必须打赌,我会从将偶数奇偶校验替换为None (parity = 'N')开始。

如果问题仍然存在,则可能是设备地址(0x01)错误。地址可以表示为从0 (0x00)到255 (0xFF)的值。

根据协议标准,即使起始地址(0x00, 0x00)、输出数量(0x00, 0x01)0x31, 0xCA)错误,设备也应该响应一些东西,但情况并不总是这样:如果您认为自己处于这种情况,请研究设备的特定文档。

最后一种可能是使用低级库,例如PySerial,然后您可以定义自己的协议。

票数 4
EN

Stack Overflow用户

发布于 2018-10-13 17:07:30

检查此Stack_post

你可以处理这个错误:

代码语言:javascript
运行
复制
if not result.isError():
    '''isError() method implemented in pymodbus 1.4.0 and above'''

    print(result.registers)  # Note.

else:
    # Handle Error.
    print('Unable to read or there is the connection problem.')

笔记

根奇偶校验在许多情况下,RTU奇偶校验是None:在串行端口(/dev/cu.SLAB_USBtoUART).上,从根权限parity='N'

  • Make
票数 0
EN

Stack Overflow用户

发布于 2019-07-23 22:35:02

我可以通过将常量RetryOnEmpty设置为True来解决此问题。

代码语言:javascript
运行
复制
from pymodbus.constants import Defaults
Defaults.RetryOnEmpty = True

配置超时和一些重试可能也很有用。

代码语言:javascript
运行
复制
Defaults.Timeout = 5
Defaults.Retries = 5

https://pymodbus.readthedocs.io/en/v1.3.2/library/constants.html

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

https://stackoverflow.com/questions/47817634

复制
相关文章

相似问题

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