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(即功能码 + 0x80)。例如:
- 原功能码
0x03(读保持寄存器)→ 异常功能码0x83。 - 原功能码
0x10(写多个寄存器)→ 异常功能码0x90。
- 原功能码
- 异常码:紧随异常功能码后,占1字节,表示具体错误类型(如非法地址、非法功能等)
- 以下列举出常用的异常码
| 异常码(十六进制) | 名称 | 含义 | 典型场景 |
|---|---|---|---|
| 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)
- Transaction ID:
- 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)
- Transaction ID:
- 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)
- Transaction ID:
- 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
| 字段 | 值(十六进制) | 说明 |
|---|---|---|
| 事务ID | 00 01 | 事务标识符(自增值,用于匹配请求与响应)。 |
| 协议ID | 00 00 | Modbus TCP协议固定标识符(0x0000)。 |
| 长度 | 00 06 | 后续数据长度6字节(单元ID + PDU)。 |
| 单元ID | 01 | 从站地址(本例为1)。 |
| 功能码 | 03 | 读保持寄存器操作。 |
| 起始地址 | 00 64 | 十进制地址100(对应Modbus地址400101)。 |
| 寄存器数量 | 00 01 | 读取1个寄存器。 |
响应报文:00 01 00 00 00 03 01 83 02
| 字段 | 值(十六进制) | 说明 |
|---|---|---|
| 事务ID | 00 01 | 与请求报文的事务ID一致,用于匹配请求与响应。 |
| 协议ID | 00 00 | 固定标识符(0x0000)。 |
| 长度 | 00 03 | 后续数据长度3字节(单元ID + 异常功能码 + 异常码)。 |
| 单元ID | 01 | 从站地址(与请求一致)。 |
| 异常功能码 | 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 应用范围: 分布式光伏、微型风力发电、工商业储能、光储充一体化电站、微电网等领域。 主要功能: 数据采集:支持串口、以太网等多通道实时运行,满足各类风电与光伏逆变器、储能等 设备接入ÿ…...
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设计一个进度条,并让其通过线程自己动起来 程序代码: <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 标准库中的一个模块,提供了一些专门的容器数据类型,能够帮助你更高效地处理常见的数据结构操作。 1、Counter Counter 是一个字典的子类,用于计数可哈希对象。它会统计对象的出现次数,并…...
马尔科夫不等式和切比雪夫不等式
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 统计概率的利剑:掌…...
护照阅读器在汽车客运站流程中的应用
在汽车客运站的日常运营里,如何高效服务旅客、保障出行安全是工作重点。护照阅读器作为精准身份识别的得力工具,在客运站的多个关键流程,如自助购票、柜台购票、安检以及行李托运中,发挥着不可小觑的作用,有力地提升了…...
CentOS 7 安装Nginx-1.26.3
无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载: 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…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
