Administrator
2026-04-25 3f797dd834a2de283cf5eff2ff1124e5a0ccb233
src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
@@ -9,6 +9,7 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.service.BasDualCrnpOptService;
import com.zy.asrs.service.BasDualCrnpService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
@@ -48,7 +49,7 @@
    private RedisUtil redisUtil;
    private ZyDualCrnConnectDriver zyDualCrnConnectDriver;
    private DualCrnProtocol crnProtocol;
    private int deviceLogCollectTime = 200;
    private volatile int deviceLogCollectTime = 200;
    public ZySiemensDualCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
@@ -66,7 +67,7 @@
                try {
                    deviceLogCollectTime = Utils.getDeviceLogCollectTime();
                    readStatus();
                    Thread.sleep(50);
                    Thread.sleep(100);
                } catch (Exception e) {
                    log.error("DualCrnThread Fail", e);
                }
@@ -87,10 +88,14 @@
                        List<SendDualCrnCommandParam> commandList = (List<SendDualCrnCommandParam>) task.getData();
                        for (SendDualCrnCommandParam sendDualCrnCommandParam : commandList) {
                            DualCrnCommand dualCrnCommand = sendDualCrnCommandParam.getCommands().get(0);
                            redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_IDX.key + dualCrnCommand.getTaskNo(), sendDualCrnCommandParam.getCommandIdx(), 60 * 60 * 24);
                            redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_IDX.key + dualCrnCommand.getTaskNo(), 0, 60 * 60 * 24);
                            redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + dualCrnCommand.getTaskNo(), JSON.toJSONString(sendDualCrnCommandParam, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
                            if (sendDualCrnCommandParam.getStation() == 1) {
                                redisUtil.set(RedisKeyType.DUAL_CRN_STATION1_FLAG.key + crnProtocol.getCrnNo(), dualCrnCommand.getTaskNo(), 60 * 60 * 24);
                            } else {
                                redisUtil.set(RedisKeyType.DUAL_CRN_STATION2_FLAG.key + crnProtocol.getCrnNo(), dualCrnCommand.getTaskNo(), 60 * 60 * 24);
                        }
                        redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + crnProtocol.getCrnNo(), JSON.toJSONString(commandList, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
                        }
                    } else if (step == 3) {
                        sendCommand((DualCrnCommand) task.getData());
                    }
@@ -106,6 +111,8 @@
        Thread commandThread = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(100);
                    if(crnProtocol.getMode() != DualCrnModeType.AUTO.id) {
                        continue;
                    }
@@ -120,16 +127,11 @@
                        continue;
                    }
                    Object commandListObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + crnProtocol.getCrnNo());
                    if (commandListObj == null) {
                        continue;
                    }
                    List<SendDualCrnCommandParam> commandList = JSON.parseArray(commandListObj.toString(), SendDualCrnCommandParam.class);
                    List<SendDualCrnCommandParam> commandList = getDualCrnCommandList();
                    for (SendDualCrnCommandParam commandParam : commandList) {
                        processStation(commandParam);
                    }
                    Thread.sleep(100);
                } catch (Exception e) {
                    log.error("DualCrnCommand Fail", e);
                }
