理解 Modbus TCP 报文格式,Modbus TCP 报文格式如下:
| Transaction ID (2 bytes) | Protocol ID (2 bytes) | Length (2 bytes) | Unit ID (1 byte) | Function Code (1 byte) | Data (N bytes) |
- Transaction ID:标识事务的唯一标识符,确保正确的 Transaction ID:每个请求的 Transaction ID 都应该唯一,以便服务器能够正确区分不同的事务(2位,00 00为2位)
- Protocol ID:总是 0x0000(Modbus Protocol)(2位,00 00为2位)
- Length:后续数据的长度(功能码 + 数据)(2位,00 00为2位)
- Unit ID:从站地址(也叫单元标识符)(1位,00 为位)
- Function Code:操作码(功能码)(1位,00 为位)
- Data:具体的数据内容(如寄存器地址、寄存器数量等)(N位)
yml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>modbusRTU</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>modbusRTU</name>
<description>modbusRTU</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.intelligt.modbus</groupId>
<artifactId>jlibmodbus</artifactId>
<version>1.2.9.9</version>
</dependency>
<dependency>
<groupId>org.scream3r</groupId>
<artifactId>jssc</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
使用高级协议库(如 Modbus 库)测试的java代码modbusRTU
package com.example.modbusrtu.config;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.serial.SerialParameters;
import com.intelligt.modbus.jlibmodbus.serial.SerialPort;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
@Service
public class ModbusService {
@SneakyThrows
public static void main(String[] args) {
SerialParameters serialParameters = new SerialParameters();
serialParameters.setDevice("COM3");
serialParameters.setBaudRate(SerialPort.BaudRate.BAUD_RATE_9600);
serialParameters.setDataBits(8);
serialParameters.setStopBits(1);
serialParameters.setParity(SerialPort.Parity.NONE);
ModbusMaster master = null;
try {
master = ModbusMasterFactory.createModbusMasterRTU(serialParameters);
master.connect();
int slaveId = 1;
int startAddress = 1;