网络编程(5)Modbus

【1】Modbus

1. 起源

  • Modbus由Modicon公司于1979年开发,是全球第一个真正用于工业现场的总线协议
  • 在中国,Modbus 已经成为国家标准,并有专业的规范文档,感兴趣的可以去查阅相关的文件,详情如下:标准编号为:GB/T19582-2008文件名称:《基于 Modbus 协议的工业自动化网络规范》
  • Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种,其中Modbus TCP是在施耐德收购Modicon后1997年发布的。

2. 分类

1)Modbus RTU

运行在串口上的协议,采用二进制表现形式以及紧凑的数据结构,通信效率较高,应用比较广泛

2)Modbus ASCII

运行在串口上的协议,采用ASCII码进行传输,并且每个字节的开始和结束都有特殊字符作为标志,传输效率远远低于Modbus RTU,一般只有通讯量比较少时才会考虑它。

3)Modbus TCP

是一种基于以太网的协议,使用 TCP/IP 协议栈进行通信。它使用以太网帧作为数据传输的封装,通过 IP 地址和端口号来标识设备

3. 优势

简单、免费、容易使用

4. 应用场景

Modbus协议是现在国内工业领域应用最多的协议,不只PLC设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备

问答

在面试中回答“Modbus 协议”相关问题时,可从协议定位、核心架构、传输方式、通信流程、实际应用、技术价值等维度组织内容,既体现全面性,又贴合工业/嵌入式场景:

一、协议定位与核心价值

Modbus 是工业自动化领域应用广泛的开源通信协议,旨在解决工业现场不同设备(PLC、传感器、执行器、网关等)间的“数据互通与指令协同”问题,让分散的设备能像“统一系统”一样工作,是工业物联网(IIoT)底层设备互联的核心协议之一。

二、核心架构:主从式通信

采用“一主多从”的主从架构:

  • 主设备(如 PLC、工业网关、上位机)主动发起通信请求;
  • 从设备(如温湿度传感器、电机驱动器、阀门控制器)仅响应主设备的请求,不主动发起通信。

这种架构简化了通信冲突处理,适合工业现场“中心控制+分散设备”的管理模式。

三、主流传输版本与差异

Modbus 针对不同“传输介质”衍生出 3 类核心版本,适配从“串口总线”到“以太网”的场景:

1. Modbus RTU(串行总线,如 RS - 485/RS - 232)

  • 数据格式:二进制紧凑传输,每个字节为 8 位,用 CRC(循环冗余校验) 保证数据完整性;

详述循环冗余校验CRC

一道题带你搞懂CRC循环冗余校验是如何纠错的

  • 传输效率:适合长距离、低带宽的工业现场(如车间产线设备互联),但通信速率受串口波特率限制(常见 9600bps、19200bps);
  • 典型场景:工厂产线的传感器(温湿度、压力)与 PLC 通信,单主设备可带最多 247 个从设备。

2. Modbus ASCII(串行总线)

  • 数据格式:ASCII 字符传输(每个字节拆为 2 个 ASCII 字符),用 LRC(纵向冗余校验)
  • 特点:可读性强(便于串口调试工具抓包分析),但传输效率低于 RTU(相同数据,ASCII 长度是 RTU 的 2 倍),多用于对“调试友好性”要求高的场景(如实验室设备联调)。

3. Modbus TCP(以太网)

  • 传输层:基于 TCP/IP 协议,把 Modbus 应用数据封装在 TCP 数据包中传输;
  • 特点:突破串口“距离与速率”限制,支持跨网络、高速通信(千兆以太网下可近实时传输);
  • 典型场景:工业物联网云平台与边缘网关通信、智能工厂多车间设备的跨区域集中管理。

四、通信流程(以“主设备读从设备数据”为例)

以 Modbus RTU 为例,核心流程分“请求 - 响应 - 错误处理”:

  1. 主设备请求:主设备发送“请求帧”,包含: 从设备地址(指定和哪个从设备通信);
    1. 功能码(如 0x03 表示“读保持寄存器”,0x01 表示“读线圈状态”);
    2. 数据地址(要读的寄存器/线圈起始地址);
    3. 数据长度(读多少个寄存器/线圈);
    4. CRC 校验(确保帧传输无错)。
  2. 从设备响应:从设备收到请求后,先校验地址和 CRC: 若匹配且能执行操作,返回“响应帧”:包含从设备地址、功能码、实际读取的数据、CRC 校验;
    1. 若出错(如地址不存在、功能不支持),返回“异常响应帧”:功能码最高位设为 1(表示异常),并附带“异常码”(说明错误原因,如 0x01 表示“不支持的功能码”)。
  3. 错误处理:主设备收到异常响应后,可根据异常码重试、切换从设备或报警。

