|
|
@@ -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);
|
|
|
}
|
|
|
|
|
|
/**
|