news 2026/5/7 10:19:35

Modbus RTU 与 Modbus TCP 深入指南-Modbus TCP 连接管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Modbus RTU 与 Modbus TCP 深入指南-Modbus TCP 连接管理

六、Modbus TCP 连接管理

6.1 TCP 连接生命周期

客户端 服务器 | | |------- SYN (SEQ=x) -------->| (1) 三次握手 |<------ SYN+ACK (SEQ=y,ACK=x+1)| |------- ACK (ACK=y+1) ------>| | | |------- Modbus Request ------>| (2) 数据传输 |<------ Modbus Response ------| | | |------- FIN (SEQ=z) -------->| (3) 四次挥手 |<------ ACK (ACK=z+1) --------| |<------ FIN (SEQ=w) ----------| |------- ACK (ACK=w+1) ------->|

6.2 端口说明

端口用途
502/tcpModbus TCP 标准端口(需特权用户绑定)
802/tcpModbus Secure (TLS)
5020-5029常用非特权端口(避免与标准冲突)

Linux 绑定低端口

# 方法1:使用 sudo sudo python modbus_server.py # 方法2:授权特定程序 sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3 # 方法3:端口转发(推荐) sudo iptables -t nat -A PREROUTING -p tcp --dport 502 -j REDIRECT --to-port 5020

6.3 TCP Keep-Alive 配置

为防止僵尸连接,启用 Keep-Alive:

# Python 配置 sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # Linux 系统级配置(/etc/sysctl.conf) net.ipv4.tcp_keepalive_time = 7200 # 空闲2小时后发送探测 net.ipv4.tcp_keepalive_intvl = 75 # 探测间隔75秒 net.ipv4.tcp_keepalive_probes = 9 # 探测9次后断开

6.4 服务器端实现(支持多客户端)

import socket import threading class ModbusTCPServer: def __init__(self, host='0.0.0.0', port=502): self.host = host self.port = port self.holding_registers = [0] * 65536 # 模拟寄存器 def start(self): server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_sock.bind((self.host, self.port)) server_sock.listen(5) print(f"Modbus TCP server listening on {self.host}:{self.port}") while True: client_sock, addr = server_sock.accept() print(f"Connection from {addr}") thread = threading.Thread(target=self.handle_client, args=(client_sock,)) thread.daemon = True thread.start() def handle_client(self, sock): try: while True: # 读取MBAP头部(7字节) mbap = sock.recv(7) if len(mbap) < 7: break trans_id, proto_id, length, unit_id = struct.unpack('>HHHB', mbap) if proto_id != 0: continue # 读取PDU pdu_len = length - 1 pdu = sock.recv(pdu_len) # 处理请求 response_pdu = self.process_pdu(pdu) # 发送响应 response_mbap = struct.pack('>HHHB', trans_id, 0, len(response_pdu) + 1, unit_id) sock.send(response_mbap + response_pdu) except Exception as e: print(f"Error: {e}") finally: sock.close() def process_pdu(self, pdu): """处理PDU并返回响应PDU""" if len(pdu) < 1: return b'' func = pdu[0] if func == 0x03: # 读保持寄存器 if len(pdu) < 5: return self.exception_response(func, 0x03) address = (pdu[1] << 8) | pdu[2] count = (pdu[3] << 8) | pdu[4] if count < 1 or count > 125: return self.exception_response(func, 0x03) # 读取寄存器值 data = bytearray() for i in range(count): val = self.holding_registers[address + i] data.append((val >> 8) & 0xFF) data.append(val & 0xFF) return bytes([0x03, 2*count]) + data elif func == 0x06: # 写单个寄存器 if len(pdu) < 5: return self.exception_response(func, 0x03) address = (pdu[1] << 8) | pdu[2] value = (pdu[3] << 8) | pdu[4] self.holding_registers[address] = value return pdu # 回显请求 else: return self.exception_response(func, 0x01) # 非法功能 def exception_response(self, func, exception_code): return bytes([func | 0x80, exception_code]) # 启动服务器 server = ModbusTCPServer() server.start()

6.5 防火墙与监控命令

# 查看端口监听状态 sudo netstat -tulnp | grep 502 # 查看当前TCP连接 ss -tn | grep :502 # 实时监控连接数 watch -n 1 "ss -tn | grep :502 | wc -l" # 抓包分析 sudo tcpdump -i eth0 -s 0 -A 'tcp port 502 and host 192.168.1.100' -w modbus.pcap # Ubuntu 防火墙开放端口 sudo ufw allow from 192.168.1.0/24 to any port 502 proto tcp # CentOS 防火墙 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="502" accept' sudo firewall-cmd --reload
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 10:16:37

对比不同模型在Taotoken平台上的调用体验与初步感受

对比不同模型在Taotoken平台上的调用体验与初步感受 1. 测试环境与任务设计 本次测试通过Taotoken平台统一接入多个主流模型&#xff0c;使用相同的API Key和基础配置。测试任务涵盖创意写作、代码生成、逻辑推理三类典型场景&#xff0c;每个场景设计5个标准化问题。所有请求…

作者头像 李华
网站建设 2026/5/7 10:12:10

基于AI的自动化博客系统:架构设计与工程实践

1. 项目概述&#xff1a;一个能自动写博客的AI助手最近在GitHub上看到一个挺有意思的项目&#xff0c;叫IncomeStreamSurfer/chatgptassistantautoblogger。光看这个名字&#xff0c;就能猜个八九不离十&#xff1a;这是一个利用类似ChatGPT这样的AI助手&#xff0c;来自动化生…

作者头像 李华
网站建设 2026/5/7 10:04:39

基于MCP协议与Cloudflare Workers快速构建云端AI工具平台

1. 项目概述&#xff1a;快速构建云端AI工具平台 如果你和我一样&#xff0c;每天都在和 Cursor、Claude 这类 AI 编程助手打交道&#xff0c;那你肯定也遇到过这样的痛点&#xff1a;想让它帮你查个数据库、调个第三方 API&#xff0c;或者执行一些特定的自动化任务&#xff…

作者头像 李华
网站建设 2026/5/7 10:03:44

解锁数据洞察:如何破解电视价值低估与线上效果误判的困局?

在全域营销的当下&#xff0c;数字渠道凭借可点击、可转化、可直接归因的显性优势&#xff0c;成为品牌预算的核心投向&#xff0c;而电视广告因“成本高、效果难直接测算、无法闭环归因”被边缘化&#xff0c;甚至被判定为“过时媒体”。但一家美国头部无线电信品牌随机停播一…

作者头像 李华