五、在工业/嵌入式场景的典型应用

Modbus 是工业设备互联的“通用语言”,典型应用场景包括:

  • 设备数据采集:PLC 通过 Modbus 读取车间温湿度传感器、压力变送器的实时数据,为生产决策(如空调启停、产线速度调整)提供依据;
  • 设备远程控制:上位机通过 Modbus TCP 向边缘网关下发指令,网关再通过 Modbus RTU 控制车间电机转速、阀门开关;
  • 多系统集成:把采用不同通信协议的设备(如老产线的 Modbus 传感器、新系统的 Profinet 执行器)通过“Modbus 网关”桥接,实现跨协议协同。

六、技术优势(为什么工业领域广泛用 Modbus)

  • 开源免费:无授权费用,降低工业企业/嵌入式开发者的使用成本;
  • 易实现:协议格式简单,嵌入式端(如 STM32、Arduino)可通过串口库+CRC 校验库快速开发从设备/主设备;
  • 兼容性强:几乎所有工业设备厂商(西门子、施耐德、国产 PLC 等)都支持 Modbus,不同品牌设备能“即连即用”。

【2】Modbus TCP协议

1. 特点

  • 遵循主从问答协议 (主机 从机 主从问答:采集信息 控制)
  • (主机问---从机答247 1-247:从机 0:广播 248-255:保留 )
  • Modbus TCP协议是应用层协议,基于传输层TCP通信
  • Modbus TCP的默认端口号是502

2. 组成

Modbus TCP协议包含三部分:报文头、功能码、数据

报文头有7个字节,功能码有1个字节,Modbus TCP协议最大数据帧长度为260个字节,数据最多为252个字节。

2.1 报文头:7个字节

事务处理标识符:包的标识,没有什么限制,一般主机发什么从机回什么

协议标识符:0x0000 两个字节

长度:长度后面的字节个数,必须占2个字节

单元标识符:从机地址,从机ID

2.2 寄存器(存储数据) ******

Modbus TCP通过寄存器的方式存储数据。

一共有四种类型的寄存器,分别是:离散量输入寄存器、线圈寄存器、输入寄存器、保持寄存器。

1) 离散量和线圈其实就是位寄存器(每个寄存器数据占1字节),工业上主要用于控制IO设备。

线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。

对应的功能码也就是:0x01 0x05 0x0f

离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。

所以功能码也简单就一个读的 0x02

2) 输入和保持寄存器字寄存器每个寄存器数据占2个字节),工业上主要用于存储工业设备的值。

保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写

所以功能码有对应的三个:0x03 0x06 0x10

输入寄存器,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我通过读取输入寄存器获取现在的AD采集值

对应的功能码也就一个 0x04

2.3 功能码(记住)

寄存器PLC地址和寄存器的对应关系:

线圈: 00001-09999

离散量输入:10001-19999

输入寄存器:30001-39999

保持寄存器:40001-49999

开灯:05

读温度传感器数据:03 04

具体协议分析:

总结

数据:

主机--》从机:

报文头(7字节)+功能码(1)+起始地址(2)+数量(2)

从机--》主机:

报文头(7)+功能码(1)+字节计数(1)+数据(?)

写数据:

写单个:

主机--》从机:

报文头(7)+功能码(1)+地址(2)+断通标志/数据(2)

(线圈:断通标志 0x0000:复位 0xff00:置位 保持寄存器:数据)

从机--》主机:

原文返回

对于读数据和写单个主机--》从机来说,报文头中字节长度固定为0x0006,(1个字节的单元标识符+1个字节的功能码+4个字节的数据)

多个:

主机--》从机:

报文头(7)功能码(2)+起始地址(2)+数量(2)+字节计数(1)+数据(?)

从机--》主机:

报文头(7)功能码(2)+起始地址(2)+数量(2)(原文返回)

练习

主机--》从机:

12 34 00 00 00 06 01 03 00 63 00 03

从机--》主机:

12 34 00 00 00 09 01 03 06 45 69 11 11 66 66

1.读传感器数据,读1个寄存器数据,写出主从数据收发协议。

