#
Administrator
2026-04-27 007ee7bc1b63aa381b3a414952bbf41aeebed60e
src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
@@ -176,12 +176,34 @@
                if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PICK.id) {
                    if (crnProtocol.getStatus().equals(DualCrnStatusType.IDLE.id)) {
                        send = true;
                    } else {
                        logDualCrnWaitLimited("pick_station1_" + crnProtocol.getCrnNo(), 3,
                                "[WCS Trace][双工位入库] 工位1取货命令等待发送。crnNo={}, idx={}, taskNo1={}, taskNo2={}, status1={}({}), status2={}({}), taskSend1={}, taskSend2={}, nextTaskMode={}",
                                crnProtocol.getCrnNo(), idx, crnProtocol.getTaskNo(), crnProtocol.getTaskNoTwo(),
                                crnProtocol.getStatus(), crnProtocol.getStatusType(),
                                crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(),
                                crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo(), dualCommand.getTaskMode());
                    }
                } else if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PUT.id) {
                    if (crnProtocol.getStatus().equals(DualCrnStatusType.FETCH_COMPLETE.id)) {
                        send = true;
                    } else {
                        logDualCrnWaitLimited("put_station1_status_" + crnProtocol.getCrnNo(), 3,
                                "[WCS Trace][双工位入库] 工位1放货命令等待FETCH_COMPLETE。crnNo={}, idx={}, currentTaskNo={}, status1={}({}), status2={}({}), taskSend1={}, taskSend2={}, taskReceive1={}, taskReceive2={}, loaded1={}, loaded2={}",
                                crnProtocol.getCrnNo(), idx, dualCommand.getTaskNo(),
                                crnProtocol.getStatus(), crnProtocol.getStatusType(),
                                crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(),
                                crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo(),
                                crnProtocol.getTaskReceive(), crnProtocol.getTaskReceiveTwo(),
                                crnProtocol.getLoaded(), crnProtocol.getLoadedTwo());
                    }
                }
            } else {
                logDualCrnWaitLimited("station1_tasksend_" + crnProtocol.getCrnNo(), 3,
                        "[WCS Trace][双工位入库] 工位1命令等待taskSend清零。crnNo={}, idx={}, taskSend1={}, taskSend2={}, status1={}({}), status2={}({}), nextTaskMode={}",
                        crnProtocol.getCrnNo(), idx, crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo(),
                        crnProtocol.getStatus(), crnProtocol.getStatusType(),
                        crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(), dualCommand.getTaskMode());
            }
        } else {
            log.info("工位1任务==========>{}, 任务模式---->{}", crnProtocol.getTaskNo(), crnProtocol.getMode());
@@ -192,12 +214,34 @@
                if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PICK.id) {
                    if (crnProtocol.getStatusTwo().equals(DualCrnStatusType.IDLE.id)) {
                        send = true;
                    } else {
                        logDualCrnWaitLimited("pick_station2_" + crnProtocol.getCrnNo(), 3,
                                "[WCS Trace][双工位入库] 工位2取货命令等待发送。crnNo={}, idx={}, taskNo1={}, taskNo2={}, status1={}({}), status2={}({}), taskSend1={}, taskSend2={}, nextTaskMode={}",
                                crnProtocol.getCrnNo(), idx, crnProtocol.getTaskNo(), crnProtocol.getTaskNoTwo(),
                                crnProtocol.getStatus(), crnProtocol.getStatusType(),
                                crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(),
                                crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo(), dualCommand.getTaskMode());
                    }
                } else if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PUT.id) {
                    if (crnProtocol.getStatusTwo().equals(DualCrnStatusType.FETCH_COMPLETE.id)) {
                        send = true;
                    } else {
                        logDualCrnWaitLimited("put_station2_status_" + crnProtocol.getCrnNo(), 3,
                                "[WCS Trace][双工位入库] 工位2放货命令等待FETCH_COMPLETE。crnNo={}, idx={}, currentTaskNo={}, status1={}({}), status2={}({}), taskSend1={}, taskSend2={}, taskReceive1={}, taskReceive2={}, loaded1={}, loaded2={}",
                                crnProtocol.getCrnNo(), idx, dualCommand.getTaskNo(),
                                crnProtocol.getStatus(), crnProtocol.getStatusType(),
                                crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(),
                                crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo(),
                                crnProtocol.getTaskReceive(), crnProtocol.getTaskReceiveTwo(),
                                crnProtocol.getLoaded(), crnProtocol.getLoadedTwo());
                    }
                }
            } else {
                logDualCrnWaitLimited("station2_tasksend_" + crnProtocol.getCrnNo(), 3,
                        "[WCS Trace][双工位入库] 工位2命令等待taskSend清零。crnNo={}, idx={}, taskSend1={}, taskSend2={}, status1={}({}), status2={}({}), nextTaskMode={}",
                        crnProtocol.getCrnNo(), idx, crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo(),
                        crnProtocol.getStatus(), crnProtocol.getStatusType(),
                        crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(), dualCommand.getTaskMode());
            }
        }
@@ -214,6 +258,12 @@
                //等待下一个任务
                Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
                if (wait != null) {
                    logDualCrnWaitLimited("put_wait_lock_" + crnProtocol.getCrnNo(), 2,
                            "[WCS Trace][双工位入库] 放货命令被取货等待锁拦住。crnNo={}, idx={}, station={}, currentTaskNo={}, status1={}({}), status2={}({}), taskSend1={}, taskSend2={}",
                            crnProtocol.getCrnNo(), idx, station, dualCommand.getTaskNo(),
                            crnProtocol.getStatus(), crnProtocol.getStatusType(),
                            crnProtocol.getStatusTwo(), crnProtocol.getStatusTypeTwo(),
                            crnProtocol.getTaskSend(), crnProtocol.getTaskSendTwo());
                    return;
                }
@@ -256,6 +306,20 @@
        }
    }
    private void logDualCrnWaitLimited(String lockKey, int seconds, String format, Object... arguments) {
        String redisKey = RedisKeyType.LOG_LIMIT.key + "dual_crn_wait_" + lockKey;
        try {
            Object lock = redisUtil.get(redisKey);
            if (lock != null) {
                return;
            }
            redisUtil.set(redisKey, "lock", seconds);
        } catch (Exception e) {
            // 诊断日志不能影响主流程。
        }
        News.info(format, arguments);
    }
    public boolean sendComm(Integer taskNo, Integer current) {
        //两个工位只允许放相同类型任务
        if (taskNo != null && taskNo > 0) {