springboot中使用modbus4j
阅读数:6 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
在Spring Boot项目中集成Modbus4J库进行Modbus通信。
可以使用spring的@Async注解实现异步通信,避免阻塞主线程。
二、添加依赖
Modbus4J可能未在Maven中央仓库直接提供,需手动安装或使用第三方仓库(如JitPack)。以下是两种常见方式:
1、手动安装jar到本地仓库
(1)下载Modbus4j的jar包
(2)执行maven安装命令
mvn install:install-file -Dfile=modbus4j-3.0.3.jar -DgroupId=com.github.steveohara -DartifactId=modbus4j -Dversion=3.0.3 -Dpackaging=jar
(3)在pom.xml中添加依赖
<dependency>
<groupId>com.github.steveohara</groupId>
<artifactId>modbus4j</artifactId>
<version>3.0.3</version>
</dependency>
2、使用jitpack仓库
(1)在pom.xml中添加jitpack仓库
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
(2)添加依赖
<dependency>
<groupId>com.github.steveohara</groupId>
<artifactId>modbus4j</artifactId>
<version>3.0.3</version>
</dependency>
三、配置modbus通信参数
根据协议类型(TCP或串口)配置连接参数:
1、TCP连接示例
@Configuration
public class ModbusConfig {
@Bean
public ModbusFactory modbusFactory() {
return new ModbusFactory();
}
@Bean
public ModbusMaster tcpMaster(ModbusFactory modbusFactory) {
// 配置TCP参数
IpParameters params = new IpParameters();
params.setHost("192.168.1.100"); // Modbus从机IP
params.setPort(502); // Modbus端口
// 创建TCP Master(true表示保持长连接)
return modbusFactory.createTcpMaster(params, true);
}
}
2、串口连接示例
@Bean
public ModbusMaster serialMaster(ModbusFactory modbusFactory) {
// 配置串口参数
SerialParameters params = new SerialParameters();
params.setCommPortId("COM3"); // 串口号(如COM3、/dev/ttyUSB0)
params.setBaudRate(9600); // 波特率
params.setDataBits(8); // 数据位
params.setStopBits(1); // 停止位
params.setParity(0); // 校验位(0-None, 1-Odd, 2-Even)
// 创建串口Master
return modbusFactory.createRtuMaster(params);
}
3、tcp/ip和rtu over tcp/ip
IpParameters params = new IpParameters();
params.setHost("192.168.1.100"); // Modbus从机IP
params.setPort(502); // Modbus端口
params.setEncapsulated(false); // false时是modbus tcp/ip协议帧,true时为modbus rtu over tcp/ip协议帧
四、实现modbus读写逻辑
1、读取保持寄存器(功能码0x03)
@Service
public class ModbusService {
@Autowired
private ModbusMaster modbusMaster;
public int[] readHoldingRegisters(int slaveId, int startOffset, int quantity) throws ModbusTransportException {
try {
modbusMaster.init(); // 初始化连接
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
slaveId, // 从机地址
startOffset, // 寄存器起始地址
quantity // 读取数量
);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) modbusMaster.send(request);
return response.getShortData(); // 返回寄存器值(int数组)
} finally {
modbusMaster.destroy(); // 关闭连接(长连接模式下可忽略)
}
}
}
2、写入单个寄存器(功能码0x06)
public void writeSingleRegister(int slaveId, int offset, int value) throws ModbusTransportException {
try {
modbusMaster.init();
WriteRegisterRequest request = new WriteRegisterRequest(
slaveId, // 从机地址
offset, // 寄存器地址
value // 写入的值(0~65535)
);
modbusMaster.send(request);
} finally {
modbusMaster.destroy();
}
}
五、异常处理与重试机制
Modbus通信易受网络波动影响,需添加异常处理和重试逻辑:
public int[] readRegistersWithRetry(int slaveId, int start, int count, int maxRetries) {
int retries = 0;
while (retries < maxRetries) {
try {
return readHoldingRegisters(slaveId, start, count);
} catch (ModbusTransportException | ErrorResponseException e) {
retries++;
if (retries >= maxRetries) {
throw new RuntimeException("Modbus通信失败: " + e.getMessage());
}
}
}
return new int[0];
}