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

Modbus协议(TCP)

        从今开始,会详细且陆续整理各类的通信协议,以便在需要且自身忘记的情况下,迅速复习。如有错误之处,还请批评指正。

一、Modbus协议的简述

        Modbus协议作为应用层协议,基于主从设备模型,主设备负责请求消息,从设备进行消息的应答。

传输支持

  • 物理层:支持RS-232、RS-485等串行链路及以太网(TCP/IP) 
  • 协议版本:包括Modbus RTU(二进制高效传输)、Modbus ASCII(可读性高)、Modbus TCP(基于以太网)

本文重点叙述TCP的方式。

二、工作机制

  • 请求-响应模式:主设备发送包含 功能码 和 数据地址 的请求帧,从设备返回操作结果或数据。例如:
    • 功能码03H:读取保持寄存器(如读取温度设定值) 
    • 功能码06H:写入单个保持寄存器(如调整电机转速) 
  • 数据帧结构
    • Modbus RTU帧:地址 + 功能码 + 数据 + CRC校验 
    • Modbus TCP帧:MBAP头(事务ID协议ID后续报文的字节数设备地址) + PDU(功能码 + 数据),注:事务ID,当需要进行并发请求的时候,就可使用不同的事务ID,避免匹配错误。 单元ID:多PLC通信的场景下,需要使用单元ID,以保证每条信息是专属的。

三、功能码

寄存器类型功能码操作类型数据单位典型应用
线圈寄存器01H位(Bit)监控继电器、电磁阀状态
05H单个位控制单个执行机构
0FH多个位批量控制执行机构
离散输入寄存器02H位(Bit)监测外部传感器信号
输入寄存器04H字(Word)获取传感器实时数据
保持寄存器03H字(Word)读取设备配置参数
06H单个字修改单个设备参数
10H多个字批量配置设备参数

四、寄存器类型

        这里简要叙述下寄存器的类型,不同的寄存器它所占的空间大小和读写权限都是不同的

寄存器类型功能码范围读写权限典型应用
线圈寄存器01H、05H、0FH读写控制开关量输出(如继电器) 
离散输入寄存器02H只读监测开关量输入(如急停信号) 
输入寄存器04H只读读取模拟量输入(如传感器电压) 
保持寄存器03H、06H、10H读写存储设备参数或实时数据(如PID参数)

五、异常码

在Modbus协议中,当从站设备(服务器)检测到请求错误时,会返回包含 异常功能码(Error Function Code)异常码(Error Code) 的响应报文。

  1. 异常功能码:原功能码的最高位被置为1(即功能码 + 0x80)。例如:
    • 原功能码 0x03(读保持寄存器)→ 异常功能码 0x83
    • 原功能码 0x10(写多个寄存器)→ 异常功能码 0x90
  2. 异常码:紧随异常功能码后,占1字节,表示具体错误类型(如非法地址、非法功能等)
  3. 以下列举出常用的异常码
异常码(十六进制)名称含义典型场景
0x01非法功能 (Illegal Function)请求的功能码不被支持或未实现。例如:向只读寄存器发送写操作。主站发送功能码 0x05(写线圈),但设备不支持该功能。 
0x02非法数据地址 (Illegal Data Address)寄存器地址超出设备允许范围。请求读取地址 40010,但设备仅支持 40001-40005。 
0x03非法数据值 (Illegal Data Value)写入的数据值不合法(如超出寄存器范围)。试图向16位寄存器写入 0x10000(最大值应为 0xFFFF)。 
0x04设备故障 (Slave Device Failure)从站设备内部错误(如硬件故障)。从站设备因电源波动导致处理失败。 
0x05确认 (Acknowledge)从站已接收请求但需要更长时间处理(需主站轮询完成状态)。主站请求写入大量数据,从站返回 0x05 表示正在处理。 
0x0B目标设备未响应 (Target Device Failed to Respond)网关无法将请求转发到目标设备。网络中断或目标设备离线。

六、举例

        最后,我们来看三段报文

