修改modbus读取设备数据连接池配置

This commit is contained in:
zq
2026-01-20 10:54:14 +08:00
parent dd0132ab2f
commit 8716d43879
4 changed files with 71 additions and 33 deletions

View File

@ -26,9 +26,14 @@ public class Modbus4jConnectionManager {
GenericObjectPool<ModbusMaster> pool = connectionPools.computeIfAbsent(poolKey, key -> {
PooledModbusMasterFactory factory = new PooledModbusMasterFactory(config.getHost(), config.getPort());
GenericObjectPoolConfig<ModbusMaster> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(5); // 池中最大连接数
poolConfig.setMinIdle(1); // 最小空闲连接数
poolConfig.setMaxTotal(20); // 池中最大连接数
poolConfig.setMinIdle(4); // 最小空闲连接数
poolConfig.setTestOnBorrow(true); // 借用时测试连接有效性
poolConfig.setTestOnReturn(true); // 归还时测试连接有效性
poolConfig.setTestWhileIdle(true); // 空闲时测试连接有效性
poolConfig.setMaxWaitMillis(3000); // 获取连接的最大等待时间3秒
poolConfig.setTimeBetweenEvictionRunsMillis(30000); // 30秒检查一次空闲连接
poolConfig.setMinEvictableIdleTimeMillis(60000); // 空闲超过60秒的连接可以被驱逐
return new GenericObjectPool<>(factory, poolConfig);
});

View File

@ -43,6 +43,8 @@ import static com.xzzn.common.enums.RegisterType.DISCRETE_INPUT;
public class ModbusProcessor {
private static final Logger logger = LoggerFactory.getLogger(ModbusProcessor.class);
private int readTimeout = 5000;
private int writeTimeout = 3000;
@Autowired
private RedisCache redisCache;
@ -55,8 +57,8 @@ public class ModbusProcessor {
boolean result;
try {
master = connectionManager.borrowMaster(config);
// 设置了Modbus通信的超时时间为1000毫秒1秒)。当主设备与从设备通信时,若在1秒内未收到响应,则认为通信超时并抛出异常。这有助于避免长时间等待无响应的设备。
master.setTimeout(1000);
// 设置了Modbus通信的超时时间为3000毫秒3秒)。当主设备与从设备通信时,若在3秒内未收到响应,则认为通信超时并抛出异常。这有助于避免长时间等待无响应的设备。
master.setTimeout(writeTimeout);
result = writeTagValue(master, config, config.getWriteTags());
} catch (Exception e) {
logger.error("Failed to borrow connection or write to devices '{}'", config.getDeviceName(), e);
@ -78,7 +80,7 @@ public class ModbusProcessor {
try {
master = connectionManager.borrowMaster(config);
master.setTimeout(1000); // 设置超时时间
master.setTimeout(writeTimeout); // 设置超时时间
// 使用重试装饰器
ModbusMaster finalMaster = master;
@ -221,7 +223,7 @@ public class ModbusProcessor {
public ModbusMaster borrowMaster(DeviceConfig config) throws Exception {
ModbusMaster master = connectionManager.borrowMaster(config);
// 设置了Modbus通信的超时时间为5000毫秒5秒。当主设备与从设备通信时若在5秒内未收到响应则认为通信超时并抛出异常。这有助于避免长时间等待无响应的设备。
master.setTimeout(5000);
master.setTimeout(readTimeout);
return master;
}