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

Modbus协议介绍

Modbus是一种串行通信协议,由Modicon公司(现为施耐德电气)在1979年为可编程逻辑控制器(PLC)通信而开发。它是工业自动化领域最常用的通信协议之一,具有开放性、简单性和跨平台兼容性,广泛应用于工业设备、楼宇自动化、电力系统等场景。 Modbus协议还遵循主从协议,支持单主机,多从机,最多支持247个从机设备。

一、Modbus协议基础特性

1. 物理层与传输模式

   物理接口:支持串口(RS-232、RS-485)和以太网(Modbus TCP)。  

   传输模式:  

       ASCII模式:消息以ASCII字符形式传输,每个字节包含两个ASCII字符(如`0x1F`表示为`31 46`),适合低速率通信。  

       RTU模式:消息以二进制形式传输,每个字节直接编码数据,效率更高,是最常用的模式。  

   以太网扩展**:Modbus TCP基于TCP/IP协议,使用502端口,简化了网络部署。

2. 通信方式

   主从架构:一个主设备(Master)发起通信,多个从设备(Slave)响应,从设备地址范围为1~247。  

   请求-响应机制:主设备发送请求,从设备根据请求返回数据或执行操作。从机不会主动进行数据的发送,从机之间也不会有通讯过程。

3. 数据模型  

    Modbus将设备数据抽象为四种基本寄存器类型:  

二、Modbus协议数据帧格式

1. RTU模式数据帧  

   帧结构:  

     [从机地址(1B)] [功能码(1B)] [数据(0~252B)] [CRC校验(2B)]  

  功能码(Function Code):标识操作类型,常见功能码:  

2.TCP模式数据帧

   在RTU帧基础上增加MBAP(Modbus Application Protocol)头:  

     [事务标识符(2B)] [协议标识符(2B,固定0)] [长度(2B)] [从机地址(1B)] [功能码(1B)] [数据(nB)]  

     事务标识符**:用于匹配请求和响应,由主设备生成。

三、Modbus通信流程示例

1. 主设备读取从设备温度值(HR寄存器)

   请求:  

     主→从:[从机地址=1] [功能码=03] [起始地址=0x0001] [寄存器数量=1]  

   响应:  

     从→主:[从机地址=1] [功能码=03] [字节数=2] [温度值=0x012C(300)]  

     解析:温度值为300,假设分辨率为0.1℃,则实际温度为30.0℃。

示例指令:

请求:01 01 00 00 00 0A BC 0D

含义:从机设备地址(01)+ 功能码(01)+ 起始寄存器完整地址(00 00)+ 线圈数量(00 0A)+ CRC16校验码(BC 0D)

解释:从地址为1的从机读取寄存器开始地址为1,连续读10个线圈。

应答:01 01 02 FF 03 B8 0D

含义:从机设备地址(01)+ 功能码(01)+ 数据字节数(02) + 读取到的数据内容(FF 03)+ CRC16校验码(B8 0D)

解释:从地址为1的从机中读取到两个字节的数据,读出的内容是FF 03。

2. 主设备控制从设备继电器(Coil)

   请求(闭合继电器):  

     主→从:[从机地址=2] [功能码=05] [线圈地址=0x0002] [值=0xFF00(ON)]   

   响应(成功):  

     从→主:[从机地址=2] [功能码=05] [线圈地址=0x0002] [值=0xFF00]  

     

四、Modbus协议优缺点

优点:

1. 简单易用:协议设计简洁,实现成本低,适合嵌入式系统。  

2. 开放性:无专利限制,免费使用,支持多种硬件平台。  

3. 跨平台兼容性:从单片机到工业PC均可实现,支持多种物理层。  

4. 广泛支持:几乎所有工业设备都提供Modbus接口(PLC、传感器、驱动器等)。  

缺点

1. 安全性弱:无加密机制,不适合安全敏感场景(需通过VPN等外部手段增强)。  

2. 单主架构限制:同一网络中只能有一个主设备,扩展性有限。  

3. 效率问题:每次通信需等待响应,不适合高并发场景。  

4. 数据量限制:单次请求最多传输253字节数据,大数据量需分批传输。  

五、Modbus协议变种与扩展

1. Modbus RTU/ASCII:基于串口的原始协议,使用CRC校验。  

