Commit f5156dc3 authored by wanghao's avatar wanghao

1 测试 上电后通信 和 最终完成 定时任务功能

parent 4f3434bd
...@@ -201,8 +201,9 @@ public class DeviceStatusReaderAndTimeSetter { ...@@ -201,8 +201,9 @@ public class DeviceStatusReaderAndTimeSetter {
} }
return null; return null;
} }
/** /**
* 启动多设备监控(核心方法 * 启动多设备监控(无反射,兼容所有版本
*/ */
public void startMultiDeviceMonitoring( public void startMultiDeviceMonitoring(
String ip, int port, List<Integer> deviceIds, String ip, int port, List<Integer> deviceIds,
...@@ -221,46 +222,39 @@ public class DeviceStatusReaderAndTimeSetter { ...@@ -221,46 +222,39 @@ public class DeviceStatusReaderAndTimeSetter {
final int devId = deviceId; final int devId = deviceId;
FIXED_THREAD_POOL.submit(() -> { FIXED_THREAD_POOL.submit(() -> {
ModbusMaster threadMaster = null; ModbusMaster threadMaster = null;
Socket underlyingSocket = null;
try { try {
// 1. 创建Modbus连接 // 1. 创建连接(每次任务独立连接,避免复用导致泄漏)
threadMaster = createModbusMaster(ip, port); threadMaster = createModbusMaster(ip, port);
// 2. 反射获取底层Socket(修复私有字段访问问题) if (threadMaster == null) {
underlyingSocket = getUnderlyingSocket(threadMaster); log.error("设备{}: Modbus连接创建失败", devId);
recordAlarm("03", "ip:" + ip + ",port:" + port + ",deviceId:" + devId, "连接创建失败");
return;
}
// 3. 读取设备数据 // 2. 读取数据(带超时控制的重试)
int[] result = readWithConditionalRetry(threadMaster, ip, port, devId, stopCondition); int[] result = readWithConditionalRetry(threadMaster, ip, port, devId, stopCondition);
// 4. 回调处理结果 // 3. 处理结果
if (resultHandler != null) { if (resultHandler != null) {
resultHandler.accept(new DeviceStatusReaderDto(ip, port, devId, result)); resultHandler.accept(new DeviceStatusReaderDto(ip, port, devId, result));
} }
} catch (ModbusInitException e) {
log.error("设备{}: Modbus连接初始化失败", devId, e);
recordAlarm("03", "ip:" + ip + ",port:" + port + ",deviceId:" + devId, "连接初始化失败:" + e.getMessage());
} catch (Throwable e) { } catch (Throwable e) {
log.error("设备{}: 监控任务异常", devId, e); log.error("设备{}: 监控任务异常", devId, e);
String alarmMsg = e instanceof OutOfMemoryError ? "内存溢出:" + e.getMessage() : "监控任务异常:" + e.getMessage(); String alarmMsg = "监控任务异常:" + e.getMessage();
recordAlarm("03", "ip:" + ip + ",port:" + port + ",deviceId:" + devId, alarmMsg); recordAlarm("03", "ip:" + ip + ",port:" + port + ",deviceId:" + devId, alarmMsg);
} finally { } finally {
// 5. 优先关闭Socket,再销毁ModbusMaster(彻底释放资源) // 关键:优先销毁连接,确保资源释放(兼容所有版本)
if (underlyingSocket != null) {
try {
if (!underlyingSocket.isClosed()) {
underlyingSocket.close();
log.debug("设备{}: 底层Socket已关闭", devId);
}
} catch (Exception e) {
log.error("设备{}: Socket关闭失败", devId, e);
}
}
// 6. 销毁ModbusMaster
if (threadMaster != null) { if (threadMaster != null) {
try { try {
threadMaster.destroy(); threadMaster.destroy();
log.debug("设备{}: ModbusMaster已销毁", devId); log.debug("设备{}: Modbus连接已销毁", devId);
} catch (Exception e) { } catch (Exception e) {
log.error("设备{}: ModbusMaster销毁失败", devId, e); log.error("设备{}: Modbus连接销毁失败", devId, e);
} }
} }
latch.countDown(); latch.countDown();
...@@ -269,11 +263,13 @@ public class DeviceStatusReaderAndTimeSetter { ...@@ -269,11 +263,13 @@ public class DeviceStatusReaderAndTimeSetter {
}); });
} }
// 等待所有任务完成,超时后记录告警 // 等待任务完成,超时后记录告警
try { try {
if (!latch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)) { if (!latch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
log.warn("IP{}: 部分设备监控超时(未完成:{})", ip, latch.getCount()); log.warn("IP{}: 部分设备监控超时(未完成:{})", ip, latch.getCount());
recordAlarm("03", "ip:" + ip + ",port:" + port, "部分设备监控超时(未完成:" + latch.getCount() + ")"); recordAlarm("03", "ip:" + ip + ",port:" + port, "部分设备监控超时(未完成:" + latch.getCount() + ")");
// 超时后主动关闭所有线程池任务(避免长期阻塞)
FIXED_THREAD_POOL.shutdownNow();
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
log.error("IP{}: 监控任务被中断", ip, e); log.error("IP{}: 监控任务被中断", ip, e);
......
...@@ -106,7 +106,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> { ...@@ -106,7 +106,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("月-日期写入失败"); alarmData.setfAlarmData("月-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData); alarmDataService.insertTEquipmentAlarmData(alarmData);
}else { }else {
palletDeviceBinding.setRecordYear(m + ""); palletDeviceBinding.setRecordMonth(m + "");
} }
boolean dResult = Modbus4jUtils.writeRegister(master,deviceId, 6, (short) d); boolean dResult = Modbus4jUtils.writeRegister(master,deviceId, 6, (short) d);
...@@ -118,7 +118,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> { ...@@ -118,7 +118,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("天-日期写入失败"); alarmData.setfAlarmData("天-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData); alarmDataService.insertTEquipmentAlarmData(alarmData);
}else { }else {
palletDeviceBinding.setRecordYear(h + ""); palletDeviceBinding.setRecordDate(h + "");
} }
boolean hResult = Modbus4jUtils.writeRegister(master,deviceId, 7, (short) h); boolean hResult = Modbus4jUtils.writeRegister(master,deviceId, 7, (short) h);
...@@ -130,7 +130,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> { ...@@ -130,7 +130,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("时-日期写入失败"); alarmData.setfAlarmData("时-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData); alarmDataService.insertTEquipmentAlarmData(alarmData);
}else { }else {
palletDeviceBinding.setRecordYear(d + ""); palletDeviceBinding.setRecordHour(d + "");
} }
boolean mmResult = Modbus4jUtils.writeRegister(master,deviceId, 8, (short) mm); boolean mmResult = Modbus4jUtils.writeRegister(master,deviceId, 8, (short) mm);
...@@ -142,7 +142,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> { ...@@ -142,7 +142,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("分-日期写入失败"); alarmData.setfAlarmData("分-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData); alarmDataService.insertTEquipmentAlarmData(alarmData);
} else { } else {
palletDeviceBinding.setRecordYear(mm + ""); palletDeviceBinding.setRecordMinute(mm + "");
} }
// 更新 // 更新
palletDeviceBindingMapper.updatePalletDeviceBinding(palletDeviceBinding); palletDeviceBindingMapper.updatePalletDeviceBinding(palletDeviceBinding);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment