ModbusTCP协议报文解析
ModbusTCP协议报文解析
报文格式
交互(通信)标识:2个字节 为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文。
协议标识:2个字节 表示该条指令遵循ModbusTCP协议,一般都为00 00
报文长度:2个字节 表示后面数据的长度,有几个字节,高字节在前
(前六位Modbus/TCP协议不同功能码通用)
设备标识 :1个字节 设备地址,这个可以用于局域网里面的具体的地址,如果目标机器有固定ip,这个就不起作用,直接上写成 00
功能码:1个字节 功能码在modbus协议用于表示信息帧的功能
数据:N个字节 后面数据根据不同功能码不同。
modbus 常用功能代码
十进制 | 功能 | 数据类型 |
---|---|---|
01 | 读取 多个线圈 | 位 |
02 | 读取 多个离散量输入量 | 位 |
03 | 读取 多个保持寄存器 | 16进制整型 |
04 | 读取 多个输入寄存器 | 16进制整型 |
05 | 写入 单个线圈 | 位 |
06 | 写入 单个寄存器 | 16进制整型 |
15 | 写入 多个线圈 | 位 |
16 | 写入 多个寄存器 | 16进制整型 |
功能码详解
01 读取多个线圈
示例报文:
请求:00 01 00 00 00 06 FF 01 00 01 00 10
第1,2位 00 01
交互标识
第3,4位 00 00
协议标识
第5,6位 00 06
后面报文长度 有6位
第7位 FF 设备地址,发送什么,响应什么
第8位 01 功能码
第9,10位00 01
起始地址
第11,12位 00 10
查询线圈长度,查询16位线圈
响应:00 01 00 00 00 05 FF 01 02 0A 02
前四位和7,8位同请求发送的报文
第5,6位是后面报文长度
第9位是后面数据位的长度,
第10位开始是数据位。
01查询线圈,每一个16进制数据表示8位线圈
第10位0A --> 0000 1010 第二位是1,第四位是1
02 读取多个离散量输入
同01
03 读取 多个保持寄存器
寄存器读取与线圈的区别,响应数据,寄存器数据每两个字节表示1位,一次请求不能超过127个地址
示例报文:
请求:00 01 00 00 00 06 01 03 00 05 00 02
第1,2位 00 01
交互标识
第3,4位 00 00
协议标识
第5,6位 00 06
后面报文长度 有6位
第7位 01
设备地址,发送什么,响应什么
第8位 03
功能码
第9,10位00 05
起始地址
第11,12位 00 02
查询寄存器长度,查询2个寄存器
响应:00 01 00 00 00 07 01 03 04 00 22 00 00
前四位(00 01 00 00
)和7,8位(01 03
)同请求发送的报文
第5,6位 00 07
是后面报文长度
第9位 04 是后面数据位的长度
第10-13位 数据位(00 22 00 00
)
04 读取 多个输入寄存器
同03
05 (05H)写入 单个线圈
请求:00 01 00 00 00 06 FF 05 00 01 FF 00
第9,10位 00 01
写入线圈的地址
第11,12位 写入的数据值 FF 00 表示置ON/1状态 00 00 表示置OFF/0状态
响应:00 01 00 00 00 06 FF 05 00 01 FF 00
15(0FH)写入 多个线圈
请求:00 01 00 00 00 06 FF 0F 00 05 00 0A 02 CD 01
第9,10位 00 05
写入的起始地址
第11,12位 00 0A
写入线圈数量
第13位 02
数据字节数量
第14位之后是数据 低字节在前
CD 01 —> 1100 1101 0000 0001
位 | 0C | 0B | 0A | 09 | 08 | 07 | 06 | 05 |
值 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
位 | 14 | 13 | 12 | 11 | 10 | 0F | 0E | 0D |
值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
06(06H) 写入 单个寄存器
请求:00 05 00 00 00 06 FF 06 00 05 00 23
向地址为5的寄存器写入35。
第9,10位 00 05写入的起始地址
第11,12位 00 0A写入寄存器的值
响应:00 05 00 00 00 06 FF 06 00 05 00 23
16(10H)写入多个寄存器
请求:00 06 00 00 00 0B FF 10 00 02 00 02 04 00 21 00 2A
从地址2开始写入两个寄存器,2寄存器写入33,3寄存器写入42
第9,10位 00 02写入的起始地址
第11,12位 00 02写入寄存器的数量
第13位 04 后面数据的字节
第14-17位 数据
响应:00 06 00 00 00 06 FF 10 00 02 00 02
从地址2开始写入两个寄存器,2寄存器写入33,3寄存器写入42
第9,10位 00 02
写入的起始地址
第11,12位 00 02
写入寄存器的数量
第13位 04 后面数据的字节
第14-17位 数据
响应:00 06 00 00 0 0 06 FF 10 00 02 00 02
错误响应
当发生通讯异常时,响应前7位仍然为modbus正常协议格式,第八位响应功能码(请求功能码+0x80),第九位异常码。
异常数据即包含异常码的数据:
目前使用的异常码是:01,02,03和04。
- 响应功能码 = 请求功能码 + 0x80
- 响应报文提供异常码显示出错原因。
常见异常码含义:
异常码 | 名称 | 含义 |
---|---|---|
01 | 非法功能 | 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作,可能是因为功能码仅适用于新设备而被选单元中不可实现同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:它是未配置的,且要求返回寄存器值。 |
02 | 地址非法 | 对于服务器(或从站)来说,询问中接收的数据地址是不可允许的地址,特别是参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,偏移量96和长度4的请求会成功,而偏移量96和长度5的请求将产生异常码02。 |
03 | 数据非法 | 对于服务器(或从站)来说,询问中包括的值是不可允许的值。该值指示了组合请求剩余结构中的故障。例如:隐含长度是不正确的。modbus协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。 |
04 | 从站设备故障 | 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 |
特殊数据处理
float 按IEEE-754标准协议存储
C#中浮点数的二进制格式遵循IEEE754标准
IEEE-754格式标准:一个浮点数有2部分组成:底数m和指数e
IEEE-754
寄存器地址
Modbus协议定义的寄存器地址是5位十进制地址,即:
线圈(DO)地址:00001~09999
触点(DI)地址:10001~19999
输入寄存器(AI)地址:30001~39999
输出寄存器(AO)地址:40001~49999
0x代表线圈(DO)类地址,1x代表触点(DI)类地址、 3x代表输入寄存器(AI)类地址、4x代表输出寄存器(AO)类地址。
在实际编程中,前缀的区分作用(有功能码进行区分),所以只需说明后4位数,而且需转换为4位十六进制地址。
Modbus 数据地址格式是从0开始,寄存器地址对应报文中地址关系,x0001
对应00 00
,示例40003
对应 00 02
地址
以上根据开发时查的资料和网上资料整理一些的有用信息,方便开发查询
ModbusTCP协议报文解析相关推荐
- rtsp协议报文解析-首部字段解析
前言 网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离.然而,没有实际开发经验的支撑,理论又很难理解到位. 本系列文章将从流媒体协议的基础原理开始,通过抓包 ...
- 西门子PLC的S7协议报文解析说明
我们以S7的1500系列来查看握手和读取.写入[字Word或者位Bit]命令报文 以下报文不做说明时都是十六进制字节. 西门子PLC需要连接成功后发送两次握手命令方可进行读写通信. 西门子PLC的S7 ...
- ModbusTCP协议报文详细分析
ModbusTCP协议分析 ModbusTCP与ModbusUDP的报文格式是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的协议进行分析,ModbusTCP与M ...
- HTTP 协议报文解析
本篇主要是为了记录HTTP中报文的格式,以便针对报文进行解析.首先会介绍基础的HTTP报文,之后会介绍 文件上传时的数据报文格式. HTTP基础报文格式 按照HTTP报文类型进行介绍,HTTP报文类型 ...
- SL651协议报文解析(一)
相关所需功能码枚举类请看上篇文章呦~ 先上一些报文方便大家测试解析: 下方都是一些上行报文,如需下行可以私信我 测试报: 7E 7E 10 00 51 14 19 10 00 7B 2F 00 08 ...
- matlab里的xcp报文,xcp协议报文解析
AAddddiittiioonnaall ssooffttwwaarree XCP ((sseerrvviicceess)) ttoo bbee iinntteeggrraatteedd iinn t ...
- HTTP协议报文解析
HTTP(HyperText Transfer Protocol,超文本传输协议) HTTP是一个应用层协议,虽然在2015年已推出HTTP/2版本,并被主要的web浏览器和web服务器支持.但目前使 ...
- TFTP协议报文解析
IP数据报文: IP首部 + UDP报文 UDP报文: UDP首部 + TFTP数据报文 TFTP数据报文: 操作码 + 文件名 + 0 + 模式 + 0 TFTP报文: 2字节 x字节 1字节 x字 ...
- rtsp协议格式解析
前言 网上关于rtsp的文章很多,但大多是抽象的理论介绍,从理论学习到实际上手开发往往还有一段距离.然而,没有实际开发经验的支撑,理论又很难理解到位. 本系列文章将从流媒体协议的基础原理开始,通过抓包 ...
最新文章
- 网络营销外包——网站搜索框设计不同人群网络营销外包有不同设计
- Office 2016 for Mac试用之Excel篇
- java中Logger.getLogger(Test.class)
- Spring 用注解Annotation注入 abstract 抽象父类的属性
- HDU 6607 Easy Math Problem(杜教筛 + min_25 + 拉格朗日插值)
- [转载]我的PMP复习备考经验谈(下篇)——一本关于PMP备考的小指南
- java如何对List集合中的元素进行排序(请收藏)
- mysql cascade|restrict|no action|set null__mysql 外键的几种约束
- 【转载】中国煤层气资源量
- Velocity简单语法及VelocityHelper封装
- 如何提升Java应用程序性能
- 学点PYTHON基础的东东--数据结构,算法,设计模式---访问者模式
- 万分之二用百分之怎么表示_怎么腐熟猪粪做有机肥
- Anaconda下载、安装及配置教程
- 五行俱全才能成为合格的游戏系统策划!
- CYCLONEⅡ系列FPGA 总结
- 使用Java实现一个简单的贪吃蛇小游戏
- 22. 关于定时任务指定的时间间隔内没有完成任务的处理
- 吃西瓜—先磨刀之概率论
- java生成xml文件head,生成XML文件 - Glucose的个人空间 - OSCHINA - 中文开源技术交流社区...