目标
python通过RS485的Modbus协议读取仪表相应的寄存器数据。
准备工作
- 软件
安装第三方库:serial、pyserial、modbus_tk
pip install serial
pip install pyserial
pip install modbus_tk
- 硬件
- 一根USB转RS485的转接线(电脑本身不带RS485接口时需要)
- 一个带Modbus通讯的仪表(例子中使用的时一个温湿度模块)
硬件连接
仪表连接对应的电源,通讯信号线A-A、B-B对应连接;
软件测试
- 将转接线插入电脑USB接口,通过设备管理器确认串口标号。
- 接通设备电源;
- 编写程序,如下:
# 设备测试 2024年1月9日
# serial、pyserial、modbus_tk
import time
import serial
import serial.tools.list_ports
from modbus_tk import modbus_rtu
import modbus_tk.defines as cst
# 创建串口实例
def create_port(port_name="COM4"):
try:
port_v = modbus_rtu.RtuMaster(serial.Serial(port=port_name, baudrate=9600, bytesize=8, parity='N', stopbits=1))
port_v.set_timeout(5.0)
port_v.set_verbose(True)
return port_v
except Exception as exc:
return "err:" + str(exc)
# 读取数据
def read_data(master, device=1, address=0, length=1):
try:
# 读保持寄存器
re_data = master.execute(device, cst.HOLDING_REGISTERS, address, length) # 设备地址、功能码、寄存机初始地址、长度
return re_data
except Exception as exc:
return "err:" + str(exc)
# 写入数据
def write_data(master, device=1, address=10, length=1, value=2):
try:
# 写寄存器
re_data = master.execute(device, cst.WRITE_SINGLE_REGISTER, address, length, value) # 设备地址、功能码、寄存机初始地址、长度、数值
return re_data
except Exception as exc:
return "err:" + str(exc)
port = create_port()
while 1:
time.sleep(1)
# 读取数据
show_data = read_data(port, device=1, length=2)
print(show_data)
这时按照设备提供寄存器地址,就可以读取像要的数值;
- RS485可以连接多个从站仪表。但是仪表的设备号不可以重复。修改地址寄存器值,方法见上方程序中的“write_data”函数。修改完毕后设备断电重启即可。