通过 Modbus RTU 与 MultiCONT PRD-28-2 进行通信时出现问题 - Raspberry Pi 4
Problem with communication via Modbus RTU with MultiCONT PRD-28-2 - Raspberry Pi 4
我在通过 Modbus RTU 进行通信时遇到问题。首先对不起我的英语 ;):
- 我正在使用 RS485 Pi SN65HVD72 连接 MultiCONT PRD-28-2。我在这条指令中做了一切:https://www.abelectronics.co.uk/kb/article/1035/raspberry-pi-3-serial-port-usage
config.txt 变化:
- toverlay=pi3-miniuart-bt
- enable_uart=1
执行完这些步骤后,我的 /dev 的配置如下所示:
- lrwxrwxrwx 1 root root 7 gru 30 15:03 serial0 -> ttyAMA0
- lrwxrwxrwx 1 root root 5 gru 30 15:03 serial1 -> ttyS0
- 在 MultiCONT PRD-28-2 中,我将 RS485 选项更改为:
- 协议:Modbus
- 奇偶校验:奇偶校验
- 停止位:1位
- Python代码:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
#multicont = ModbusClient(method='rtu',port='/dev/serial0',stopbits=1,bytsize=8,parity='N',baudrate=9600,timeout=1,strict=False)
multicont = ModbusClient(method='rtu',port='/dev/serial0',stopbits=1,bytsize=8,parity='O',baudrate=9600,timeout=1,strict=False)
connection = multicont.connect()
print(connection)
value = multicont.read_coils(1,15,unit=1)
log.debug(value)
- 错误信息:
Modbus Error: [Input/Output] Modbus Error: [Invalid Message]
Incomplete message received, expected at least 2 bytes (0 received)
- 日志:
2020-12-30 16:24:51,992 MainThread DEBUG transaction :118
Current transaction state - IDLE
2020-12-30 16:24:51,992
MainThread DEBUG transaction :123 Running transaction
1
2020-12-30 16:24:51,992 MainThread DEBUG transaction
:230 SEND: 0x1 0x1 0x0 0x1 0x0 0xf 0x2d 0xce
2020-12-30
16:24:51,993 MainThread DEBUG sync :75 New
Transaction state 'SENDING'
2020-12-30 16:24:51,993 MainThread
DEBUG transaction :239 Changing transaction state from
'SENDING' to 'WAITING FOR REPLY'
2020-12-30 16:24:52,995
MainThread DEBUG transaction :253 Transaction failed.
(Modbus Error: [Invalid Message] Incomplete message received, expected
at least 2 bytes (0 received))
2020-12-30 16:24:52,995
MainThread DEBUG rtu_framer :241 Frame - [b''] not
ready
2020-12-30 16:24:52,996 MainThread DEBUG
transaction :409 Getting transaction 1
2020-12-30
16:24:52,996 MainThread DEBUG transaction :204
Changing transaction state from 'PROCESSING REPLY' to
'TRANSACTION_COMPLETE'
2020-12-30 16:24:52,996 MainThread
DEBUG communication :20 Modbus Error: [Input/Output] Modbus
Error: [Invalid Message] Incomplete message received, expected at
least 2 bytes (0 received)
PyModbus 没有收到响应。
如果您可以使用示波器,现在就是使用它的时候了。 Modbus-RTU 可能会出错的地方太多了。
确保你知道你在用电线做什么,熟悉 RS485 偏置和端接。
可能的原因:
- 请求发送到错误的序列号device/interface
- 设备使用不同的波特率或串口设置
- 设备可以正常听到您的声音,但配置了不同的从属 ID,因此它没有响应
- 接线错误,接地问题
- RS485 电气问题,最显着的是主机必须偏置总线,通常通过您必须 solder/enable
的电阻器
- 正确的电压电平需要总线终端电阻(有时它们已经是内置的,更多时候您需要启用它们,运气好的话可以不用)
- 从机响应时,主机仍在驱动RS485总线。 (如果您没有专用的 RS485 驱动程序,总线可能会被不可靠的软件计时器 asserted/deasserted 结束。一些设备允许您配置响应延迟作为解决方法。)
- 师父根本不开车。 (工作在 RS232 模式而不是 RS485 模式。)
- 此外,Linux 可能将 ttyAMA0 配置为 boot/kernel 消息的串行控制台。 (这不太可能导致您当前的问题,只是需要注意其他事项。)
最后一条建议:如果您可以选择使用 Modbus-TCP 而不是 Modbus-RTU,改为。这取代了所有令人头疼的 RS485 电气问题,即 IP 配置问题,对此您可以使用非处方药。
我在通过 Modbus RTU 进行通信时遇到问题。首先对不起我的英语 ;):
- 我正在使用 RS485 Pi SN65HVD72 连接 MultiCONT PRD-28-2。我在这条指令中做了一切:https://www.abelectronics.co.uk/kb/article/1035/raspberry-pi-3-serial-port-usage
config.txt 变化:
- toverlay=pi3-miniuart-bt
- enable_uart=1
执行完这些步骤后,我的 /dev 的配置如下所示:
- lrwxrwxrwx 1 root root 7 gru 30 15:03 serial0 -> ttyAMA0
- lrwxrwxrwx 1 root root 5 gru 30 15:03 serial1 -> ttyS0
- 在 MultiCONT PRD-28-2 中,我将 RS485 选项更改为:
- 协议:Modbus
- 奇偶校验:奇偶校验
- 停止位:1位
- Python代码:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
#multicont = ModbusClient(method='rtu',port='/dev/serial0',stopbits=1,bytsize=8,parity='N',baudrate=9600,timeout=1,strict=False)
multicont = ModbusClient(method='rtu',port='/dev/serial0',stopbits=1,bytsize=8,parity='O',baudrate=9600,timeout=1,strict=False)
connection = multicont.connect()
print(connection)
value = multicont.read_coils(1,15,unit=1)
log.debug(value)
- 错误信息:
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)
- 日志:
2020-12-30 16:24:51,992 MainThread DEBUG transaction :118
Current transaction state - IDLE
2020-12-30 16:24:51,992 MainThread DEBUG transaction :123 Running transaction 1
2020-12-30 16:24:51,992 MainThread DEBUG transaction
:230 SEND: 0x1 0x1 0x0 0x1 0x0 0xf 0x2d 0xce
2020-12-30 16:24:51,993 MainThread DEBUG sync :75 New Transaction state 'SENDING'
2020-12-30 16:24:51,993 MainThread
DEBUG transaction :239 Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
2020-12-30 16:24:52,995 MainThread DEBUG transaction :253 Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received))
2020-12-30 16:24:52,995 MainThread DEBUG rtu_framer :241 Frame - [b''] not ready
2020-12-30 16:24:52,996 MainThread DEBUG
transaction :409 Getting transaction 1
2020-12-30 16:24:52,996 MainThread DEBUG transaction :204
Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
2020-12-30 16:24:52,996 MainThread
DEBUG communication :20 Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)
PyModbus 没有收到响应。
如果您可以使用示波器,现在就是使用它的时候了。 Modbus-RTU 可能会出错的地方太多了。
确保你知道你在用电线做什么,熟悉 RS485 偏置和端接。
可能的原因:
- 请求发送到错误的序列号device/interface
- 设备使用不同的波特率或串口设置
- 设备可以正常听到您的声音,但配置了不同的从属 ID,因此它没有响应
- 接线错误,接地问题
- RS485 电气问题,最显着的是主机必须偏置总线,通常通过您必须 solder/enable 的电阻器
- 正确的电压电平需要总线终端电阻(有时它们已经是内置的,更多时候您需要启用它们,运气好的话可以不用)
- 从机响应时,主机仍在驱动RS485总线。 (如果您没有专用的 RS485 驱动程序,总线可能会被不可靠的软件计时器 asserted/deasserted 结束。一些设备允许您配置响应延迟作为解决方法。)
- 师父根本不开车。 (工作在 RS232 模式而不是 RS485 模式。)
- 此外,Linux 可能将 ttyAMA0 配置为 boot/kernel 消息的串行控制台。 (这不太可能导致您当前的问题,只是需要注意其他事项。)
最后一条建议:如果您可以选择使用 Modbus-TCP 而不是 Modbus-RTU,改为。这取代了所有令人头疼的 RS485 电气问题,即 IP 配置问题,对此您可以使用非处方药。