近期工作需要通过Modbus-TCP协议接收数据,所以简单了解了相关知识
1、概念不同:MODBUS是一种标准的工业控制数据交换协议,可以用RTU和ASCII两种方式进行协议数据的互传,RTU是通过二进制数据方式直接传送数据,而TCP是通过将每字节二进制数据转换为固定两位十六进制字符串,再依次串联在一起,以TCP码形式进行数据传送,一般用得最多的还是RTU方式。
2、通信方式不同: 以太网,对应的通信模式是MODBUS TCP。异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是MODBUS RTU或MODBUS ASCII。高速令牌传递网络,对应的通信模式是Modbus PLUS。
客户端是信息的接收端,服务端是是信息的发送端,一个服务端可以对应多个接收端。
模拟信息的发送端,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_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]
读取到数据后就可以对数据进行逻辑操作,进行接下来的流程。