Python下的Modbus-tcp通讯

近期工作需要通过Modbus-TCP协议接收数据,所以简单了解了相关知识

Modbus TCP和Modbus Rtu的区别如下:

1、概念不同:MODBUS是一种标准的工业控制数据交换协议,可以用RTU和ASCII两种方式进行协议数据的互传,RTU是通过二进制数据方式直接传送数据,而TCP是通过将每字节二进制数据转换为固定两位十六进制字符串,再依次串联在一起,以TCP码形式进行数据传送,一般用得最多的还是RTU方式。
2、通信方式不同: 以太网,对应的通信模式是MODBUS TCP。异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是MODBUS RTU或MODBUS ASCII。高速令牌传递网络,对应的通信模式是Modbus PLUS。

Modbus TCP 客户端和服务器 master & server

客户端是信息的接收端,服务端是是信息的发送端,一个服务端可以对应多个接收端。

Modbus TCP server 代码

模拟信息的发送端,HOLDING_REGISTERS 是信息存放在保持寄存器中,注意在消息接收端的读取位置。首先要pip install modbus_tk

import time
import sys
import logging
import threading
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
import modbus_tk.modbus_tcp as modbus_tcp

import random

LOGGER = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
if __name__ == "__main__":
    try:
        SERVER = modbus_tcp.TcpServer(address="192.168.10.68", port=502)
        LOGGER.info("running...")
        LOGGER.info("enter 'quit' for closing the server")
        # 服务启动
        SERVER.start()
        # 建立第一个从机
        SLAVE1 = SERVER.add_slave(1)
        SLAVE1.add_block('A', cst.HOLDING_REGISTERS, 0, 4)  # 地址0,长度1
        for i in range(200):
            SLAVE1.set_values('A', 0, [15000 ,i + 1,i + 2])  # 改变在地址0处的寄存器的值
            time.sleep(0.1)
        for i in range(300):
            SLAVE1.set_values('A', 0, [10000, i + 1, i + 2])  # 改变在地址0处的寄存器的值
            time.sleep(0.1)
    finally:
        SERVER.stop()
Modbus TCP master 代码
    # 初始化
    Modbus_IP = "192.168.1.22"
    Modbus_port = 502
   #读取数据 
    A_num = MASTER.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1)[0]
    #A_num = MASTER.execute(1, cst.READ_INPUT_REGISTERS, 0, 1)[0]

读取到数据后就可以对数据进行逻辑操作,进行接下来的流程。

你可能感兴趣的:(Python)