通过USB转rs485与Modbus设备通信时出现问题。
所以我使用了一些Python3.5,并使用了PyModbus,PySerial
我的代码是基于PyModbus的串口示例,在windows下运行良好,并能正确地与Modbus设备通信。
当我在运行Ubuntu mate 16.04.5LTS的树莓派Pi3上运行我的代码时,设备没有响应我的代码。我最初以为适配器没有正确安装,但在仔细检查所有内容之后,我安装了gtkterm并将端口配置为/dev/ttyUSB0 9600 8-n-2,并尝试将十六进制数据发送到Modbus,但仍然没有响应。然后我注意到,在流控制下,它有RS485-HalfDuplex( RTS )设置,在高级选项下,如果我将发送延迟设置为20毫秒,关闭10毫秒RTS,则会出现问题
现在,当我尝试发送十六进制模式数据包时,设备会按预期响应。
我连接了我的示波器,从python代码中,它正在随机传输一些小数据包,看起来更像是在超时后发送数据。经过深入研究,似乎一些USB转rs485设备需要RTS将设备切换到发送模式,然后关闭RTS才能将其恢复到接收模式。
我还发现pySerial有一个RS485设置,并尝试了这些设置,然后之前传输的包更规则、更大,但仍然比gtkterm短得多,而且在计时方面做了很多调整,现在我又回到了使用原始代码的地方,但输入了
socket.setRTS(1)
time.sleep(0.02)
socket.write(request)
time,sleep(0.1)
socket.setRTS(0)
似乎给了我在示波器上捕捉到的最长的包,但包是8.42ms长,只要gtkterm的包是9.36ms,在两个消息之间的痕迹一瞥,似乎包的末尾丢失了。但是,即使我在关闭RTS信号之前增加睡眠时间,也没有什么不同。
发布于 2018-10-03 21:56:15
安装interceptty并让gtkterm使用虚拟端口后,由于interceptty不支持RTS和DTR,它发出了错误消息的音调,但由于某些原因,它仍然能够与modbus设备通信,
然后,我将我的python代码指向interceptty虚拟端口,并且我正在传输与gtkterm相同的信息,但是没有响应,但是我注意到我写数据的速度要快得多。
所以我更改了代码,一次只发送一个字节,它们之间有10ms的延迟,然后它突然开始工作了。
因此,使用来自pyModbus https://pymodbus.readthedocs.io/en/latest/的示例代码,我编辑了client/sync.py
添加了2个额外的导入
import time
import struct
并对ModbusSerialClient的_send函数做了一些改动
从…
size = self.socket.write(request)
至
size=0
for item in request:
size = self.socket.write(struct.pack(">B",item))
time.sleep(0.01)
size=len(request)
https://stackoverflow.com/questions/52618249
复制相似问题