modbus 报文不知道协议时怎么破译 ,有大神指点下吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了modbus 报文不知道协议时怎么破译 ,有大神指点下吗相关的知识,希望对你有一定的参考价值。

以下有几组数据对应的值
03 03 00 00 00 03 04 29 03 03 06 5E 59 42 6B 00 00 4C C2 03 03 00 02 00 01 24 28 03 03 00 00 C1 84 对应得数值是58.84
03 03 00 00 00 03 04 29 03 03 06 0A AC 42 70 00 00 BD 04 03 03 00 02 00 01 24 28 03 03 00 00 C1 84 对应得数值是60.10
03 03 00 00 00 03 04 29 03 03 06 73 23 42 70 00 00 13 72 03 03 00 02 00 01 24 28 03 03 00 00 C1 84 对应得数值是60.11

参考技术A

以第一组报文解析为例:

主站询问:03(3号站) 03(读保持型寄存器) 00 00(地址从0000开始) 00 03(连续3个字) 04 29(CRC校验)

从站回答:03 (3号站)03 (读保持型寄存器响应)06(6个字节数据) 5E 59 (第一个字)42 6B(第2个字) 00 00 (第3个字) 4C C2(CRC校验)

其中 5E 59 42 6B 交换高低字后为42 6B 5E 59, 随便找个浮点数转换工具,可得

追问

非常感谢,今天刚解出来!

本回答被提问者采纳

浅谈-对modbus的理解

浅谈-对modbus的理解

 

一、简介

  Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。

  Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

  标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

 

二、报文

  先来简单分析一条MODBUS报文,例如:01  06  00 01  00 17  98 04
      01             06            00 01           00 17          98 04
    从机地址    功能码        数据地址       数据         CRC校验

  这一串数据的意思是:把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址。

  一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。

 

三、从机地址

  Modbus串行链路协议是一个主-从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点连接于同一个串行总线。Modbus通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。

 

四、功能码

  一下是modbus所有功能码作用说明:

  功能码          作用  

  01     读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)  

  02     读取输入状态 取得一组开关输入的当前状态(ON/OFF)  

  03     读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值  

  04     读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值  

  05     强置单线圈 强置一个逻辑线圈的通断状态  

  06     预置单寄存器 把具体二进值装入一个保持寄存器  

  07     读取异常状态 取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态  

  08     回送诊断校验 把诊断校验报文送从机,以对通信处理进行评鉴  

  09     编程(只用于484) 使主机模拟编程器作用,修改PC从机逻辑  

  10    控询(只用于484) 可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送  

  11     读取事件计数 可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时  

  12     读取通信事件记录 可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误  

  13     编程(184/384 484 584) 可使主机模拟编程器功能修改PC从机逻辑  

  14     探询(184/384 484 584) 可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送  

  15     强置多线圈 强置一串连续逻辑线圈的通断  

  16     预置多寄存器 把具体的二进制值装入一串连续的保持寄存器  

  17     报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态  

  18     (884和MICRO 84) 可使主机模拟编程功能,修改PC状态逻辑  

  19     重置通信链路 发生非可修改错误后,是从机复位于已知状态,可重置顺序字节  

  20     读取通用参数(584L) 显示扩展存储器文件中的数据信息  

  21     写入通用参数(584L) 把通用参数写入扩展存储文件,或修改之  

  22~64   保留作扩展功能备用

  65~72   保留以备用户功能所用 留作用户功能的扩展编码  

  73~119    非法功能

  120~127  保留 留作内部作用  

  128~255     保留 用于异常应答

  ModBus功能码与数据类型对应表 

  代码功能  数据类型 

  01      读位 

  02      读位 

  03      读整型、字符型、状态字、浮点型 

  04      读整型、状态字、浮点型 

  05      写位 

  06      写整型、字符型、状态字、浮点型 

  08      N/A重复“回路反馈”信息 

  15      写位 

  16      写整型、字符型、状态字、浮点型 

 

五、CRC校验

  例如:上面的  98 04  是它前面的数据(01 06 00 01 00 17)通过一算法(具体算法请查阅其他资料)计算出来的结果,其实就像是计算累加和那样。(累加和:就是010600010017加起来的值,然后它的算法就是加法)。
  作用:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。比如主机发出01 06 00 01 00 17 98 04,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计             算的)相等,如果不相等那么说明数据传输有错误这些数据不能要。

  记住一句话:从机接收到数据后,将这串byte[]类型数据去做CRC校验,如果计算结果最后两位与接受到的byte[]最后两位一样,既为校验成功。

 

六、数据地址

  数据地址也可以理解为:查询的第几路模拟量寄存器地址,例如第一路地址用00 00 表示,第二路地址用00 01

  该数据地址有规律可循,采用递增的方式,不保证所有厂商采集器均采用该规则,具体要看拿到的采集器说明文档。

 

七、数据

  理解为发送的数据或者接收的传感器的数据,更多取决于采集器,有的采集器接收到的数据为16进制电流值,有的采集器接收到的非电流值而是物理数据(采集器已经帮你转换了),具体转换比较复杂涉及到电流、量程、量程校正等。

  so采集器相关文档一定要看。

 

八、modbus报文模型

  技术图片

 

 

九、心得

  网上关于modbus的资料说多不多,说少不少,java的相对较少,我当时找到几篇文章一顿乱看,结果一看是单片机的。

  很多成分取决于采集器(也有说采集仪的)就是连接传感器的设备,采集器可以做的工作很多比如说转换数据、计算数据等一定要看厂家采集器的文档。

  modbus其实没你想的那么难,关于线圈操作、设备开关操作暂时还没有接触到,后边接触到了会完善相关资料。

  本文借鉴相关资料整理+自己实际开发的心得,如果对你有帮助,点赞哦。

  附开发成果图一张:

  技术图片

 

 

本文借鉴相关资料如下:

http://blog.sina.com.cn/s/blog_65ba9a5e0101df1g.html

https://www.cnblogs.com/ioufev/p/10831289.html

 

 

 

 

技术图片

以上是关于modbus 报文不知道协议时怎么破译 ,有大神指点下吗的主要内容,如果未能解决你的问题,请参考以下文章

modbus TCP通讯,返回数据总说总长错误,哪位大神知道该返回啥才对啊?

modbus tcp报文如何监听

Modbus的报文格式

Modbus TCP协议使用说明

Modbus TCP协议使用说明

modbus协议与tcp协议有啥关系?