@@ -153,17 +155,49 @@
        DualCrnCommand dualCommand = commandList.get(idx);
        boolean send = false;
        //TODO 判断站点1,2任务类型是否一致
        if (station == 1) {
            if (crnProtocol.getStatus().equals(DualCrnStatusType.FETCH_COMPLETE.id)
                    || crnProtocol.getStatus().equals(DualCrnStatusType.IDLE.id)
            ) {
            log.info("工位2任务==========>{}, 任务模式---->{}", crnProtocol.getTaskNoTwo(), crnProtocol.getMode());
            log.info("工位1任务==========>{}, 任务模式---->{}", crnProtocol.getTaskNo(), crnProtocol.getMode());
            Integer taskNo = crnProtocol.getTaskNoTwo();
            if (crnProtocol.getTaskSend() == 0) {
                //两个工位只允许放相同类型任务
//                if (taskNo != null && taskNo > 0) {
//                    WrkMastService mastService = SpringUtils.getBean(WrkMastService.class);
//                    WrkMast wrkMast = mastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", taskNo));
//                    WrkMast wrkMast1 = mastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", dualCommand.getTaskNo()));
//                    if (!Objects.isNull(wrkMast) && !Objects.isNull(wrkMast1)) {
//                        if (wrkMast1.getIoType() != wrkMast.getIoType()) {
////                            return;
//                        }
//                    }
//                }
                // && sendComm(taskNo, dualCommand.getTaskNo())
                if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PICK.id) {
                    if (crnProtocol.getStatus().equals(DualCrnStatusType.IDLE.id)) {
                send = true;
            }
        }else {
            if (crnProtocol.getStatusTwo().equals(DualCrnStatusType.FETCH_COMPLETE.id)
                    || crnProtocol.getStatusTwo().equals(DualCrnStatusType.IDLE.id)
            ) {
                } else if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PUT.id) {
                    if (crnProtocol.getStatus().equals(DualCrnStatusType.FETCH_COMPLETE.id)) {
                send = true;
                    }
                }
            }
        } else {
            log.info("工位1任务==========>{}, 任务模式---->{}", crnProtocol.getTaskNo(), crnProtocol.getMode());
            log.info("工位2任务==========>{}, 任务模式---->{}", crnProtocol.getTaskNoTwo(), crnProtocol.getMode());
            Integer taskNo = crnProtocol.getTaskNo();
            // && sendComm(taskNo, dualCommand.getTaskNo())
            if (crnProtocol.getTaskSendTwo() == 0) {
                if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PICK.id) {
                    if (crnProtocol.getStatusTwo().equals(DualCrnStatusType.IDLE.id)) {
                        send = true;
                    }
                } else if (dualCommand.getTaskMode().intValue() == DualCrnTaskModeType.PUT.id) {
                    if (crnProtocol.getStatusTwo().equals(DualCrnStatusType.FETCH_COMPLETE.id)) {
                        send = true;
                    }
                }
            }
        }
@@ -172,7 +206,7 @@
                idx++;
                redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_IDX.key + firstCommand.getTaskNo(), idx, 60 * 60 * 24);
                sendCommand(dualCommand);
                redisUtil.set(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo(), "lock", 5);
                redisUtil.set(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo(), "lock", 3);
            }
            return;
        }else {
@@ -222,6 +256,22 @@
        }
    }
    public boolean sendComm(Integer taskNo, Integer current) {
        //两个工位只允许放相同类型任务
        if (taskNo != null && taskNo > 0) {
            WrkMastService mastService = SpringUtils.getBean(WrkMastService.class);
            WrkMast wrkMast = mastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", taskNo));
            WrkMast wrkMast1 = mastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", current));
            if (!Objects.isNull(wrkMast) && !Objects.isNull(wrkMast1)) {
                if (wrkMast1.getIoType() != wrkMast.getIoType()) {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * 初始化堆垛机状态
     */
@@ -234,6 +284,7 @@
        //工位1
        crnProtocol.setTaskNo(0);
        crnProtocol.setDeviceTaskNo(0);
        crnProtocol.setStatus(-1);
        crnProtocol.setBay(0);
        crnProtocol.setLevel(0);
@@ -244,6 +295,7 @@
        //工位2
        crnProtocol.setTaskNoTwo(0);
        crnProtocol.setDeviceTaskNoTwo(0);
        crnProtocol.setStatusTwo(-1);
        crnProtocol.setBayTwo(0);
        crnProtocol.setLevelTwo(0);
@@ -303,18 +355,20 @@
        crnProtocol.setMode(crnStatus.getMode());
        //工位1
        crnProtocol.setTaskNo(crnStatus.getTaskNo());
        crnProtocol.setDeviceTaskNo(crnStatus.getTaskNo());
        crnProtocol.setStatus(crnStatus.getStatus());
        crnProtocol.setForkPos(crnStatus.getForkPos());
        crnProtocol.setLoaded(crnStatus.getLoaded());
        crnProtocol.setTaskReceive(crnStatus.getTaskReceive());
        crnProtocol.setTaskSend(crnStatus.getTaskSend());
        //工位2
        crnProtocol.setTaskNoTwo(crnStatus.getTaskNoTwo());
        crnProtocol.setDeviceTaskNoTwo(crnStatus.getTaskNoTwo());
        crnProtocol.setStatusTwo(crnStatus.getStatusTwo());
        crnProtocol.setForkPosTwo(crnStatus.getForkPosTwo());
        crnProtocol.setLoadedTwo(crnStatus.getLoadedTwo());
        crnProtocol.setTaskReceiveTwo(crnStatus.getTaskReceiveTwo());
        crnProtocol.setTaskSendTwo(crnStatus.getTaskSendTwo());
        crnProtocol.setBay(crnStatus.getBay());
        crnProtocol.setLevel(crnStatus.getLevel());
@@ -394,7 +448,8 @@
                    }
                }
            }
        } catch (Exception ignore) {}
        } catch (Exception ignore) {
        }
    }
    @Override