报文1:00 01 00 00 00 06 01 06 00 00 00 01
  • MBAP头
    • Transaction ID: 00 01(事务ID为1)
    • Protocol ID: 00 00(Modbus协议)
    • Length: 00 06(后续报文长度为6字节)
    • Unit ID: 01(设备地址1)
  • PDU
    • 功能码: 06(写单个保持寄存器)
    • 寄存器地址: 00 00(地址0x0000)
    • 写入值: 00 01(值为1)
  • 作用:向地址 0x0000 的保持寄存器写入值 1
报文2:00 01 00 00 00 05 01 03 00 00 00 0A
  • MBAP头
    • Transaction ID: 00 01(事务ID为1)
    • Protocol ID: 00 00(Modbus协议)
    • Length: 00 05(后续报文长度为5字节)
    • Unit ID: 01(设备地址1)
  • PDU
    • 功能码: 03(读保持寄存器)
    • 寄存器起始地址: 00 00(地址0x0000)
    • 读取数量: 00 0A(读取10个寄存器)
  • 作用:从地址 0x0000 开始读取10个保持寄存器的值

报文3:00 01 00 00 00 17 01 03 14 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A

  • MBAP头
    • Transaction ID: 00 01(事务ID为1)
    • Protocol ID: 00 00(Modbus协议)
    • Length: 00 17(后续报文长度为23字节)
    • Unit ID: 01(设备地址1)
  • PDU
    • 功能码: 03(读保持寄存器)
    • 字节数: 14(数据总字节20)
    • 寄存器数据: 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A(10个寄存器的值)

下面来一段错误报文的机制:
        场景:主站尝试读取保持寄存器地址 400101(十进制地址100),但从站设备仅支持寄存器地址 400001-400050,导致地址越界错误

        请求报文:00 01 00 00 00 06 01 03 00 64 00 01

字段值(十六进制)说明
事务ID00 01事务标识符(自增值,用于匹配请求与响应)。
协议ID00 00Modbus TCP协议固定标识符(0x0000)。
长度00 06后续数据长度6字节(单元ID + PDU)。
单元ID01从站地址(本例为1)。
功能码03读保持寄存器操作。
起始地址00 64十进制地址100(对应Modbus地址400101)。
寄存器数量00 01读取1个寄存器。

        响应报文:00 01 00 00 00 03 01 83 02

字段值(十六进制)说明
事务ID00 01与请求报文的事务ID一致,用于匹配请求与响应。
协议ID00 00固定标识符(0x0000)。
长度00 03后续数据长度3字节(单元ID + 异常功能码 + 异常码)。
单元ID01从站地址(与请求一致)。
异常功能码83原功能码 03 + 0x80(表示异常响应)。
异常码02错误类型为 非法数据地址(从站不支持地址400101)。

相关文章:

Modbus协议(TCP)

从今开始,会详细且陆续整理各类的通信协议,以便在需要且自身忘记的情况下,迅速复习。如有错误之处,还请批评指正。 一、Modbus协议的简述 Modbus协议作为应用层协议,基于主从设备模型,主设备负责请求消息&…...

虚拟系统配置实验报告

一、实验拓扑图 二、实验配置 要求一: 虚拟系统: 设置管理: 进行信息配置 R1配置 虚拟系统配置 a: b: c: 测试 a–>b: 检测...

Agentic系统:负载均衡与Redis缓存优化

摘要 本文在前文Agentic系统的基础上,新增负载均衡(动态调整线程数以避免API限流)和缓存机制(使用Redis存储搜索结果,减少API调用)。通过这些优化,系统在高并发场景下更加稳定高效。代码完整可…...

28-文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可…...

建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)

这次我们来制作《红楼梦》各章节的分布情况: 源代码: import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…...

Impacket工具中的横向渗透利器及其使用场景对比详解

在渗透测试中,横向移动(Lateral Movement)是指攻击者在获得一个系统的控制权限后,通过网络进一步渗透到其他系统的过程。Impacket 是一款强大的渗透测试工具集,提供了多种实现横向渗透的脚本,常见的工具包括…...

基于java,SpringBoot和Vue的医院药房药品管理系统设计

摘要 随着医疗行业信息化的快速发展,高效、精准的医院药房药品管理对于提升医疗服务质量和医院运营效率至关重要。本文基于 Java 语言,采用 SpringBoot 框架和 Vue 框架进行医院药房药品管理系统的设计与研究。该系统以 SpringBoot 作为后端开发框架&am…...

