我尝试使用串行连接从我的 Mac 笔记本电脑连接到 Modbus 设备 ( MR-SI4 ),该连接使用“安装”到 /dev/cu.SLAB_USBtoUART
的 USB RS485 转换器。
这是我的代码:
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)
控制台中的输出是:
$ 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_inputs
或 read_holding_registers
等不同的功能。有什么帮助吗?谢谢
最佳答案
使用 modbus 时,即使您使用的是高级库,手边有官方的 modbus documentation 总是很有用的。
通过文档,您可以检查帧的每个字节的含义:
0x01 0x04 0x00 0x00 0x00 0x01 0x31 0xCA
第一个字节是设备地址
(0x01)
第二个字节是函数代码
(0x04, Read Input Registers)
第三和第四个字节是起始位置
(0x00, 0x00)
第五个和第六个字节是输出的数量
(0x00, 0x01)
最后2个字节是CRC控制
(0x31, 0xCA)
这意味着您要从地址为 1
(0x00, 0x01)
的设备的内存 (0x04)
的第一个位置的输入寄存器 (0x00, 0x00)
中请求一个 (0x01)
寄存器。帧本身是正确的,如果设备软件/固件遵循 modbus 标准,您应该有一个答案:您要求的寄存器或错误帧
(0x01, 0x80, crc, crc)
。这就是说,我们可以检查为什么您没有从您的设备收到答案。为此,如果您不确定您的代码/您要问什么/您的设备如何运行,您可以使用外部工具来比较结果。我建议你像 docklight 这样的想法,它可以帮助你设置连接和发送/接收 modbus 帧。
我要检查的第一件事是连接参数:
client = ModbusClient(method='rtu', port=SERIAL, stopbits=1, bytesize=8, timeout=3, baudrate=BAUD, parity='E')
如果您不知道波特率和/或奇偶校验的正确值,您可以尝试使用 most commons baudrates 和奇偶校验值:
'N', 'E', 'O', 'M', 'S'
(代表:None、Even、Odd、Mark、Space。默认为 None)。如果我必须打赌,我会首先用 None (
parity = 'N'
) 替换 Even parity 。如果问题仍然存在,可能是设备地址(
0x01
)有误。地址可以表示为从 0 ( 0x00
) 到 255 ( 0xFF
) 的值。根据协议(protocol)标准,即使起始地址 (
0x00, 0x00
)、输出数量 ( 0x00, 0x01)
或 crc ( 0x31, 0xCA
) 是错误的,设备也应该做出响应,但并非总是这样:如果您认为自己处于这种情况, 研究设备的特定文档。最后一种可能性是使用低级库,例如 PySerial ,然后您定义自己的协议(protocol)。
关于python - Modbus 错误 : [Input/Output] No Response received from the remote unit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47817634/