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

二、ModBus协议解析

在这里插入图片描述

0x01 初识ModBus

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气)于1979年为使用可编程逻辑控制器(PLC)通信而发表的。现在的Modbus协议已经成为工业领域通信协议的业界标准,并且是工业电子设备之间常用的连接方式。

Modbus协议能够成为工业领域应用最广泛的协议和业界标准,它具备了以下几个特点 :

  • 免费:这个是最大的前提,任何产品都是一样,只有通过免费才能获取到前期最大的使用量。
  • 简单:Modbus协议帧格式简单紧凑,用户容易理解,厂商容易集成。
  • 接口:Modbus协议只是一种规约,属于应用层的协议,因此不仅可以应用在串口(485/232/422),也可以在以太网、光纤、蓝牙、无线上传输。

0x02 ModBus报文分析

帧结构:

地址码功能码发送数据CRC校验码
1byte1byten byte2byte

地址码: 地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。地址码为0时,为广播地址,所有从机均能识别,从站不做应答。

功能码: 通讯传送的第二个字节。ModBus通讯规约定义功能码为1到127。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,如果从机发送的功能码的最高位为1(即功能码大于127),则表明从机没有响应操作或发送出错,如果从机发送的功能码与从主机发送来的功能码一样,则表明从机已响应主机进行操作。例如:功能码:00000003(03H),如果从机正常执行,则返回相同功能功能码,如果异常则返回10000003(83H)。

数据区: 数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。

CRC校验: 同TCP/IP 的CRC校验一样,都是为了保证数据传输不出错而设置的。被计算和校验的内容包括了除校验位意外的所有内容,即:地址码、功能码和数据。

0x03 ModBus常用功能码

了解Modbus的常用功能码是必要的,只有在了解了相关功能码后,才能深入的去分析Modbus协议的相关操作和具体功能。

功能码描述PLC地址范围寄存器地址范围操作单位操作数量
0x01读线圈寄存器00001-999990x0000-0xFFFF按bit操作1或n
0x02读离散输入寄存器10001-199990x0000-0xFFFF按bit操作1或n
0x03读保持寄存器40001-499990x0000-0xFFFF按byte操作1或n
0x04读输入寄存器30001-399990x0000-0xFFFF按byte操作1或n
0x05写单个线圈寄存器00001-999990x0000-0xFFFF按bit操作1
0x06写单个保持寄存器40001-499990x0000-0xFFFF按byte操作1
0x0F写多个线圈寄存器00001-999990x0000-0xFFFF按bit操作1
0x10写多个保持寄存器40001-499990x0000-0xFFFF按byte操作1

0x04 Modbus寄存器解读

从上面的功能码中我们能够看到,被操作的相关寄存器一共有四种:分别是线圈寄存器、离散输入寄存器、保持寄存器以及输入寄存器。

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

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

保持寄存器: 这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,与之功能码有对应的三个:0x03 0x06 0x10 。

输入寄存器: 和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。 对应的功能码是:0x04。

0x05 Modbus 协议举例分析

1、保持寄存器数据读取

主机请求: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 12 34 B5 33

相关解析:

#主机请求数据解析
01:PLC地址
03:功能码,查询保持寄存器
00 00:代表查询的寄存器的起始地址
00 01:代表查询的寄存器的结束地址
84 0A:循环冗余校验码
#从机回复数据解析
01:PLC地址
03:功能码,与主机请求相同,说明执行成功
02:代表后面寄存器的数据的字节数,一个寄存器有两个字节,所以这里的字节数肯定是查询的寄存器个数的2倍
12 34:寄存器的值
B5 33: 循环冗余校验码

2、单个保持寄存器写入

主机请求: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A

相关解析:

# 主机请求数据解析
01:PLC地址
06:功能码,单个保持寄存器写入
00 00:要被写入发寄存器的地址
00 01:被写入的内容,也就是在寄存器00 00的位置写入数据 00 01
48 0A:循环冗余校验码
#从机回复
01:PLC地址
06:响应功能码,与请求中的相同,说明执行成功
00 00:被写入的地址
00 01:被写入的数据
48 0A:校验码

3、多个保持寄存器写入

主机请求: 01 10 00 00 00 02 04 11 22 33 44 42 5A
从机回复: 01 10 00 00 00 02 41 C8

相关解析:

# 主机请求解析
01:PLC地址
10:功能码,多个保持寄存器写入
00 00:被写入的寄存器的起始地址
00 02:代表被修改的寄存器的数量
04:代表别修改的总字节数
11 22 33 44:将要修改的值
42 5A:校验码
#从机回复数据解析:
01:PLC地址
10:功能码
00 00:寄存器中被写入的地址
00 02:说明被修改的寄存器数量
41 C8:校验码

0x06 参考内容

  • https://blog.csdn.net/CAI____NIAO/article/details/124344164
  • https://xw.qq.com/cmsid/20220328A0872C00
  • https://blog.csdn.net/qq_36958104/article/details/124193794
  • https://www.163.com/dy/article/G5P36B0R0538S33I.html

相关文章:

  • AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费
  • Mybatis中使用in()查询
  • 关于笔记本电脑插上网线没反应的解决方案
  • 第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离
  • selenium + python自动化测试环境搭建
  • 金融监管科技业务中的AI应用:上市公司公告信息风险识别
  • Mac 安装Maven的几种方法和操作步骤
  • 超薄网络变压器(百兆千兆万兆)如何选型?及相关产品集成功能分类
  • keil调试专题篇
  • alter table column 列属性
  • 数据库面试题——锁
  • MySQL:索引与事物
  • springboot Aspect切面
  • 【Python】P1 Python 基础语法
  • Windows Server 2022 中文版、英文版下载 (updated Mar 2023)
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Babel配置的不完全指南
  • laravel5.5 视图共享数据
  • Spark学习笔记之相关记录
  • storm drpc实例
  • tab.js分享及浏览器兼容性问题汇总
  • vue 配置sass、scss全局变量
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 利用jquery编写加法运算验证码
  • 与 ConTeXt MkIV 官方文档的接驳
  • 白色的风信子
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • mysql面试题分组并合并列
  • 大数据全解:定义、价值及挑战
  • 数据可视化之下发图实践
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (0)Nginx 功能特性
  • (23)Linux的软硬连接
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)Knockout 创建自定义绑定
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***检测工具之RKHunter AIDE
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET成年了,然后呢?
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @private @protected @public