liuwei 2 месяцев назад
Родитель
Сommit
f6900d013e
1 измененных файлов с 17 добавлено и 14 удалено
  1. 17 14
      src/main/java/com/jeesite/modules/scheduling/FswModbusScheduling.java

+ 17 - 14
src/main/java/com/jeesite/modules/scheduling/FswModbusScheduling.java

@@ -32,7 +32,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
  * 寄存器约定:
  *   4740  总使能(1=执行整套逻辑,其它值跳过)
  *   3600  数据采集触发(1=请求采集,MES读完后置0)
- *   3610  质量校验结果(0=待校验/已复位,1=合格,2=不合格;MES 写 1/2 后同一 SN 不重复校验,3610 回到 0 后可再校验)
+ *   3612  质量校验请求(1=PLC 请求校验;MES 只读不写,由 PLC 管理)
+ *   3610  质量校验结果(0=待校验,1=合格,2=不合格;仅当 3612=1 且 3610=0 时 MES 校验并写 1/2)
  *   3620~3649  工件码(30个字,ASCII拼接)
  *   3740  进给速度 → feedSpeed
  *   3780  进给倍率 → feedRate
@@ -61,6 +62,8 @@ public class FswModbusScheduling {
 	private static final int ADDR_ENABLE_FLAG = 4740;
 	private static final int ADDR_COLLECT_FLAG = 3600;
 	private static final int ADDR_QUALITY_RESULT = 3610;
+	/** 质量校验请求:PLC 置 1 表示请求校验,MES 只读不写 */
+	private static final int ADDR_QUALITY_REQUEST = 3612;
 	private static final int ADDR_SN_START = 3620;
 	private static final int SN_REGISTER_COUNT = 60;
 
@@ -93,8 +96,6 @@ public class FswModbusScheduling {
 
 	private final AtomicBoolean running = new AtomicBoolean(false);
 	private volatile ModbusTcp modbusTcp;
-	/** 质量校验去重:同一工件码仅校验一次,3610 复位为 0 后清空 */
-	private volatile String lastCheckedSn;
 	/** 最近一次非空工件码(采集时 PLC 可能已清空 3620,用此兜底) */
 	private volatile String lastKnownSn;
 
@@ -189,29 +190,31 @@ public class FswModbusScheduling {
 	}
 
 	/**
-	 * 读取工件码 → 质量校验 → 写回 3610(1合格 / 2不合格)。
-	 * 同一工件码只校验一次;PLC 将 3610 置 0 后允许再次校验。
+	 * 读框架码 → 3612=1 且 3610=0 时质量校验 → 写回 3610(1合格 / 2不合格)。
+	 * MES 不改写 3612,由 PLC 管理请求位与下次复位。
 	 */
 	private void handleQualityCheck(ModbusTcp plc) {
-		Short qualityFlag = plc.readInt16(ADDR_QUALITY_RESULT);
-		if (qualityFlag == null || qualityFlag == 0) {
-			lastCheckedSn = null;
-		}
-
 		String sn = readWorkpieceCode(plc);
 		if (StringUtils.isBlank(sn)) {
 			// 不清空 lastKnownSn:采集触发时寄存器可能已被 PLC 清掉
 			return;
 		}
 		lastKnownSn = sn;
-		if (sn.equals(lastCheckedSn)) {
+
+		Short requestFlag = plc.readInt16(ADDR_QUALITY_REQUEST);
+		if (requestFlag == null || requestFlag != 1) {
+			return;
+		}
+
+		Short qualityFlag = plc.readInt16(ADDR_QUALITY_RESULT);
+		if (qualityFlag == null || qualityFlag != 0) {
 			return;
 		}
 
 		boolean pass = doQualityCheck(sn);
-		plc.writeInt16(ADDR_QUALITY_RESULT, pass ? (short) 1 : (short) 2);
-		lastCheckedSn = sn;
-		logger.info("FSW质量校验 sn={} result={}", sn, pass ? 1 : 2);
+		short result = pass ? (short) 1 : (short) 2;
+		plc.writeInt16(ADDR_QUALITY_RESULT, result);
+		logger.info("FSW质量校验 sn={} 3612={} result={}", sn, requestFlag, result);
 	}
 
 	/**