#
luxiaotao1123
2022-11-01 f50a514a639c95145794a70969b096d141fd4bb6
#
3个文件已修改
243 ■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 236 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkChargeMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2487,6 +2487,9 @@
     */
    @SuppressWarnings("serial")
    public synchronized void loopSteCharge() {
        if (null != wrkChargeService.selectWorking(null, "reset")) {
            return;
        }
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        for (SteSlave ste : slaveProperties.getSte()) {
            SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId());
@@ -2553,6 +2556,7 @@
                    wrkCharge.setIoPri((double) 10);
                    wrkCharge.setLocNo(chargeLocNo);
                    wrkCharge.setMemo("charge");
                    wrkCharge.setAppeTime(new Date());
                    if (!wrkChargeService.insert(wrkCharge)) {
                        log.error("保存{}号穿梭车充电任务失败!!!", ste.getId());
                        continue;
@@ -2715,9 +2719,9 @@
    }
    /**
     * 小车从充电桩 至 待机库位
     * 轮询充电桩是否有空闲小车
     */
    public synchronized void steFromChargeToIdleLoc() {
    public synchronized void queryChargeLocOfComplete() {
        // 与充电任务不同步进行
        if (null != wrkChargeService.selectWorking(null, "charge")) { return; }
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
@@ -2752,11 +2756,11 @@
                // case 3 : 自动充电关   馈电      ✔
                // case 4 : 自动充电关   满电      ✔
                if (basSte.getAutoCharge().equals("Y")
                    && steProtocol.getCharge() < Float.parseFloat(basSte.getChargeLine())) {
                        && steProtocol.getCharge() < Float.parseFloat(basSte.getChargeLine())) {
                    continue;
                }
                WrkCharge wrkCharge = wrkChargeService.selectWorking(null, "reset");
                WrkCharge wrkCharge = wrkChargeService.selectWorking(steNo, "reset");
                if (wrkCharge == null) {
                    // 开始穿梭车复位任务
@@ -2769,129 +2773,141 @@
                    wrkCharge.setSourceLocNo(value.locNo);
                    wrkCharge.setLocNo(basSte.getIdleLoc());
                    wrkCharge.setMemo("reset");
                    wrkCharge.setAppeTime(new Date());
                    if (!wrkChargeService.insert(wrkCharge)) {
                        log.error("保存{}号穿梭车复位任务失败!!!", steNo);
                        continue;
                    }
                }
            }
        }
    }
                // 搬运至固定通道
                if (wrkCharge.getWrkSts() == 41L) {
                    // 搬小车至小车走向通道
                    List<String> channel = slaveProperties.getChannel();
                    for (String channelLocNo : channel) {
                        Integer otherSte = existOtherSte(channelLocNo, wrkCharge.getSteNo());
                        if (null != otherSte) {
                            log.warn("{}号小车移入{}库位组失败,原因:存在{}号穿梭车!", wrkCharge.getSteNo(), channelLocNo, otherSte);
    /**
     * 小车从充电桩 至 待机库位
     */
    public synchronized void steFromChargeToIdleLoc() {
        WrkCharge wrkCharge = wrkChargeService.selectWorking(null, "reset");
        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo());
        SteProtocol steProtocol = steThread.getSteProtocol();
        BasSte basSte = basSteService.selectById(wrkCharge.getSteNo());
        if (Cools.isEmpty(steProtocol, basSte)) {
            return;
        }
        // 搬运至固定通道
        if (wrkCharge.getWrkSts() == 41L) {
            // 搬小车至小车走向通道
            List<String> channel = slaveProperties.getChannel();
            for (String channelLocNo : channel) {
                Integer otherSte = existOtherSte(channelLocNo, wrkCharge.getSteNo());
                if (null != otherSte) {
                    log.warn("{}号小车移入{}库位组失败,原因:存在{}号穿梭车!", wrkCharge.getSteNo(), channelLocNo, otherSte);
                } else {
                    // 固定堆垛机
                    int crnNo = 1;
                    LocMast channelLoc = locMastService.selectById(channelLocNo);
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo);
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                    if (crnProtocol == null) { continue; }
                    // 只有当堆垛机空闲 并且 无任务时才继续执行
                    if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                        // 堆垛机命令下发区 --------------------------------------------------------------------------
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setCrnNo(crnNo); // 堆垛机编号
                        crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号
                        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                        crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转
                        crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排
                        crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                        crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                        crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), false).shortValue());     // 目标库位排
                        crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue());     // 目标库位列
                        crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue());     // 目标库位层
                        if (!MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, crnCommand))) {
                            log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand));
                        } else {
                            // 固定堆垛机
                            int crnNo = 1;
                            LocMast channelLoc = locMastService.selectById(channelLocNo);
                            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo);
                            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                            if (crnProtocol == null) { continue; }
                            // 只有当堆垛机空闲 并且 无任务时才继续执行
                            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                                // 堆垛机命令下发区 --------------------------------------------------------------------------
                                CrnCommand crnCommand = new CrnCommand();
                                crnCommand.setCrnNo(crnNo); // 堆垛机编号
                                crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号
                                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                                crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转
                                crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排
                                crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                                crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                                crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), false).shortValue());     // 目标库位排
                                crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue());     // 目标库位列
                                crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue());     // 目标库位层
                                if (!MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, crnCommand))) {
                                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand));
                                } else {
                                    // 修改穿梭车运行中排列层
                                    steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), false), channelLoc.getBay1(), channelLoc.getLev1());
                                    // 修改工作档状态 41.小车准备复位 => 42.吊车搬运
                                    Date now = new Date();
                                    wrkCharge.setWrkSts(42L);
                                    wrkCharge.setCrnStrTime(now);
                                    wrkCharge.setModiTime(now);
                                    if (!wrkChargeService.updateById(wrkCharge)) {
                                        log.error("修改复位任务状态 41.小车准备复位 => 42.吊车搬运 失败!!,工作号={}", wrkCharge.getWrkNo());
                                    }
                                }
                                break;
                            }
                        }
                    }
                } else if (wrkCharge.getWrkSts() == 43L) {
                    // 小车行驶通道
                    if (steProtocol.statusType.equals(SteStatusType.IDLE) && steProtocol.getPakMk().equals("N")) {
                        // 命令下发区 --------------------------------------------------------------------------
                        SteCommand steCommand = new SteCommand();
                        steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号
                        steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号
                        steCommand.setTaskMode(SteTaskModeType.BACK_ORIGIN);  // 去左端
                        steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());
                        steCommand.setBay(steProtocol.getBay());
                        steCommand.setLev(steProtocol.getLev());
                        if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) {
                            log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand));
                        } else {
                            // 修改工作档状态 43.小车到达 ===> 44.小车走行
                            wrkCharge.setWrkSts(44L);
                            // 修改穿梭车运行中排列层
                            steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), false), channelLoc.getBay1(), channelLoc.getLev1());
                            // 修改工作档状态 41.小车准备复位 => 42.吊车搬运
                            Date now = new Date();
                            wrkCharge.setCrnEndTime(now);
                            wrkCharge.setWrkSts(42L);
                            wrkCharge.setCrnStrTime(now);
                            wrkCharge.setModiTime(now);
                            if (!wrkChargeService.updateById(wrkCharge)) {
                                log.error("修改复位任务状态 43.小车到达 ===> 44.小车走行 失败!!,工作号={}", wrkCharge.getWrkNo());
                                log.error("修改复位任务状态 41.小车准备复位 => 42.吊车搬运 失败!!,工作号={}", wrkCharge.getWrkNo());
                            }
                        }
                        break;
                    }
                } else if (wrkCharge.getWrkSts() == 45L) {
                    LocMast idleLoc = locMastService.selectById(basSte.getIdleLoc());
                    Integer otherSte = existOtherSte(idleLoc.getLocNo(), wrkCharge.getSteNo());
                    if (null != otherSte) {
                        log.warn("{}号小车移入{}库位组失败,原因:存在{}号穿梭车!", wrkCharge.getSteNo(), idleLoc.getLocNo(), otherSte);
                    } else {
                        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkCharge.getCrnNo());
                        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                        if (crnProtocol == null) { continue; }
                        // 只有当堆垛机空闲 并且 无任务时才继续执行
                        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                            // 堆垛机命令下发区 --------------------------------------------------------------------------
                            CrnCommand crnCommand = new CrnCommand();
                            crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号
                            crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号
                            crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                            crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转
                            crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排
                            crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                            crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                            crnCommand.setDestinationPosX(Utils.getGroupRow(idleLoc.getLocNo(), true).shortValue());     // 目标库位排
                            crnCommand.setDestinationPosY(idleLoc.getBay1().shortValue());     // 目标库位列
                            crnCommand.setDestinationPosZ(idleLoc.getLev1().shortValue());     // 目标库位层
                            if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) {
                                log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand));
                            } else {
                                // 修改穿梭车运行中排列层
                                steThread.modifyPos(Utils.getGroupRow(idleLoc.getLocNo(), true), idleLoc.getBay1(), idleLoc.getLev1());
                                // 修改工作档状态 45.小车待搬 => 46.放至待机位
                                Date now = new Date();
                                wrkCharge.setWrkSts(46L);
                                wrkCharge.setCrnStrTime(now);
                                wrkCharge.setModiTime(now);
                                if (!wrkChargeService.updateById(wrkCharge)) {
                                    log.error("修改工作档状态 45.小车待搬 => 46.放至待机位 失败!!,工作号={}", wrkCharge.getWrkNo());
                                }
                            }
                        }
                }
            }
        } else if (wrkCharge.getWrkSts() == 43L) {
            // 小车行驶通道
            if (steProtocol.statusType.equals(SteStatusType.IDLE) && steProtocol.getPakMk().equals("N")) {
                // 命令下发区 --------------------------------------------------------------------------
                SteCommand steCommand = new SteCommand();
                steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号
                steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号
                steCommand.setTaskMode(SteTaskModeType.BACK_ORIGIN);  // 去左端
                steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());
                steCommand.setBay(steProtocol.getBay());
                steCommand.setLev(steProtocol.getLev());
                if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) {
                    log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand));
                } else {
                    // 修改工作档状态 43.小车到达 ===> 44.小车走行
                    wrkCharge.setWrkSts(44L);
                    Date now = new Date();
                    wrkCharge.setCrnEndTime(now);
                    wrkCharge.setModiTime(now);
                    if (!wrkChargeService.updateById(wrkCharge)) {
                        log.error("修改复位任务状态 43.小车到达 ===> 44.小车走行 失败!!,工作号={}", wrkCharge.getWrkNo());
                    }
                }
            }
        } else if (wrkCharge.getWrkSts() == 45L) {
            LocMast idleLoc = locMastService.selectById(basSte.getIdleLoc());
            Integer otherSte = existOtherSte(idleLoc.getLocNo(), wrkCharge.getSteNo());
            if (null != otherSte) {
                log.warn("{}号小车移入{}库位组失败,原因:存在{}号穿梭车!", wrkCharge.getSteNo(), idleLoc.getLocNo(), otherSte);
            } else {
                CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkCharge.getCrnNo());
                CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                if (crnProtocol == null) { return; }
                // 只有当堆垛机空闲 并且 无任务时才继续执行
                if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                    // 堆垛机命令下发区 --------------------------------------------------------------------------
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号
                    crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号
                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排
                    crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                    crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                    crnCommand.setDestinationPosX(Utils.getGroupRow(idleLoc.getLocNo(), true).shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(idleLoc.getBay1().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(idleLoc.getLev1().shortValue());     // 目标库位层
                    if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改穿梭车运行中排列层
                        steThread.modifyPos(Utils.getGroupRow(idleLoc.getLocNo(), true), idleLoc.getBay1(), idleLoc.getLev1());
                        // 修改工作档状态 45.小车待搬 => 46.放至待机位
                        Date now = new Date();
                        wrkCharge.setWrkSts(46L);
                        wrkCharge.setCrnStrTime(now);
                        wrkCharge.setModiTime(now);
                        if (!wrkChargeService.updateById(wrkCharge)) {
                            log.error("修改工作档状态 45.小车待搬 => 46.放至待机位 失败!!,工作号={}", wrkCharge.getWrkNo());
                        }
                    }
                }
            }
        }
    }
src/main/java/com/zy/core/MainProcess.java
@@ -32,7 +32,7 @@
                try {
                    // 间隔
                    Thread.sleep(500);
                    Thread.sleep(300);
                    // 系统运行状态判断
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
@@ -70,7 +70,10 @@
                    mainService.ledReset();
                    // 穿梭车 ===>> 小车电量检测充电
                    mainService.loopSteCharge();
                    // 间隔
                    Thread.sleep(200);
                    // 穿梭车 ===>> 小车复位至待机库位
                    mainService.queryChargeLocOfComplete();
                    mainService.steFromChargeToIdleLoc();
                } catch (Exception e) {
src/main/resources/mapper/WrkChargeMapper.xml
@@ -38,6 +38,7 @@
        </if>
        and wrk_sts &lt; 30
        and memo = 'charge'
        order by appe_time desc
    </select>
    <select id="selectWorkingOfReset" resultMap="BaseResultMap">
@@ -49,6 +50,7 @@
        </if>
        and wrk_sts &lt; 47
        and memo = 'reset'
        order by appe_time desc
    </select>
</mapper>