主机--》从机:12 34 00 00 00 06 11 03 00 01 00 01

从机--》主机:12 34 00 00 00 05 11 03 02 12 34

2. 写出控制IO设备开关的协议数据,操作1个线圈,置1。

主机--》从机:12 34 00 00 00 06 01 05 00 63 ff 00

从机--》主机:12 34 00 00 00 06 01 05 00 63 ff 00

【3】工具使用

1.Modbus Slave、Poll安装

1)默认安装

2)破解:点击connection-》connect,输入序列号(序列号在SN.txt)

3)使用:

从机:Modbus Slave

先设置:

再连接:点击connection-》connect

主机:

先设置

再连接:(一定要先开启从机(salve端),再开启主机(poll端))

2. 网络调试助手

linux下编程

在虚拟机写程序实现poll端功能,编写客户端实现和Slave通信,实现03功能码。

uint8_t data[12]={0x00,0x00,0x00,0x00,0x00,0x06,0x01....};

主机要先建立连接---》发送协议(modbus tcp协议)---》接收数据(modbus tcp协议)--》打印数据

1. 功能码0x01(读线圈状态)

示例1:读取地址0x0000的两个线圈

主机->从机:00 01 00 00 00 06 01 01 00 00 00 02 
从机->主机:00 01 00 00 00 04 01 01 01 03 
# 解析:线圈0状态为1(ON),线圈1状态为1(ON),其余线圈状态无效

示例2:读取地址0x0003的四个线圈

主机->从机:00 02 00 00 00 06 01 01 00 03 00 04 
从机->主机:00 02 00 00 00 04 01 01 01 0F 
# 解析:二进制0F转换为十进制为15,即00001111,线圈3至6状态为1(ON)(有效位为1)

2. 功能码0x02(读离散输入)

示例1:读取地址0x0001的三个离散输入

主机->从机:00 03 00 00 00 06 01 02 00 01 00 03 
从机->主机:00 03 00 00 00 04 01 02 01 05 
# 解析:二进制05转换为十进制为5,即00000101,输入1状态为1(ON),输入3状态为1(ON)

示例2:读取地址0x0005的两个离散输入

主机->从机:00 04 00 00 00 06 01 02 00 05 00 02 
从机->主机:00 04 00 00 00 04 01 02 01 01 
# 解析:二进制01转换为十进制为1,即00000001,仅输入5状态为1(ON)

3. 功能码0x03(读保持寄存器)

示例1:读取地址0x0002的两个保持寄存器

主机->从机:00 05 00 00 00 06 01 03 00 02 00 02 
从机->主机:00 05 00 00 00 07 01 03 04 12 34 56 78 
# 解析:寄存器2的值为0x1234,寄存器3的值为0x5678

示例2:读取地址0x000A的一个保持寄存器

主机->从机:00 06 00 00 00 06 01 03 00 0A 00 01 
从机->主机:00 06 00 00 00 05 01 03 02 FF FF 
# 解析:寄存器10的值为0xFFFF(典型错误状态码)

4. 功能码0x04(读输入寄存器)

示例1:读取地址0x0000的三个输入寄存器

主机->从机:00 07 00 00 00 06 01 04 00 00 00 03 
从机->主机:00 07 00 00 00 09 01 04 06 00 64 01 F4 FF FF 
# 解析:寄存器0的值为100(0x0064),寄存器1的值为500(0x01F4),寄存器2的值为65535(0xFFFF)

示例2:读取地址0x0005的两个输入寄存器

主机->从机:00 08 00 00 00 06 01 04 00 05 00 02 
从机->主机:00 08 00 00 00 07 01 04 04 80 00 40 00 
# 解析:寄存器5的值为32768(0x8000),寄存器6的值为16384(0x4000)

5. 功能码0x05(写单个线圈)

示例1:开启地址0x0063的线圈

主机->从机:00 09 00 00 00 06 01 05 00 63 FF 00 
从机->主机:00 09 00 00 00 06 01 05 00 63 FF 00 
# 说明:0xFF00表示置ON,成功时返回相同数据

示例2:关闭地址0x001A的线圈

主机->从机:00 0A 00 00 00 06 01 05 00 1A 00 00 
从机->主机:00 0A 00 00 00 06 01 05 00 1A 00 00 
# 说明:0x0000表示置OFF

6. 功能码0x06(写单个寄存器)