2. Modbus TCP:基于以太网,使用MBAP头代替CRC校验,性能更高。  

3. Modbus PLUS:施耐德电气 proprietary 版本,支持多主架构,速率更高(1Mbps)。  

4. Modbus UDP:基于UDP协议,轻量但不可靠,适合实时性要求高的场景。  

5. Modbus over TLS:在TCP基础上增加TLS加密,提升安全性(如工业物联网场景)。  

六、Modbus应用场景

1. 工业自动化:PLC与传感器/执行器通信,如生产线监控、机器人控制。  

2. 楼宇自动化:HVAC系统、电梯控制、照明管理。  

3. 电力系统:电表数据采集、变电站监控、分布式能源管理。  

4. 智能交通:充电桩与电网通信、交通信号灯控制。  

5. 物联网(IoT):边缘设备与云端平台数据传输(通过网关转换协议)。  

七、Modbus实现注意事项

1. 错误处理:需处理超时、CRC校验失败、异常响应(功能码+0x80)等情况。  

2. 通信参数配置:主从设备波特率、奇偶校验、停止位必须一致。  

3. 网络拓扑:RS-485网络需注意终端电阻匹配、总线长度限制(通常≤1200米)。  

4. 性能优化:合理批量读取数据,减少请求次数;避免长耗时操作阻塞通信。  

、CRC16校验参考代码

//CRC校验

void CRC_Checkout_16(uint8_t *p_data,uint32_t data_len,uint8_t *data_crc) {

  uint16_t wcrc = 0xFFFF;

  uint8_t temp;

  uint32_t i=0,j=0;

  for(i=0;i<data_len;i++)

  {

    temp = *p_data & 0X00FF;

    p_data++;

    wcrc = wcrc^temp;

    for(j=0;j<8;j++)

    {

      if(wcrc & 0X0001)

      {

       wcrc>>=1;

        wcrc^=0XA001;

      }

      else

      {

        wcrc>>=1;

      }

     }

   }

  temp=wcrc;

  data_crc[0]=wcrc;

   data_crc[1]=wcrc>>8;

 return ;

  }

相关文章:

Modbus协议介绍

Modbus是一种串行通信协议&#xff0c;由Modicon公司&#xff08;现为施耐德电气&#xff09;在1979年为可编程逻辑控制器&#xff08;PLC&#xff09;通信而开发。它是工业自动化领域最常用的通信协议之一&#xff0c;具有开放性、简单性和跨平台兼容性&#xff0c;广泛应用于…...

深度学习遇到的问题处理

小土堆课程学习 1.tensorboard远程到本地无法显示 1.检查本地与远程端口是否被占用 2.一定要在远程服务器的项目下创建对应的存储文件夹 且 远程服务器一定要有需要处理的数据 ## 此时远程项目路径下有logs文件夹 存放上传的图像与数据 writerSummaryWriter("logs"…...

I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket&#xff0c;也就是I/O多路复用&#xff0c;是一种常见的并发编程技术&#xff0c;它允许单个线程或进程同时监视多个输入/输出&#xff08;I/O&#xff09;流&#xff08;例如网络连接、文件描述符&#xff09;。当任何一个I/O流准备好进行读写操…...

Westlake-Omni 情感端音频生成式输出模型

简述 github地址在 GitHub - xinchen-ai/Westlake-OmniContribute to xinchen-ai/Westlake-Omni development by creating an account on GitHub.https://github.com/xinchen-ai/Westlake-Omni Westlake-Omni 是由西湖心辰&#xff08;xinchen-ai&#xff09;开发的一个开源…...

Egg.js知识框架

一、Egg.js 核心概念 1. Egg.js 简介 基于 Koa 的企业级 Node.js 框架&#xff08;阿里开源&#xff09; 约定优于配置&#xff08;Convention over Configuration&#xff09; 插件化架构&#xff0c;内置多进程管理、日志、安全等能力 适合中大型企业应用&#xff0c;提供…...

随手记录5

一些顶级思维&#xff1a; ​ 顶级思维 1、永远不要自卑。 也永远不要感觉自己比别人差&#xff0c;这个人有没有钱&#xff0c;有多少钱&#xff0c;其实跟你都没有关系。有很多人就是那个奴性太强&#xff0c;看到比自己优秀的人&#xff0c;甚至一些装逼的人&#xff0c;这…...

