【问题标题】:Ubuntu mate Python using PySerial via RS485 half duplex transmit problemsUbuntu mate Python 使用 PySerial 通过 RS485 半双工传输问题
【发布时间】:2018-10-03 00:51:48
【问题描述】:

通过 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 毫秒 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.42 毫秒,而来自 gtkterm 的数据包为 9.36 毫秒,并且在两条消息的跟踪之间一目了然,似乎数据包的结尾不见了。但即使我在关闭 RTS 信号之前增加睡眠时间也没有什么区别。

【问题讨论】:

    标签: python ubuntu modbus rs485


    【解决方案1】:

    好的,在安装interceptty 并让gtkterm 使用虚拟端口后,它发出了错误消息的音调,因为interceptty 不支持RTS 和DTR,但由于某种原因它仍然能够与modbus 设备通信,

    然后我将我的 python 代码指向拦截虚拟端口,我正在传输与 gtkterm 相同的信息,但没有响应,但我注意到我写入数据的速度要快得多

    然后我将代码更改为一次只发送 1 个字节,它们之间有 10 毫秒的延迟,然后它突然开始工作了。

    使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2017-07-21
      • 2015-11-16
      • 2021-01-07
      • 2019-06-15
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多