当前位置: 首页 > news >正文

【嵌入式笔记】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 0100 0000 06010300 0000 02
  • 响应
事务ID协议ID长度单元ID功能码字节数数据
00 0100 0000 0701030400 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报文头。
http://www.dtcms.com/a/191331.html

相关文章:

  • git仓库初始化
  • zabbix7.2最新版本 nginx自定义监控(三) 设置触发器
  • Anki 学习法
  • 深入浅出 IPFS 在 DApps 和 NFT 中的应用:以 Pinata 实战为例
  • 印度尼西亚数据源对接技术指南
  • vue3基础学习(上) [简单标签] (vscode)
  • 基于单片机的车灯智能控制系统设计与实现
  • 嵌入式中深入理解C语言中的指针:类型、区别及应用
  • rag文本切块
  • 算法备案如何判断自己的产品是否具备舆论属性
  • 开源Heygem本地跑AI数字人视频教程
  • 彻底解决QT5 中文编译不过问题
  • 《Python星球日记》 第70天:Seq2Seq 与Transformer Decoder
  • 为什么我不能获取到镜像,ImagePullBackoff
  • archliunx关闭自动休眠
  • 使用 Semantic Kernel 调用 Qwen-VL 多模态模型
  • Spring Boot 自动装配技术方案书
  • 什么是alpaca 或 sharegpt 格式的数据集?
  • QT之QComboBox组件
  • AbMole解读:脂质体的关键组分和主要合成方法
  • 致远OA项目管理应用包简介【附百度网盘链接】
  • C++ 并发编程(1)再学习,为什么子线程不调用join方法或者detach方法,程序会崩溃? 仿函数的线程启动问题?为什么线程参数默认传参方式是值拷贝?
  • CPU的用户态(用户模式)和核心态(内核态)
  • CARS geom文件
  • 【经验记录】为什么安装node时会依赖Python
  • 实验九视图索引
  • Ota++框架学习
  • 如何查看打开的 git bash 窗口是否是管理员权限打开
  • EasyRTC嵌入式音视频通信SDK打造带屏IPC全场景实时通信解决方案
  • 全新开发-iVX图形化编程VS完整IDE