Python_Modbus_RTU_通讯Demo

之前利用Python进行Modbus_TCP进行数据接收,本次需要利用串口进行数据传输,学习Modbus_RTU的简单实现

首先要在创建两个虚拟串口,利用VSPD工具即可。在一台电脑上实现数据的发送和接收

 进入Python IDE进行slave端的编写

import serial
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import time
def ModbusRTU_Slave():
    try:
        # 设定串口为从站
        # 外置参数包括端口 port = "COM3" 波特率:9600
        server= modbus_rtu.RtuServer(serial.Serial(port="com3",baudrate=9600, bytesize=8, parity='N', stopbits=1))
        server.start()
        print("runing...")
        SLAVE1 = server.add_slave(1)
        SLAVE1.add_block('A', cst.HOLDING_REGISTERS, 0, 4)  # 地址0,长度4
        increase_num = 17000
        for i in range(300):
            SLAVE1.set_values('A', 0, [17000, i + 1, i + 2])  # 改变在地址0处的寄存器的值
            time.sleep(0.1)
        for i in range(1500):
            increase_num = increase_num - 1
            SLAVE1.set_values('A', 0, [increase_num, i + 1, i + 2])  # 改变在地址0处的寄存器的值
            time.sleep(0.1)
        for i in range(800):
            SLAVE1.set_values('A', 0, [10000, i + 1, i + 2])  # 改变在地址0处的寄存器的值
            time.sleep(0.1)
        for i in range(800):
            SLAVE1.set_values('A', 0, [17000, i + 1, i + 2])  # 改变在地址0处的寄存器的值
            time.sleep(0.1)
    except Exception as exc:
        print(str(exc))

再进行master端的编写

# 数据接收端
def ModbusRTU_Master():
    try:
        # 设定串口为从站
        # 外置参数包括端口 port = "COM3" 波特率:9600
        master = modbus_rtu.RtuMaster(serial.Serial(port="com4",baudrate=9600, bytesize=8, parity='N', stopbits=1))
        master.set_timeout(1.0)
        master.set_verbose(True)
        # 读保持寄存器
        read = master.execute(1, cst.HOLDING_REGISTERS, 0, 4)  # 这里可以修改需要读取的功能码
        print(red)
    except Exception as exc:
        print(str(exc))

补充功能码

功能代码cst
    1~255中1~21是常用的,以下是读写专用的功能码
    READ_COILS = 01 读线圈,位操作
    READ_DISCRETE_INPUTS = 02 读离散输入状态,位操作
    READ_HOLDING_REGISTERS = 03 读保持寄存器,字操作
    READ_INPUT_REGISTERS = 04 读输入寄存器,字操作
    WRITE_SINGLE_COIL = 05 写单线圈,位操作
    WRITE_SINGLE_REGISTER = 06 写单一寄存器,字操作
    WRITE_MULTIPLE_COILS = 15 写多个线圈【强制多点线圈】,位操作
    WRITE_MULTIPLE_REGISTERS = 16 写多寄存器【写乘法寄存器】,字操作

猜你喜欢

转载自www.cnblogs.com/wangxiaobei2019/p/12067219.html