# Modbus_RTU_TCP_IP **Repository Path**: tonymdx/Modbus_RTU_TCP_IP ## Basic Information - **Project Name**: Modbus_RTU_TCP_IP - **Description**: JAVA实现Modbus RTU或Modbus TCP/IP案例 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 15 - **Created**: 2024-08-19 - **Last Updated**: 2024-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Modbus RTU或Modbus TCP/IP ### 采集PLC数据 通过modbus rtu 协议去采集数据 ### 框架类型 * [SpringBoot](https://spring.io/projects/spring-boot/) * [t-io](https://www.tiocloud.com/index.html) ### 报文介绍 ##### 一,Modbus RTU报文介绍 发送的报文:01 03 00 00 00 02 C4 0B 1.功能码:01 03 2.起始地址:00 00 3.读取数据的个数:00 02 4.CRC:C4 0B(调试期间可以去第三方下载工具) 返回的数据:01 03 04 00 07 00 07 0a 30 1.功能码:01 03 2.返回的数据个数:04 3.十六进制数据:00 07 00 07 4.CRC:0a 30(通过 TO_CRC 方法去效验) ##### 二,Modbus TCP/IP报文介绍 发送的报文:00 0A 00 00 00 06 01 03 00 00 00 64 1.头字节00 0A 00 00 00 06:头字节共6个字节,前两个字节00 0A是校验(自定义),PC发给触摸屏后, 触摸屏会返回一样的00 0A以保证数据的对应性,比如说PC发给A触摸屏的头字节是00 0A,又发给B触摸屏00 0B, 然后收到数据返回,这时候,我们通过判断接收到的数据的头字节是00 0A还是00 0B就可以知道这数据是哪个触 摸屏返回的,仅此而已。中间的00 00两个字节表示是基于TCP/IP协议的modbus协议,对于我们项目无需修改。 后面的00 06两个字节表示头字节后面还有多少个字节的数据,收发双方要收到该数量的字节才算接收完成, 比如例子是00 06代表后面还有6个字节的数据,既是01 03 00 00 00 64 2.功能码01 03, 01是触摸屏那边的地址(触摸屏设置),默认01(根据实际设备修改,一般都是01) 03为功能码,Modbus协议有几种功能码,对于我们项目,用到的是 功能码01读线圈,PLC的输出点,开关量 功能码02读离散输入,指的是PLC的输入点,开关量 功能码03读保持寄存器,该项目用最多,一个寄存器地址一个字节数据 功能码10(16进制)写多个保持寄存器 3.数据内容 00 00 00 64主要分为两个部分,前面00 00为读取数据的起始地址,后面00 64为要读取多少个数据。 返回的数据:00 01 00 00 00 04 01 01 01 01 头字节为00 01对应PC端,00 04代表后面有四个字节的数据,前面01 01对应01地址,01功能码的返回, 后面01 01是线圈的状态,01是数据长度,后面01是开关量状态