【在Spring Boot项目中接入Modbus协议】
【在Spring Boot项目中接入Modbus协议】
在Spring Boot项目中接入Modbus协议,可以通过使用第三方库(如jamod
或modbus4j
)来实现。以下是一个基本的步骤指南,帮助你在Spring Boot项目中集成Modbus。
1. 添加依赖
首先,在pom.xml
文件中添加Modbus相关的依赖。推荐使用jamod
或modbus4j
。
使用 jamod
<dependency>
<groupId>com.infiniteautomation</groupId>
<artifactId>jamod</artifactId>
<version>1.2</version>
</dependency>
使用 modbus4j
<dependency>
<groupId>org.modbus4j</groupId>
<artifactId>modbus4j</artifactId>
<version>2.0.0</version>
</dependency>
2. 配置Modbus连接
根据你的需求选择TCP或RTU模式进行配置。
Modbus TCP 示例
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
public class ModbusTcpService {
private ModbusMaster tcpMaster;
public void init(String ipAddress, int port) throws ModbusInitException {
ModbusFactory modbusFactory = new ModbusFactory();
tcpMaster = modbusFactory.createTcpMaster(ipAddress + ":" + port, false);
tcpMaster.setTimeout(3000); // 设置超时时间
tcpMaster.setRetries(3); // 设置重试次数
tcpMaster.init(); // 初始化连接
}
public void readHoldingRegisters(int slaveId, int startRegister, int numRegisters) throws ModbusTransportException {
var response = tcpMaster.sendRequest(modbusFactory.createReadHoldingRegistersRequest(slaveId, startRegister, numRegisters), slaveId);
System.out.println("Response: " + Arrays.toString(response.getShortData()));
}
public void close() {
if (tcpMaster != null) {
tcpMaster.destroy();
}
}
}
Modbus RTU 示例
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.serial.SerialPortFactory;
import com.serotonin.modbus4j.exception.ModbusTransportException;
public class ModbusRtuService {
private ModbusMaster rtuMaster;
public void init(String portName, int baudRate, int dataBits, int stopBits, char parity) throws ModbusInitException {
ModbusFactory modbusFactory = new ModbusFactory();
rtuMaster = modbusFactory.createRtuMaster(SerialPortFactory.createSerialPort(portName, baudRate, dataBits, stopBits, parity));
rtuMaster.setTimeout(3000); // 设置超时时间
rtuMaster.setRetries(3); // 设置重试次数
rtuMaster.init(); // 初始化连接
}
public void readHoldingRegisters(int slaveId, int startRegister, int numRegisters) throws ModbusTransportException {
var response = rtuMaster.sendRequest(modbusFactory.createReadHoldingRegistersRequest(slaveId, startRegister, numRegisters), slaveId);
System.out.println("Response: " + Arrays.toString(response.getShortData()));
}
public void close() {
if (rtuMaster != null) {
rtuMaster.destroy();
}
}
}
3. 集成到Spring Boot
将上述服务类集成到Spring Boot中,并通过Spring管理其生命周期。
创建Spring Bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ModbusConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public ModbusTcpService modbusTcpService() throws Exception {
ModbusTcpService service = new ModbusTcpService();
service.init("192.168.1.100", 502); // 替换为实际的IP和端口
return service;
}
}
在Controller中使用
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ModbusController {
private final ModbusTcpService modbusTcpService;
public ModbusController(ModbusTcpService modbusTcpService) {
this.modbusTcpService = modbusTcpService;
}
@GetMapping("/read-registers")
public String readRegisters() {
try {
modbusTcpService.readHoldingRegisters(1, 0, 10); // 读取从机ID为1,起始寄存器为0,数量为10
return "Success";
} catch (Exception e) {
return "Error: " + e.getMessage();
}
}
}
4. 测试与调试
- 启动Spring Boot应用。
- 使用Postman或其他工具访问
/read-registers
接口,验证是否能够正确读取Modbus设备的数据。 - 如果遇到问题,检查网络连接、串口权限、设备地址等配置。
注意事项
- 异常处理:确保对Modbus通信中的异常进行捕获和处理。
- 线程安全:如果多个线程同时访问Modbus设备,需确保线程安全。
- 性能优化:对于高频读写场景,可以考虑使用缓存或批量操作减少通信开销。
- 日志记录:建议为Modbus通信添加详细的日志记录,便于排查问题。