问题是通过USB到rs485与Modbus设备通信。
所以我正在使用一些python 3.5,并且正在使用PyModbus,PySerial
我的代码基于PyModbus串行示例,并且在Windows下可以正常工作并正确地与Modbus设备通信
当我在运行Ubuntu mate 16.04.5 LTS的Raspberry Pi3上运行代码时,设备没有响应我的代码。 我首先以为适配器未正确安装,但在仔细检查了所有内容之后, 我安装了gtkterm并将端口配置为/ dev / ttyUSB0 9600 8-n-2,并尝试将十六进制数据发送到Modbus,但仍然没有回复 然后我注意到在流控制下它具有RS485-HalfDuplex(RTS)设置,并且在高级选项下,如果我将发送延迟设置为20毫秒和10 ms RTS关闭
现在,当我尝试发送十六进制模式数据包时,设备将按预期进行响应。
我连接了我的示波器,并从python代码中发送了一些小的数据包,它们看起来更像是在发送数据超时后。 经过一番摸索之后,似乎有些USB到rs485设备需要RTS将其切换到发送模式,然后再关闭RTS使其回到接收模式。
我还发现pySerial具有RS485设置,并尝试了这些设置,然后传输的数据包比gtkterm更规则和更大,但比gtkterm短得多,并且在时间上的混乱使我有了一些帮助,现在回到使用原始代码,但放入
socket.setRTS(1)
time.sleep(0.02)
socket.write(request)
time,sleep(0.1)
socket.setRTS(0)
似乎给了我在示波器上拾取的最长数据包,但该数据包的长度为8.42ms,而来自gtkterm的数据包的长度为9.36ms,并且看一下这两个消息的踪迹,好像数据包的结尾一样不见了。但是即使我在关闭RTS信号之前增加了睡眠时间,也没什么区别。
答案 0 :(得分:0)
在安装侦听器并让gtkterm使用虚拟端口后,确定了错误消息,因为侦听器不支持RTS和DTR,但是由于某种原因,它仍然能够与Modbus设备通信,
>然后,我将python代码指向了可拦截虚拟端口,并且正在传输与gtkterm相同的信息,但是没有响应,但是我发现写入数据的速度更快
然后我将代码更改为一次只发送1个字节,并且它们之间的延迟为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)