Linux驱动:驱动编译流程了解

要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…...

使用 Flowise 构建基于私有知识库的智能客服 Agent(图文教程)

使用 Flowise 构建基于私有知识库的智能客服 Agent(图文教程) 在构建 AI 客服时,常见的需求是让机器人基于企业自身的知识文档,提供准确可靠的答案。本文将手把手教你如何使用 Flowise + 向量数据库(如 Pinecone),构建一个结合 RAG(Retrieval-Augmented Generation)检…...

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 创建 Spring 项目后&#xff0c;引入依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…...

测试文章标题01

模型上下文协议&#xff08;Model Context Protocol, MCP&#xff09;深度解析 一、MCP的核心概念 模型上下文协议&#xff08;Model Context Protocol, MCP&#xff09;是一种用于规范机器学习模型与外部环境交互的标准化框架。其核心目标是通过定义统一的接口和数据格式&am…...

linux中常用的命令(四)

目录 1-cat查看文件内容 2-more命令 3-less命令 4-head命令 5-tail命令 1-cat查看文件内容 cat中的一些操作 -b : 列出行号&#xff08;不含空白行&#xff09;-E : 将结尾的断行以 $ 的形式展示出来-n : 列出行号&#xff08;含空白行&#xff09;-T : 将 tab 键 以 ^I 显示…...

2025年阿里云大数据ACP高级工程师认证模拟试题(附答案解析)

这篇文章的内容是阿里云大数据ACP高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成&#xff0c;主要为了练习和巩固知识&#xff0c;并非所谓的 “题库”&#xff0c;考试中如果出现同样试题那真是纯属巧合。 1、下列关于MaxCompute的描述中&#xff0c;错误的是&am…...

【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit

1.问题描述&#xff1a; 预览PDF文件&#xff0c;文档上所描述的loadDocument接口&#xff0c;可以返回文件的状态&#xff0c;并无法实现PDF的预览&#xff0c;是否有能预览PDF相关接口&#xff1f; 解决方案&#xff1a; 1、执行loadDocument进行加载PDF文件后&#xff0c…...

二元随机响应(Binary Randomized Response, RR)的翻转概率

随机响应&#xff08;Randomized Response&#xff09;机制 ✅ 回答核心&#xff1a; p 1 1 e ε 才是「翻转概率」 \boxed{p \frac{1}{1 e^{\varepsilon}}} \quad \text{才是「翻转概率」} p1eε1​​才是「翻转概率」 而&#xff1a; q e ε 1 e ε 是「保留真实值」…...

hive两个表不同数据类型字段关联引发的数据倾斜

不同数据类型引发的Hive数据倾斜解决方案 #### 一、‌原因分析‌ 当两个表的关联字段存在数据类型不一致时&#xff08;如int vs string、bigint vs decimal&#xff09;&#xff0c;Hive会触发隐式类型转换引发以下问题&#xff1a; ‌Key值的精度损失‌&#xff1a;若关联字…...

利用SSRF击穿内网!kali靶机实验

目录 1. 靶场拓扑图 2. 判断SSRF的存在 3. SSRF获取本地信息 3.1. SSRF常用协议 3.2. 使用file协议 4. 172.150.23.1/24探测端口 5. 172.150.23.22 - 代码注入 6. 172.150.23.23 SQL注入 7. 172.150.23.24 命令执行 7.1. 实验步骤 8. 172.150.23.27:6379 Redis未授权…...

DVWA在线靶场-xss部分

目录 1. xxs&#xff08;dom&#xff09; 1.1 low 1.2 medium 1.3 high 1.4 impossible 2. xss&#xff08;reflected&#xff09; 反射型 2.1 low 2.2 medium 2.3 high 2.4 impossible 3. xss&#xff08;stored&#xff09;存储型 --留言板 3.1 low 3.2 medium 3.3 high 3.…...

Go 语言 slice(切片) 的使用

序言 在许多开发语言中&#xff0c;动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组&#xff0c;因为对于数组的大小大多数情况下我们是不能事先就确定好的&#xff0c;所以他不够灵活。动态数组通过提供自动扩容的机制&#xff0c;极大地提升了开发效率。这…...

Android Exoplayer 实现多个音视频文件混合播放以及音轨切换