示例1:写地址0x0003的寄存器值为0x55AA

主机->从机:00 0B 00 00 00 06 01 06 00 03 55 AA 
从机->主机:00 0B 00 00 00 06 01 06 00 03 55 AA 
# 成功时回显写入值

示例2:写地址0x0010的寄存器值为0x1234

主机->从机:00 0C 00 00 00 06 01 06 00 10 12 34 
从机->主机:00 0C 00 00 00 06 01 06 00 10 12 34 

7. 功能码0x0F(写多个线圈)

示例1:写地址0x0010的3个线圈为ON

主机->从机:00 0D 00 00 00 08 01 0F 00 10 00 03 01 07 
从机->主机:00 0D 00 00 00 06 01 0F 00 10 00 03 
# 解析:二进制07转换为十进制为7,即00000111,线圈16至18置ON
​​​​​​​

示例2:写地址0x0020的5个线圈(二进制10101)

主机->从机:00 0E 00 00 00 08 01 0F 00 20 00 05 01 15 
从机->主机:00 0E 00 00 00 06 01 0F 00 20 00 05 
# 解析:二进制15转换为十进制为15,即00010101,仅偶数位生效(线圈32、34、36置ON)

8. 功能码0x10(写多个寄存器)

示例1:写地址0x0004的2个寄存器(值0xAABB和0xCCDD)

主机->从机:00 0F 00 00 00 0B 01 10 00 04 00 02 04 AA BB CC DD 
从机->主机:00 0F 00 00 00 06 01 10 00 04 00 02 
# 数据部分以四字节表示两个寄存器的值

示例2:写地址0x0010的三个寄存器(十进制值100、200、300)

主机->从机:00 10 00 00 00 0D 01 10 00 10 00 03 06 00 64 00 C8 01 2C 
从机->主机:00 10 00 00 00 06 01 10 00 10 00 03 
# 数值转换:100转换为十六进制为0x0064,200转换为十六进制为0x00C8,300转换为十六进制为0x012C

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95998.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress性能优化全攻略:从插件实战到系统级优化

一、性能诊断:定位瓶颈是优化第一步 在对 WordPress 进行性能优化前,精准定位性能瓶颈至关重要。这就好比医生看病,只有先准确诊断,才能对症下药。下面将从核心性能指标检测工具和服务器基础性能排查两个方面展开。 1.1 核心性能…

十、网络与信息安全基础知识

1 网络概述 1.1 计算机网络的概念 1.1.1 计算机网络的发展 计算机网络的发展经历了四个主要阶段: 具有通信功能的单机系统: 早期形式:一台计算机连接多个终端。例子:20 世纪 50 年代的 SAGE 系统。 具有通信功能的多机系统&#x…

校园管理系统|基于SpringBoot和Vue的校园管理系统(源码+数据库+文档)

项目介绍 : SpringbootMavenMybatis PlusVue Element UIMysql 开发的前后端分离的校园管理系统,项目分为管理端和用户端和院校管理员端 项目演示: 基于SpringBoot和Vue的校园管理系统 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理…

新后端漏洞(上)- Weblogic SSRF漏洞

漏洞介绍:Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。编译及启动测试环境docker-compose up -d访问http://127.0.0.1:7001/uddiexplorer/,无需登录即可查看uddiexplore…

Fiddler 实战案例解析,开发者如何用抓包工具快速解决问题

在现代软件开发中,网络通信问题几乎是最常见的 Bug 来源。无论是前端调用后端 API、移动端与服务端交互,还是第三方 SDK 请求,都会因为参数错误、环境差异、网络条件不稳定而出现各种难以复现的问题。 在这些场景下,日志往往并不…

【佳易王药品进销存软件实测】:操作简单 + 全流程管理,医药台账管理好帮手#软件教程全解析

前言: (一)试用版获取方式 资源下载路径:进入博主头像主页第一篇文章末尾,点击卡片按钮;或访问左上角博客主页,通过右侧按钮获取详细资料。 说明:下载文件为压缩包,使用…

【设计模式】UML 基础教程总结(软件设计师考试重点)

【设计模式】UML 基础教程总结(软件设计师考试重点) 统一建模语言(Unified Modeling Language,UML),是一种标准化的面向对象建模语言,用于可视化、规范化和文档化软件系统设计。 参考资料:UML基础教程资料(可用于软件设计师考试)! (关注不迷路哈!!!) 文章目录 【…

