方式一:
为了实现Python和Modbus RS-485串口通信,我们需要安装modbus_tk和serial模块。modbus_tk是一个用于实现Modbus通信协议的Python库。Modbus是一种常用的串行通信协议,用于在工业自动化领域中实现设备之间的通信。modbus_tk库提供了一组功能强大的工具和类,用于开发Modbus主站(Master)和从站(Slave)应用程序。
以下是一个简单的示例代码,可以从Modbus从站读写寄存器以及扫描总线上的设备:
import modbus_tk.exceptions as modbus_exceptions
import modbus_tk.modbus_rtu as modbus_rtu
import serial
import modbus_tk.defines as cst
def scan_rs485_devices(port, baudrate):
devices = []
# 创建串口连接
conn = (port=port, baudrate=baudrate, bytesize=8, parity='N', stopbits=1, xonxoff=0)
master = modbus_rtu.RtuMaster(conn)
master.set_timeout(1) # 设置超时时间
master.set_verbose(True)
# 扫描设备地址
for address in range(1, 248):
try:
response = (address, cst.READ_HOLDING_REGISTERS, 0, 1)
(address)
except modbus_exceptions.ModbusError:
continue
except Exception as e:
print(f"Error scanning device at address {address}: {str(e)}")
# 读取指定设备寄存器的指定位置的值 (设备地址, 读的功能码3, 寄存器地址, 读取长度)
response = (101, 3, 0x041F, 1)
print('采集结果----->', response)
# # 给指定设备的寄存器写值 (设备地址, 写的功能码6, 寄存器地址, output_value=写入的值)
# response = (101, 6, 0x041F, output_value=0x55AA)
# print('写入返回结果----->', response) # 返回一个数组,第一个为寄存器地址,第二个为里面的值
()
() # 关闭串口连接
return devices
# 设置串口名称和波特率
serial_port = '/dev/ttyUSB0'
baud_rate = 9600
# 扫描 RS-485 设备
devices = scan_rs485_devices(serial_port, baud_rate)
# 打印扫描到的设备地址
print("Scanned devices:")
for device in devices:
print(f"Device address: {device}")
方式二:
安装pymodbus模块
from import ModbusSerialClient
from import Endian
from import BinaryPayloadBuilder, BinaryPayloadDecoder
# 创建Modbus RTU客户端对象并连接到设备
client = ModbusSerialClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600)
()
# 读取单个寄存器的值
result = client.read_holding_registers(0x0200, 10, unit=101, timeout=1)
if ():
print("读取寄存器失败")
print(result)
else:
value =
print("寄存器值:", value)
# 写入单个寄存器的值
result = client.write_register(0x0400, 0x00FF, unit=101)
if ():
print("写入寄存器失败")
else:
print("寄存器写入成功")
# 关闭连接
()