pyserial和pymodbus
pyserial和pymodubus
pyserial 和 pymodbus 是两个常用的 Python 库,分别用于串行通讯和 Modbus 协议通讯,广泛应用于与硬件设备(如传感器、PLC、RS-485 转串行设备等)进行数据交换。
pyserial
pyserial 是一个用于与串行端口(如 RS-232、RS-485 转 USB 适配器)进行通讯的 Python 库。它支持通过串行端口与硬件设备进行数据传输,适用于大多数基于串行接口的设备。
核心功能
打开串行端口:与指定的串行端口(如 /dev/ttyUSB0)进行连接。
读取/写入数据:可以发送和接收字节数据,支持同步和异步通讯。
配置串行端口:设置波特率、数据位、停止位、校验位等。
数据流控制:支持流控制(如 XON/XOFF、RTS/CTS)。
安装 pyserial
你可以通过 pip 安装 pyserial:
pip install pyserial
示例代码
以下是一个简单的 pyserial 示例,展示如何通过串行端口发送和接收数据:
import serial
import time
打开串行端口(比如 /dev/ttyUSB0)
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) # 设置波特率为 9600,超时为 1 秒
向串行端口写数据
ser.write(b'Hello, RS-485!\n') # 向设备发送字节数据
读取串行端口接收到的数据
while True:
if ser.in_waiting > 0: # 如果有数据可读
data = ser.readline() # 读取一行数据
print("Received:", data.decode()) # 解码并打印接收到的数据
break
ser.close() # 关闭串行端口
常见配置项
baudrate:波特率,例如 9600, 115200 等。
timeout:读取数据的超时时间(秒)。
parity:校验位,常用选项:serial.PARITY_NONE(无校验)、serial.PARITY_EVEN(偶校验)等。
stopbits:停止位,常用值是 1 或 2。
pymodbus
pymodbus 是一个用于 Modbus 协议通讯的 Python 库。Modbus 是一种广泛使用的通讯协议,尤其在工业自动化、PLC 控制系统、传感器和智能电表等领域中被广泛应用。pymodbus 支持 Modbus RTU 和 Modbus TCP 协议,能够让你方便地与支持 Modbus 协议的设备进行通讯。
核心功能
支持 Modbus RTU 和 TCP:可以通过串行(RS-485)或以太网(TCP/IP)与设备通讯。
功能码支持:支持 Modbus 主要的功能码(如读取和写入离散输入、保持寄存器等)。
支持客户端和服务器模式:可以创建 Modbus 客户端和服务器应用。
数据类型支持:支持 Modbus 寄存器类型(如 16 位寄存器、离散输入、线圈等)。
安装 pymodbus
你可以通过 pip 安装 pymodbus:
pip install pymodbus
示例代码(Modbus RTU)
以下是一个使用 pymodbus 进行 Modbus RTU 通讯的简单示例,展示如何使用串行接口通过 Modbus 协议与设备交换数据:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
创建 Modbus RTU 客户端(串行通讯)
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600)
client.connect()
读取保持寄存器(假设设备地址为 1,读取从寄存器 0 开始的 2 个寄存器)
result = client.read_holding_registers(0, 2, unit=1)
if result.isError():
print("Error reading registers:", result)
else:
print("Registers:", result.registers) # 输出读取到的寄存器值
关闭连接
client.close()
示例代码(Modbus TCP)
如果你使用的是 Modbus TCP(即通过以太网连接设备),可以像这样配置客户端:
from pymodbus.client.sync import ModbusTcpClient
创建 Modbus TCP 客户端(通过 IP 地址连接)
client = ModbusTcpClient('192.168.1.100', port=502)
client.connect()
读取保持寄存器
result = client.read_holding_registers(0, 2, unit=1)
if result.isError():
print("Error reading registers:", result)
else:
print("Registers:", result.registers)
client.close()
常用功能
read_coils:读取线圈(数字输出)。
read_discrete_inputs:读取离散输入(数字输入)。
read_holding_registers:读取保持寄存器(通常用于存储模拟量数据)。
write_coils:写入线圈。
write_registers:写入保持寄存器。
pyserial 与 pymodbus 的关系
pyserial 主要负责低层的串行通讯,允许你通过 RS-485、RS-232 等串行端口进行数据传输。
pymodbus 是一个应用层协议,专门用于与支持 Modbus 协议的设备进行交互。它可以通过 pyserial 来使用串行端口进行 Modbus RTU 通讯,或者通过 TCP/IP 进行 Modbus TCP 通讯。
因此,如果你要使用 Modbus RTU 通过串行口与设备通讯,你需要先用 pyserial 设置好串行端口,再通过 pymodbus 进行 Modbus 协议的高层通讯。
总结
pyserial:提供与串行设备(如 RS-485 转 USB)进行通讯的基础支持,适合做低层的串行通讯。
pymodbus:提供实现 Modbus 协议的支持,适用于与工业设备和传感器之间的通讯,支持 RTU 和 TCP 两种模式。
你可以根据需求结合这两个库,首先用 pyserial 打开串行端口,然后用 pymodbus 实现与 Modbus 设备的高层通讯。