Commit f5156dc3 authored by wanghao's avatar wanghao

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

parent 4f3434bd
......@@ -201,8 +201,9 @@ public class DeviceStatusReaderAndTimeSetter {
}
return null;
}
/**
* 启动多设备监控(核心方法
* 启动多设备监控(无反射,兼容所有版本
*/
public void startMultiDeviceMonitoring(
String ip, int port, List<Integer> deviceIds,
......@@ -221,46 +222,39 @@ public class DeviceStatusReaderAndTimeSetter {
final int devId = deviceId;
FIXED_THREAD_POOL.submit(() -> {
ModbusMaster threadMaster = null;
Socket underlyingSocket = null;
try {
// 1. 创建Modbus连接
// 1. 创建连接(每次任务独立连接,避免复用导致泄漏)
threadMaster = createModbusMaster(ip, port);
// 2. 反射获取底层Socket(修复私有字段访问问题)
underlyingSocket = getUnderlyingSocket(threadMaster);
if (threadMaster == null) {
log.error("设备{}: Modbus连接创建失败", devId);
recordAlarm("03", "ip:" + ip + ",port:" + port + ",deviceId:" + devId, "连接创建失败");
return;
}
// 3. 读取设备数据
// 2. 读取数据(带超时控制的重试)
int[] result = readWithConditionalRetry(threadMaster, ip, port, devId, stopCondition);
// 4. 回调处理结果
// 3. 处理结果
if (resultHandler != null) {
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) {
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);
} 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) {
try {
threadMaster.destroy();
log.debug("设备{}: ModbusMaster已销毁", devId);
log.debug("设备{}: Modbus连接已销毁", devId);
} catch (Exception e) {
log.error("设备{}: ModbusMaster销毁失败", devId, e);
log.error("设备{}: Modbus连接销毁失败", devId, e);
}
}
latch.countDown();
......@@ -269,11 +263,13 @@ public class DeviceStatusReaderAndTimeSetter {
});
}
// 等待所有任务完成,超时后记录告警
// 等待任务完成,超时后记录告警
try {
if (!latch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
log.warn("IP{}: 部分设备监控超时(未完成:{})", ip, latch.getCount());
recordAlarm("03", "ip:" + ip + ",port:" + port, "部分设备监控超时(未完成:" + latch.getCount() + ")");
// 超时后主动关闭所有线程池任务(避免长期阻塞)
FIXED_THREAD_POOL.shutdownNow();
}
} catch (InterruptedException e) {
log.error("IP{}: 监控任务被中断", ip, e);
......
......@@ -106,7 +106,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("月-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(m + "");
palletDeviceBinding.setRecordMonth(m + "");
}
boolean dResult = Modbus4jUtils.writeRegister(master,deviceId, 6, (short) d);
......@@ -118,7 +118,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("天-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(h + "");
palletDeviceBinding.setRecordDate(h + "");
}
boolean hResult = Modbus4jUtils.writeRegister(master,deviceId, 7, (short) h);
......@@ -130,7 +130,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("时-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
}else {
palletDeviceBinding.setRecordYear(d + "");
palletDeviceBinding.setRecordHour(d + "");
}
boolean mmResult = Modbus4jUtils.writeRegister(master,deviceId, 8, (short) mm);
......@@ -142,7 +142,7 @@ public class ModbusResultHandler implements Consumer<DeviceStatusReaderDto> {
alarmData.setfAlarmData("分-日期写入失败");
alarmDataService.insertTEquipmentAlarmData(alarmData);
} else {
palletDeviceBinding.setRecordYear(mm + "");
palletDeviceBinding.setRecordMinute(mm + "");
}
// 更新
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