在之前的文章ExoPlayer中常见MediaSource子类的区别和使用场景中介绍了Exoplayer中各种子MediaSource的使用场景&#xff0c;这篇我们着重详细介绍下实现多路流混合播放的用法。常见的使用场景有&#xff1a;视频文件电影字幕、正片视频广告视频、背景视频背景音乐等。 初始化…...

深入浅出:Java 中的动态类加载与编译技术

1. 引言 Java 的动态性是其强大功能之一,允许开发者在运行时加载和编译类,从而构建灵活、可扩展的应用程序。动态类加载和编译在许多高级场景中至关重要,例如插件系统、动态代理、框架开发(如 Spring)和代码生成工具。Java 提供了两大核心机制来实现这一目标: 自定义 Cl…...

js常用的数组遍历方式

以下是一个完整的示例&#xff0c;将包含图片、文字和数字的数组渲染到 HTML 页面&#xff0c;使用 ​多种遍历方式​ 实现不同的渲染效果&#xff1a; 1. 准备数据&#xff08;数组&#xff09; const items [{ id: 1, name: "苹果", price: 5.99, image: "h…...

【网络编程】五、三次握手 四次挥手

文章目录 Ⅰ. 三次握手Ⅱ. 建立连接后的通信Ⅲ. 四次挥手 Ⅰ. 三次握手 ​ 1、首先双方都是处于未通信的状态&#xff0c;也就是关闭状态 CLOSE。 ​ 2、因为服务端是为了服务客户端的&#xff0c;所以它会提前调用 listen() 函数进行对客户端请求的监听。 ​ 3、接着客户端就…...

【类拷贝文件的运用】

常用示例 当我们面临将文本文件分成最大大小块的时&#xff0c;我们可能会尝试编写如下代码: public class TestSplit {private static final long maxFileSizeBytes 10 * 1024 * 1024; // 默认10MBpublic void split(Path inputFile, Path outputDir) throws IOException {…...

从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景20250509

&#x1f916; 从 AGI 到具身智能体&#xff1a;解构 AI 核心概念与演化路径全景 作者&#xff1a;AI 应用实践者 在过去的几年中&#xff0c;AI 领域飞速发展&#xff0c;从简单的文本生成模型演进为今天具备复杂推理、感知能力的“智能体”系统。本文将从核心概念出发&#x…...

Docker Compose 的历史和发展

这张图表展示了Docker Compose从V1到V2的演变过程&#xff0c;并解释了不同版本的Compose文件格式及其支持情况。以下是对图表的详细讲解&#xff1a; Compose V1 No longer supported: Compose V1已经不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …...

ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S

上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细&#xff0c;主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...

从 JIT 即时编译一直讲到CGI|FastGGI|WSGI|ASGI四种协议的实现细节

背景 我一度理解错了这个东西&#xff0c;之前没有AI的时候&#xff0c;也没深究过&#xff0c;还觉得PHP8支持了常驻内存的运行的错误理解&#xff0c;时至今日再来看这个就很清晰了。 另外&#xff0c;早几年对以上4个协议&#xff0c;我也没搞懂&#xff0c;时至今日&…...

Vue.js 页面切换空白与刷新 404 问题深度解析

在使用 Vue.js 开发单页应用 (SPA) 的过程中&#xff0c;开发者经常会遇到两个常见问题&#xff1a;页面切换时出现短暂的空白屏幕&#xff0c;以及刷新页面时返回 404 错误。这两个问题不仅影响用户体验&#xff0c;还可能阻碍项目的正常上线。本文将深入探讨这两个问题的成因…...

CSS3 遮罩

在网页设计中&#xff0c;我们经常需要实现一些特殊的视觉效果来增强用户体验。CSS3 遮罩&#xff08;mask&#xff09;允许我们通过控制元素的可见区域来创建各种精美的视觉效果。本文将带你全面了解 CSS3 遮罩的功能和应用。 什么是 CSS3 遮罩&#xff1f; CSS3 遮罩是一种…...

ResNet残差神经网络的模型结构定义(pytorch实现)

ResNet残差神经网络的模型结构定义&#xff08;pytorch实现&#xff09; ResNet‑34 ResNet‑34的实现思路。核心在于&#xff1a; 定义残差块&#xff08;BasicBlock&#xff09;用 _make_layer 方法堆叠多个残差块按照 ResNet‑34 的通道和层数配置来搭建网络 import torch…...