MQ保证消息的顺序性

在消息队列(MQ)中保证消息的顺序性是一个常见的需求,尤其是在需要严格按顺序处理业务逻辑的场景(例如:订单创建 → 支付 → 发货)。 一、消息顺序性被破坏的原因 生产者异步/并行发送:消息可能…...

cmake、CMakeLists.txt、make、ninja

文章目录 一、概念0.cmake官网1.什么是cmake2.为什么使用cmake3.CMakeLists.txt 二、CMakeLists.txt语法:如何编写CMakeLists.txt,语法详解(0)语法基本原则(1)project关键字(2)set关键字(3)message关键字(4)add_executable关键字(5)add_subdirectory关键…...

数据结构与算法 计算机组成 八股

文章目录 数据结构与算法数组与链表的区别堆的操作红黑树定义及其原理 计算机组成int和uint的表示原码反码补码移码的定义?为什么用补码? 数据结构与算法 数组与链表的区别 堆的操作 红黑树定义及其原理 计算机组成 int和uint的表示 原码反码补码移…...

RoboBrain:从抽象到具体的机器人操作统一大脑模型

25年2月来自北大、北京智源、中科院自动化所等的论文“RoboBrain: A Unified Brain Model for Robotic Manipulation from Abstract to Concrete”。 目前的多模态大语言模型(MLLM) 缺少三项必备的机器人大脑能力:规划能力,将复杂…...

算法 之 前缀和 与 滑动窗口 与 背包问题 的差异(子数组之和为k问题)

文章目录 使用前缀和哈希表560.和为K的子数组525.连续数组2588.统计美丽子数组数目 子数组的定义是原来的数组当中连续的非空的序列,而我们的背包问题的选与不选的情况,对应的是这个非连续的情况,那么这种情况就要注意当然啦,对于线性的时间内…...

微电网协调控制器ACCU-100 分布式光伏 光储充一本化

安科瑞 华楠 18706163979 应用范围: 分布式光伏、微型风力发电、工商业储能、光储充一体化电站、微电网等领域。 主要功能: 数据采集:支持串口、以太网等多通道实时运行,满足各类风电与光伏逆变器、储能等 设备接入&#xff…...

IDEA入门及常用快捷键

IDEA是java常用的IDE。当run一个.java文件时,其实是经历了先编译为.class,再运行的过程。 在project文件夹中,out文件夹存储编译的.class文件,src文件夹存储.java代码文件。 设置自动导包 快捷键: 格式化快捷键&…...

electron打包结构了解

Electron 应用打包后的文件结构和内容取决于你使用的打包工具(如 electron-builder、electron-packager 等)以及目标操作系统(Windows、macOS、Linux)。以下是典型 Electron 应用打包后的文件结构和关键组成部分: 1. 基…...

03.06 QT

一、使用QSlider设计一个进度条&#xff0c;并让其通过线程自己动起来 程序代码&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…...

Python中的常用库

一、collections collections是 Python 标准库中的一个模块&#xff0c;提供了一些专门的容器数据类型&#xff0c;能够帮助你更高效地处理常见的数据结构操作。 1、Counter Counter 是一个字典的子类&#xff0c;用于计数可哈希对象。它会统计对象的出现次数&#xff0c;并…...

马尔科夫不等式和切比雪夫不等式

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 统计概率的利剑&#xff1a;掌…...

护照阅读器在汽车客运站流程中的应用

在汽车客运站的日常运营里&#xff0c;如何高效服务旅客、保障出行安全是工作重点。护照阅读器作为精准身份识别的得力工具&#xff0c;在客运站的多个关键流程&#xff0c;如自助购票、柜台购票、安检以及行李托运中&#xff0c;发挥着不可小觑的作用&#xff0c;有力地提升了…...

CentOS 7 安装Nginx-1.26.3

无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载&#xff1a; http://nginx.org/download/nginx-1.26.3.zipLinxu下载 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安装Nginx-1.26.3 安装之前先安装Nginx依赖包、自行选择 yum -y i…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...