vite_react 插件 find_code 最终版本

vite_react 插件 find_code 最终版本当初在开发一个大型项目的时候,第一次接触 vite 构建,由于系统功能很庞大,在问题排查上和模块开发上比较耗时,然后就开始找解决方案,find-code 插件方案就这样实现出来了&#xff0…

Python+DRVT 从外部调用 Revit:批量创建梁(2)

接着昨天的示例,继续创建梁,这次展示以椭圆弧、Nurbs为轴线。 创建以椭圆弧为轴线的梁 椭圆弧曲线的创建: # 创建椭圆弧 def CreateEllipse(ctx : MyContext, z: float) -> DB.Curve:"""create a horizontal partial el…

Flutter × 鸿蒙系统:一文搞懂如何将你的 App 移植到 HarmonyOS!

摘要 Flutter 是一个高效的跨平台框架,开发者可以使用同一套代码快速部署到 Android、iOS 等主流平台。随着华为鸿蒙系统(HarmonyOS)的崛起,越来越多开发者希望能将已有的 Flutter 应用迁移到鸿蒙生态中运行。目前,通过…

QML Charts组件之主题与动画

目录前言相关系列ChartView 概述:主题与动画示例一:主题设置(ChartTheme.qml)图表与主题设置主题切换部分示例二:动画设置(ChartAnimation.qml)图表与动画属性部分分类轴与柱状图数据部分交互与…

【论文阅读】Security of Language Models for Code: A Systematic Literature Review

Security of Language Models for Code: A Systematic Literature Review 该论文于2025年被CCF A类期刊TOSEM收录,作者来自南京大学和南洋理工大学。 概述 代码语言模型(CodeLMs)已成为代码相关任务的强大工具,其性能优于传统方法…

[光学原理与应用-422]:非线性光学 - 计算机中的线性与非线性运算

在计算机科学中,线性运算和非线性运算是两类核心的数学操作,它们在算法设计、数据处理、机器学习等领域有广泛应用。两者的核心区别在于是否满足叠加原理(即输入信号的线性组合的输出是否等于输出信号的线性组合)。以下是详细解释…

Day21_【机器学习—决策树(3)—剪枝】

决策树剪枝是一种防止决策树过拟合的一种正则化方法;提高其泛化能力。决策树在训练过程中如果生长过深、过于复杂,会过度拟合训练数据中的噪声和异常值,导致在新数据上表现不佳。剪枝通过简化树结构,去除不必要的分支,…

从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案

🚀 从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案 🔗 项目地址:https://github.com/Haohao-end/LMForge-End-to-End-LLMOps-Platform-for-Multi-Model-Agents ⭐ 欢迎 Star &…

如何使显示器在笔记本盖上盖子时还能正常运转

1、搜索找到控制面板,打开进入 2、找到硬件和声音,进入 3、选择电源选项 4、选择 选择关闭笔记本计算机盖的功能 5、把关闭子盖时,改成不采取任何操作 参考链接:笔记本电脑合上盖子外接显示器依然能够显示设置_笔记本合上外接显示…

FPGA学习笔记——SDR SDRAM的读写(调用IP核版)

目录 一、任务 二、需求分析 三、Visio图 四、具体分析 1.需要注意的问题 (1)器件SDRAM需要的时钟 (2)跨时钟域(异步FIFO) 2.模块分析和调用 (1)SDR SDRAM IP核调用 &…

离散数学学习指导与习题解析

《离散数学学习指导与习题解析(第2版)》是屈婉玲、耿素云、张立昂编著的《离散数学(第2版)》的配套参考书,旨在为学生提供系统的学习指导和丰富的习题解析。本书内容全面,涵盖数理逻辑、集合论、代数结构、…

Qt网络通信服务端与客户端学习

Qt网络通信服务端与客户端学习 一、项目概述 本项目基于Qt框架实现了TCP服务端与客户端的基本通信,涵盖连接、消息收发、断开管理等功能,适合初学者系统学习Qt网络模块的实际用法。 二、项目结构 52/ 服务端:main.cpp、widget.cpp、widget.h5…

神马 M60S++ 238T矿机参数解析:高效SHA-256算法比拼

1. 算法与适用币种神马 M60S 238T采用SHA-256算法,适用于挖掘主流的加密货币,包括比特币(BTC)和比特币现金(BCH)。SHA-256(安全哈希算法256位)是一种广泛应用于比特币等加密货币挖矿…