Commit 67083676 authored by wanghao's avatar wanghao

1 换了新程序后 写时间 失效问题调整

parent 01ddfb3c
package com.zehong.system.domain.vo;
/**
* @author lenovo
* @date 2025/12/26
* @description 给板子写时间的的vo
*/
public class WriteCurrentTimeVo {
private int year;
private int month;
private int day;
private int hour;
private int minute;
public WriteCurrentTimeVo() {
}
public WriteCurrentTimeVo(int year, int month, int day, int hour, int minute) {
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public int getMinute() {
return minute;
}
public void setMinute(int minute) {
this.minute = minute;
}
}
...@@ -12,6 +12,7 @@ import com.serotonin.modbus4j.ip.IpParameters; ...@@ -12,6 +12,7 @@ import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.ip.tcp.TcpMaster; import com.serotonin.modbus4j.ip.tcp.TcpMaster;
import com.serotonin.modbus4j.locator.BaseLocator; import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.*; import com.serotonin.modbus4j.msg.*;
import com.zehong.system.domain.vo.WriteCurrentTimeVo;
import com.zehong.system.modbus.handler.ModbusResultHandler; import com.zehong.system.modbus.handler.ModbusResultHandler;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -955,7 +956,7 @@ public class Modbus4jUtils { ...@@ -955,7 +956,7 @@ public class Modbus4jUtils {
// 读取 第1个 pcba 板子的数据 // 读取 第1个 pcba 板子的数据
modbusMaster = createModbusMaster("192.168.2.1", 501); modbusMaster = createModbusMaster("192.168.2.1", 501);
// writeCurrentTimeUseWriteRegisters(modbusMaster, 1); // writeCurrentTimeUseWriteRegisters(modbusMaster, 1);
writeCurrentTimeToDeviceEnhanced(modbusMaster,1); // writeCurrentTimeToDeviceEnhanced(modbusMaster,1);
// writeTimeRegisters(modbusMaster, 1); // writeTimeRegisters(modbusMaster, 1);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
...@@ -1114,14 +1115,14 @@ public class Modbus4jUtils { ...@@ -1114,14 +1115,14 @@ public class Modbus4jUtils {
/** /**
* 增强版:写入并实时验证每个字段 * 增强版:写入并实时验证每个字段
*/ */
public static void writeCurrentTimeToDeviceEnhanced(ModbusMaster master, int deviceId) { public static boolean writeCurrentTimeToDeviceEnhanced(ModbusMaster master, int deviceId, WriteCurrentTimeVo writeCurrentTimeVo) {
try { try {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR); int year = writeCurrentTimeVo.getYear();
int month = cal.get(Calendar.MONTH) + 1; int month = writeCurrentTimeVo.getMonth();
int day = cal.get(Calendar.DATE); int day = writeCurrentTimeVo.getDay();
int hour = cal.get(Calendar.HOUR_OF_DAY); int hour = writeCurrentTimeVo.getHour();
int minute = cal.get(Calendar.MINUTE); int minute = writeCurrentTimeVo.getMinute();
log.info("开始设置设备{}时间: {}-{}-{} {}:{}", log.info("开始设置设备{}时间: {}-{}-{} {}:{}",
deviceId, year, month, day, hour, minute); deviceId, year, month, day, hour, minute);
...@@ -1131,22 +1132,22 @@ public class Modbus4jUtils { ...@@ -1131,22 +1132,22 @@ public class Modbus4jUtils {
// 写入并验证年份 // 写入并验证年份
allSuccess &= writeAndVerifyField(master, deviceId, 4, (short) year, "年份", year); allSuccess &= writeAndVerifyField(master, deviceId, 4, (short) year, "年份", year);
Thread.sleep(200); Thread.sleep(500);
// 写入并验证月份 // 写入并验证月份
allSuccess &= writeAndVerifyField(master, deviceId, 5, (short) month, "月份", month); allSuccess &= writeAndVerifyField(master, deviceId, 5, (short) month, "月份", month);
Thread.sleep(200); Thread.sleep(500);
allSuccess &= writeAndVerifyField(master, deviceId, 6, (short) day, "日期", day); allSuccess &= writeAndVerifyField(master, deviceId, 6, (short) day, "日期", day);
Thread.sleep(200); Thread.sleep(500);
// 写入并验证小时 // 写入并验证小时
allSuccess &= writeAndVerifyField(master, deviceId, 7, (short) hour, "小时", hour); allSuccess &= writeAndVerifyField(master, deviceId, 7, (short) hour, "小时", hour);
Thread.sleep(200); Thread.sleep(500);
// 写入并验证分钟 // 写入并验证分钟
allSuccess &= writeAndVerifyField(master, deviceId, 8, (short) minute, "分钟", minute); allSuccess &= writeAndVerifyField(master, deviceId, 8, (short) minute, "分钟", minute);
Thread.sleep(200); Thread.sleep(500);
if (allSuccess) { if (allSuccess) {
// 最终整体验证 // 最终整体验证
...@@ -1155,54 +1156,78 @@ public class Modbus4jUtils { ...@@ -1155,54 +1156,78 @@ public class Modbus4jUtils {
if (verifyTimeRegisters(ints, year, month, day, hour, minute)) { if (verifyTimeRegisters(ints, year, month, day, hour, minute)) {
log.info("设备{}时间设置全部完成且验证通过", deviceId); log.info("设备{}时间设置全部完成且验证通过", deviceId);
return true;
} else { } else {
log.warn("设备{}时间设置完成,但最终验证失败", deviceId); log.warn("设备{}时间设置完成,但最终验证失败", deviceId);
return false;
} }
} else { } else {
log.error("设备{}时间设置过程中出现失败", deviceId); log.error("设备{}时间设置过程中出现失败", deviceId);
return false;
} }
} catch (Exception e) { } catch (Exception e) {
log.error("设备{}时间写入异常", deviceId, e); log.error("设备{}时间写入异常", deviceId, e);
return false;
} }
} }
/** /**
* 写入并验证单个字段 * 写入并验证单个字段(带重试机制)
*/ */
private static boolean writeAndVerifyField(ModbusMaster master, int deviceId, private static boolean writeAndVerifyField(ModbusMaster master, int deviceId,
int address, short value, int address, short value,
String fieldName, int expectedValue) { String fieldName, int expectedValue) {
// 最大重试次数
int maxRetry = 3;
// 进行最多3次尝试
for (int retry = 1; retry <= maxRetry; retry++) {
try { try {
log.info("开始写入{}: {} (地址={})", fieldName, expectedValue, address); log.info("第{}次尝试写入{}: {} (地址={})",
retry, fieldName, expectedValue, address);
// 写入 // 1. 写入操作
boolean success = Modbus4jUtils.writeRegister(master, deviceId, address, value); boolean writeSuccess = Modbus4jUtils.writeRegister(master, deviceId, address, value);
if (!success) { if (!writeSuccess) {
log.error("写入{}失败", fieldName); log.warn("第{}次写入{}失败", retry, fieldName);
return false; continue; // 继续下一次重试
} }
// 等待设备处理 // 2. 等待设备处理(保持原有逻辑)
Thread.sleep(100); Thread.sleep(2000);
// 读取验证 // 3. 读取验证
int[] ints = readDeviceRegisters(master, deviceId); int[] ints = readDeviceRegisters(master, deviceId);
if (ints.length > address && ints[address] == expectedValue) { if (ints.length > address && ints[address] == expectedValue) {
log.info("{}验证通过,写入值: {}", fieldName, expectedValue); log.info("{}验证通过,写入值: {}", fieldName, expectedValue);
return true; return true; // 成功,直接返回
} else { } else {
log.warn("{}验证失败,期望: {},实际: {}", int actualValue = ints.length > address ? ints[address] : -1;
fieldName, expectedValue, log.warn("第{}次{}验证失败,期望: {},实际: {}",
ints.length > address ? ints[address] : "N/A"); retry, fieldName, expectedValue, actualValue);
return false; // 验证失败,继续下一次重试
} }
} catch (Exception e) { } catch (Exception e) {
log.error("写入{}时发生异常", fieldName, e); log.error("第{}次写入{}时发生异常", retry, fieldName, e);
return false;
} }
// 如果不是最后一次重试,可以稍作等待再尝试(可选)
if (retry < maxRetry) {
try {
Thread.sleep(500); // 重试间隔
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
// 所有重试都失败了
log.error("{}写入失败,已达到最大重试次数{}", fieldName, maxRetry);
return false;
} }
/** /**
......
package com.zehong.system.modbus.util;
import com.zehong.system.domain.vo.WriteCurrentTimeVo;
import java.util.Calendar;
/**
* @author lenovo
* @date 2025/12/26
* @description 日期对象生成类
*/
public class WriteCurrentTimeUtil {
public static WriteCurrentTimeVo generateWriteCurrentTimeVo(){
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DATE);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
WriteCurrentTimeVo writeCurrentTimeVo = new WriteCurrentTimeVo();
writeCurrentTimeVo.setYear(year);
writeCurrentTimeVo.setMonth(month);
writeCurrentTimeVo.setDay(day);
writeCurrentTimeVo.setHour(hour);
writeCurrentTimeVo.setMinute(minute);
return writeCurrentTimeVo;
}
}
package com.zehong.system.task; package com.zehong.system.task;
import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.ModbusMaster;
import com.sun.org.apache.xpath.internal.operations.Mod;
import com.zehong.system.domain.PalletDeviceBinding; import com.zehong.system.domain.PalletDeviceBinding;
import com.zehong.system.domain.TEquipmentAlarmData; import com.zehong.system.domain.TEquipmentAlarmData;
import com.zehong.system.domain.TStoreyInfo; import com.zehong.system.domain.TStoreyInfo;
import com.zehong.system.domain.vo.WriteCurrentTimeVo;
import com.zehong.system.mapper.PalletDeviceBindingMapper; import com.zehong.system.mapper.PalletDeviceBindingMapper;
import com.zehong.system.mapper.TStoreyInfoMapper; import com.zehong.system.mapper.TStoreyInfoMapper;
import com.zehong.system.modbus.util.Modbus4jUtils; import com.zehong.system.modbus.util.Modbus4jUtils;
import com.zehong.system.modbus.util.WriteCurrentTimeUtil;
import com.zehong.system.service.ITEquipmentAlarmDataService; import com.zehong.system.service.ITEquipmentAlarmDataService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.quartz.DisallowConcurrentExecution; import org.quartz.DisallowConcurrentExecution;
...@@ -161,7 +164,22 @@ public class AgingStageOneProcessJob implements Job { ...@@ -161,7 +164,22 @@ public class AgingStageOneProcessJob implements Job {
master = Modbus4jUtils.createModbusMaster(ip, port); master = Modbus4jUtils.createModbusMaster(ip, port);
// 4. 条件写入时间 // 4. 条件写入时间
if (result[1] == 1 || result[1] == 3 || result[1] == 4) { if (result[1] == 1 || result[1] == 3 || result[1] == 4) {
writeCurrentTimeToDevice(master, deviceId, binding); // writeCurrentTimeToDevice(master, deviceId, binding);
WriteCurrentTimeVo writeCurrentTimeVo = WriteCurrentTimeUtil.generateWriteCurrentTimeVo();
boolean allSuccess = Modbus4jUtils.writeCurrentTimeToDeviceEnhanced(master, deviceId,writeCurrentTimeVo);
if (!allSuccess) {
log.warn("设备{}写入时间失败: ip={}, port={}", deviceId, ip, port);
binding.setWriteTimeStatus("0");
palletDeviceBindingMapper.updatePalletDeviceBinding(binding);
errorCount.incrementAndGet();
return false;
}
binding.setRecordYear(String.valueOf(writeCurrentTimeVo.getYear()));
binding.setRecordMonth(String.valueOf(writeCurrentTimeVo.getMonth()));
binding.setRecordDate(String.valueOf(writeCurrentTimeVo.getDay()));
binding.setRecordHour(String.valueOf(writeCurrentTimeVo.getHour()));
binding.setRecordMinute(String.valueOf(writeCurrentTimeVo.getMinute()));
binding.setWriteTimeStatus("1");
} }
// 5. 写入自检让设备开始自检,跟 上面的状态没关系 // 5. 写入自检让设备开始自检,跟 上面的状态没关系
writeSelfCheckStatus(master, deviceId, binding); writeSelfCheckStatus(master, deviceId, binding);
...@@ -275,6 +293,7 @@ public class AgingStageOneProcessJob implements Job { ...@@ -275,6 +293,7 @@ public class AgingStageOneProcessJob implements Job {
} }
} }
// -------------------------- 辅助方法(日志/告警)-------------------------- // -------------------------- 辅助方法(日志/告警)--------------------------
/** /**
* 从JobContext中获取fStoreyId(失败返回unknown) * 从JobContext中获取fStoreyId(失败返回unknown)
......
...@@ -6,10 +6,12 @@ import com.zehong.system.domain.PalletDeviceBinding; ...@@ -6,10 +6,12 @@ import com.zehong.system.domain.PalletDeviceBinding;
import com.zehong.system.domain.SysRealTimeAdRange; import com.zehong.system.domain.SysRealTimeAdRange;
import com.zehong.system.domain.TEquipmentAlarmData; import com.zehong.system.domain.TEquipmentAlarmData;
import com.zehong.system.domain.TStoreyInfo; import com.zehong.system.domain.TStoreyInfo;
import com.zehong.system.domain.vo.WriteCurrentTimeVo;
import com.zehong.system.mapper.PalletDeviceBindingMapper; import com.zehong.system.mapper.PalletDeviceBindingMapper;
import com.zehong.system.mapper.SysRealTimeAdRangeMapper; import com.zehong.system.mapper.SysRealTimeAdRangeMapper;
import com.zehong.system.mapper.TStoreyInfoMapper; import com.zehong.system.mapper.TStoreyInfoMapper;
import com.zehong.system.modbus.util.Modbus4jUtils; import com.zehong.system.modbus.util.Modbus4jUtils;
import com.zehong.system.modbus.util.WriteCurrentTimeUtil;
import com.zehong.system.service.ITEquipmentAlarmDataService; import com.zehong.system.service.ITEquipmentAlarmDataService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.quartz.DisallowConcurrentExecution; import org.quartz.DisallowConcurrentExecution;
...@@ -296,7 +298,7 @@ public class AgingStageThreeProcessJob implements Job { ...@@ -296,7 +298,7 @@ public class AgingStageThreeProcessJob implements Job {
handleTimeConsistent(deviceId, binding); handleTimeConsistent(deviceId, binding);
} else { } else {
// 时间不一致 // 时间不一致
handleTimeInconsistent(master, deviceId, binding, systemCal); handleTimeInconsistent(master, deviceId, binding);
} }
} catch (ModbusTransportException e) { } catch (ModbusTransportException e) {
...@@ -347,48 +349,29 @@ public class AgingStageThreeProcessJob implements Job { ...@@ -347,48 +349,29 @@ public class AgingStageThreeProcessJob implements Job {
* 处理时间不一致的情况 - 更新设备时间 * 处理时间不一致的情况 - 更新设备时间
*/ */
private void handleTimeInconsistent(ModbusMaster master, int deviceId, private void handleTimeInconsistent(ModbusMaster master, int deviceId,
PalletDeviceBinding binding, Calendar systemCal) { PalletDeviceBinding binding) {
log.info("设备{}时间与系统时间不一致,开始更新时间", deviceId); log.info("设备{}时间与系统时间不一致,开始更新时间", deviceId);
try { try {
// 1 如果时间状态为空,则写入时间 // 1 如果时间状态为空,则写入时间
if(binding.getWriteTimeStatus() == null) { if(binding.getWriteTimeStatus() == null) {
int year = systemCal.get(Calendar.YEAR); WriteCurrentTimeVo writeCurrentTimeVo = WriteCurrentTimeUtil.generateWriteCurrentTimeVo();
int month = systemCal.get(Calendar.MONTH) + 1; boolean allSuccess = Modbus4jUtils.writeCurrentTimeToDeviceEnhanced(master, deviceId,writeCurrentTimeVo);
int day = systemCal.get(Calendar.DATE); if (allSuccess) {
int hour = systemCal.get(Calendar.HOUR_OF_DAY); binding.setRecordYear(String.valueOf(writeCurrentTimeVo.getYear()));
int minute = systemCal.get(Calendar.MINUTE); binding.setRecordMonth(String.valueOf(writeCurrentTimeVo.getMonth()));
binding.setRecordDate(String.valueOf(writeCurrentTimeVo.getDay()));
// 写入时间寄存器 binding.setRecordHour(String.valueOf(writeCurrentTimeVo.getHour()));
boolean success; binding.setRecordMinute(String.valueOf(writeCurrentTimeVo.getMinute()));
success = Modbus4jUtils.writeRegister(master, deviceId, 4, (short) year);
success = success && Modbus4jUtils.writeRegister(master, deviceId, 5, (short) month);
success = success && Modbus4jUtils.writeRegister(master, deviceId, 6, (short) day);
success = success && Modbus4jUtils.writeRegister(master, deviceId, 7, (short) hour);
success = success && Modbus4jUtils.writeRegister(master, deviceId, 8, (short) minute);
if (success) {
int[] ints = Modbus4jUtils.readDeviceRegisters(master, deviceId);
if(ints[4] == year && ints[5] == month && ints[6] == day && ints[7] == hour && ints[8] == minute) {
binding.setRecordYear(String.valueOf(year));
binding.setRecordMonth(String.valueOf(month));
binding.setRecordDate(String.valueOf(day));
binding.setRecordHour(String.valueOf(hour));
binding.setRecordMinute(String.valueOf(minute));
binding.setWriteTimeStatus("1"); binding.setWriteTimeStatus("1");
binding.setRunTimeStatus("1"); binding.setRunTimeStatus("1");
log.info("设备{}时间写入成功", deviceId); log.info("设备{}时间写入成功", deviceId);
} else { } else {
log.info("设备{}时间写入失败: year={}, month={}, day={}, hour={}, minute={}",deviceId,ints[4], ints[5], ints[6], ints[7], ints[8]);
binding.setWriteTimeStatus("0"); binding.setWriteTimeStatus("0");
binding.setRunTimeStatus("0"); binding.setRunTimeStatus("0");
log.error("设备{}时间写入失败", deviceId);
recordAlarmByBinding(binding, "设备时间写入失败"); recordAlarmByBinding(binding, "设备时间写入失败");
} }
} else {
binding.setRunTimeStatus("0");
log.info("设备{}时间更新失败", deviceId);
recordAlarmByBinding(binding, "设备时间更新失败");
}
// 2. 如果时间状态为1,则更新 时间运行状态 为异常 状态 // 2. 如果时间状态为1,则更新 时间运行状态 为异常 状态
} else if("1".equals(binding.getWriteTimeStatus())) { } else if("1".equals(binding.getWriteTimeStatus())) {
log.info("设备{}时间状态为1,则更新 时间运行状态 为异常 状态", deviceId); log.info("设备{}时间状态为1,则更新 时间运行状态 为异常 状态", deviceId);
......
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