@@ -477,10 +532,10 @@
    }
    @Override
    public DualCrnCommand getResetCommand(Integer crnNo, Integer station) {
    public DualCrnCommand getResetCommand(Integer taskNo, Integer crnNo, Integer station) {
        DualCrnCommand crnCommand = new DualCrnCommand();
        crnCommand.setCrnNo(crnNo); // 堆垛机编号
        crnCommand.setTaskNo(0); // 工作号
        crnCommand.setTaskNo(taskNo); // 工作号
        crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id); // 任务模式:  确认
        crnCommand.setSourcePosX(0);     // 源库位排
        crnCommand.setSourcePosY(0);     // 源库位列
@@ -525,4 +580,77 @@
            }
        }
    }
    public List<SendDualCrnCommandParam> getDualCrnCommandList() {
        List<SendDualCrnCommandParam> commandList = new ArrayList<>();
        SendDualCrnCommandParam command1 = getDualCrnCommandList(1);
        SendDualCrnCommandParam command2 = getDualCrnCommandList(2);
        if (command1 != null) {
            commandList.add(command1);
        }
        if (command2 != null) {
            commandList.add(command2);
        }
        return commandList;
    }
    public SendDualCrnCommandParam getDualCrnCommandList(int station) {
        SendDualCrnCommandParam sendDualCrnCommandParam = null;
        String key = null;
        if (station == 1 && crnProtocol.getTaskNo() > 0) {
            key = RedisKeyType.DUAL_CRN_COMMAND_.key + crnProtocol.getTaskNo();
        } else if (station == 2 && crnProtocol.getTaskNoTwo() > 0) {
            key = RedisKeyType.DUAL_CRN_COMMAND_.key + crnProtocol.getTaskNoTwo();
        }
        if (key == null) {
            return null;
        }
        Object commandObj = redisUtil.get(key);
        if (commandObj == null) {
            return null;
        }
        sendDualCrnCommandParam = JSON.parseObject(commandObj.toString(), SendDualCrnCommandParam.class);
        if (sendDualCrnCommandParam == null) {
            return null;
        }
        if (station == 1) {
            if (crnProtocol.getTaskNoTwo() > 0) {
                Object object = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + crnProtocol.getTaskNoTwo());
                if (object != null) {
                    SendDualCrnCommandParam jsonObject = JSON.parseObject(object.toString(), SendDualCrnCommandParam.class);
                    ;
                    if (!jsonObject.getCommands().get(0).getTaskMode().equals(sendDualCrnCommandParam.getCommands().get(0).getTaskMode())) {
                        return null;
                    }
                }
            }
        } else {
            if (crnProtocol.getTaskNo() > 0) {
                WrkMastService mastService = SpringUtils.getBean(WrkMastService.class);
                WrkMast wrkMast = mastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", crnProtocol.getTaskNo()));
                WrkMast wrkMast1 = mastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", crnProtocol.getTaskNoTwo()));
                if (!Objects.isNull(wrkMast) && !Objects.isNull(wrkMast1)) {
                    if (!wrkMast1.getIoType().equals(wrkMast.getIoType())) {
                        return null;
                    }
                }
//                Object object = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + crnProtocol.getTaskNo());
//                if (object != null) {
//                    SendDualCrnCommandParam jsonObject = JSON.parseObject(object.toString(), SendDualCrnCommandParam.class);
//                    ;
//                    if (!jsonObject.getCommands().get(0).getTaskMode().equals(sendDualCrnCommandParam.getCommands().get(0).getTaskMode())) {
//                        return null;
//                    }
//                }
            }
        }
        return sendDualCrnCommandParam;
    }
}