Python---Modbus RS-485 串口通信

时间:2025-02-13 22:07:17

方式一:

为了实现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("寄存器写入成功")

# 关闭连接
()