【嵌入式笔记】Modbus TCP

1.概述

定义:Modbus TCP 是 Modbus 协议的变体,基于 TCP/IP 协议栈,用于通过以太网实现工业设备间的通信。

背景:由施耐德电气(原 Modicon 公司)在 1999 年发布,将传统的 Modbus RTU/ASCII 适配到现代网络环境。

核心特点:

  1. 基于客户端/服务器模型,客户端(主站)发起请求,服务器(从站)响应。
  2. 默认使用 TCP 端口 502,支持高速、远距离通信。
  3. 二进制表现形式、紧凑的数据结构,通信效率高;
  4. 基于可靠连接的服务

2. 协议结构

Modbus TCP 报文由 MBAP 头(Modbus Application Header) 和 PDU(协议数据单元) 组成:

MBAP 头(7 字节)

  1. 事务标识符(2 字节):匹配请求与响应(如 0x0001)。
  2. 协议标识符(2 字节):固定为 0x0000,表示 Modbus 协议。
  3. 长度字段(2 字节):后续数据的字节数(包括单元标识符)。
  4. 单元标识符(1 字节):标识从站设备(类似 RTU 的从机地址)。

PDU(功能码 + 数据)

  1. 功能码(1 字节):定义操作类型(如 0x03 读保持寄存器)。
  2. 数据字段(N 字节):请求或响应的具体内容
  3. 示例
  • 请求(读取保持寄存器)
事务ID 协议ID 长度 单元ID 功能码 起始地址 寄存器数量
00 01 00 00 00 06 01 03 00 00 00 02
  • 响应
事务ID 协议ID 长度 单元ID 功能码 字节数 数据
00 01 00 00 00 07 01 03 04 00 0A 00 0B

3.通信流程

  1. 建立连接
    客户端(主站)通过 TCP 端口 502 连接服务器(从站)。
  2. 构造请求
    MBAP 头:事务ID(唯一标识)、协议ID(0x0000)、长度(单元ID+PDU字节数)、单元ID(从站地址)。
    PDU:功能码(如 0x03 读寄存器) + 数据(地址、数量等)。
  3. 发送请求
    客户端通过 TCP 连接发送报文至服务器。
  4. 处理请求
    服务器验证报文,执行操作(读/写数据),生成响应(成功或异常)。
  5. 返回响应
    服务器返回响应报文,格式与请求类似:
    成功:功能码 + 数据(如寄存器值)。
    失败:功能码 + 0x80 + 异常码。
  6. 解析响应
    客户端匹配事务ID,提取数据或处理错误。
  7. 关闭连接(可选)
    短连接:单次通信后断开。
    长连接:复用连接多次通信。
  • 核心要点

    端口:502(TCP)。

    事务ID:唯一匹配请求与响应。

    功能码:定义操作类型(读/写)。

    长度字段 = 单元ID(1字节) + PDU字节数。

    字节序:大端(高位在前)。

  • 一句话总结:建连 → 组包 → 发请求 → 处理 → 回响应 → 解析 → 关连(可选)。

4. 与Modbus RTU的区别

  1. 从机地址不再重要,可通过IP地址区分;
  2. 取消CRC校验,因为TCP/IP数据中已存在校验;
  3. 多了MBAP报文头。
相关推荐
Zwawa1 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
无咎.lsy3 小时前
《机器学习》笔记
笔记·机器学习
坤坤子吖4 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
蒸蒸yyyyzwd6 小时前
后端相关学习笔记。
笔记·学习
旖旎夜光7 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
Oll Correct8 小时前
Adobe illustrator 案例十二:视频播放(Media & Video)图标绘制
笔记·ui·adobe·illustrator
say_fall8 小时前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
叼烟扛炮9 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
旖旎夜光10 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
叼烟扛炮10 小时前
[LangChain] 学习笔记(05):提示词模板(Prompt)与少样本注入(Few-Shot)实战
linux·人工智能·笔记·学习·langchain·prompt