Junjie
2023-03-30 de27c6f2d428632ed21a015dc6bfb73cc07f31a3
四向穿梭车入库模式完善
11个文件已修改
194 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ShuttleController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/LiftSlave.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LiftCommand.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/LiftProtocol.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LiftThread.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ShuttleThread.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -266,7 +266,7 @@
                command.setShuttleNo(shuttleSlave.getId().shortValue()); // 四向穿梭车编号
                command.setTaskMode(shuttleTaskModeType.id.shortValue());
                command.setSourceLocNo(param.getSourceLocNo());
                command.setDistLocNo(param.getDistLocNo());
                command.setLocNo(param.getDistLocNo());
                command.setTaskNo((short) 9999);
                if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(3, command))) {
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -98,5 +98,5 @@
    WrkMast selectRackInStep48(Short workNo,Integer sourceStaNo);
    WrkMast selectByWorkNo9(Integer workNo);
    WrkMast selectByWorkNo59(Integer workNo);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -636,15 +636,28 @@
                if (true || staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) {
                    WrkMast wrkMast = wrkMastMapper.selectRackInStep48(workNo, staProtocol.getSiteId());
                    if (wrkMast != null) {
                        if (wrkMast.getWrkSts() == 4) {
                            //寻找最近且空闲的四向穿梭车
                            HashMap<String, Object> searchIdleShuttle = this.searchIdleShuttle(wrkMast);
                            ShuttleThread shuttleThread = (ShuttleThread) searchIdleShuttle.get("result");
                        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 8) {
                            ShuttleThread shuttleThread = null;
                            HashMap<String, Object> searchIdleShuttle = null;
                            if (wrkMast.getWrkSts() == 4) {
                                //寻找最近且空闲的四向穿梭车
                                searchIdleShuttle = this.searchIdleShuttle(wrkMast);
                                shuttleThread = (ShuttleThread) searchIdleShuttle.get("result");
                            }else {
                                //状态8,四向穿梭车已在提升机口,等待命令进行入库搬运动作
                                Integer shuttleNo = wrkMast.getShuttleNo();//四向穿梭车号
                                shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
                            }
                            if (shuttleThread == null) {
                                continue;
                            }
                            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
                            if (!shuttleProtocol.isIdle()) {
                                continue;
                            }
                            wrkMast.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());//给工作档分配四向穿梭车号
                            //分配任务号
@@ -664,52 +677,30 @@
                            LocMast currentLocMast = locMastService.queryByQrCode(currentCode.toString());
                            assignCommand.setSourceLocNo(currentLocMast.getLocNo());
                            if (Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
                            if (wrkMast.getWrkSts() == 8 || Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) {
                                //同一层
                                //分配目标库位
                                shuttleProtocol.setLocNo(wrkMast.getLocNo());
                                //目标库位
                                assignCommand.setDistLocNo(wrkMast.getLocNo());
                                assignCommand.setLocNo(wrkMast.getLocNo());
                                wrkMast.setWrkSts(9L);//小车入库中
                            }else {
                                //不同层,将目标库位分配成提升机库位号
                                //分配目标库位
                                shuttleProtocol.setLocNo("1800201");
                                //小车当前层高
                                String currentLocNo = currentLocMast.getLocNo();
                                Integer currentLev = Integer.parseInt(currentLocNo.substring(currentLocNo.length() - 2, currentLocNo.length()));
                                //获取提升机
                                LiftSlave liftSlave = slaveProperties.getLift().get(0);
                                //提升机库位号
                                String liftLocNo = liftSlave.getLiftLocNo(currentLev);
                                shuttleProtocol.setLocNo(liftLocNo);
                                //目标库位
                                assignCommand.setDistLocNo("1800201");
                                assignCommand.setLocNo(liftLocNo);
                                wrkMast.setWrkSts(5L);//小车迁移状态
                            }
                            if (wrkMastMapper.updateById(wrkMast) > 0) {
                                //下发任务
                                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
                            }
                        }else {
                            //状态8,四向穿梭车已在提升机口,等待命令进行入库搬运动作
                            Integer shuttleNo = wrkMast.getShuttleNo();//四向穿梭车号
                            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
                            if (shuttleThread == null) {
                                continue;
                            }
                            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
                            //分配目标库位
                            shuttleProtocol.setLocNo(wrkMast.getLocNo());
                            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
                            //四向穿梭车号
                            assignCommand.setShuttleNo(shuttleNo.shortValue());
                            //任务号
                            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
                            //入出库模式
                            assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());
                            //源库位(小车当前位置)
                            Short currentCode = shuttleProtocol.getCurrentCode();
                            LocMast currentLocMast = locMastService.queryByQrCode(currentCode.toString());
                            assignCommand.setSourceLocNo(currentLocMast.getLocNo());
                            //目标库位
                            assignCommand.setDistLocNo(wrkMast.getLocNo());
                            wrkMast.setWrkSts(9L);//小车入库中
                            if (wrkMastMapper.updateById(wrkMast) > 0) {
                                //下发任务
                                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
@@ -778,10 +769,23 @@
                    //楼层相同情况
                    //找距离出库点最近的车
                    if (!(recentShuttleProtocol.isIdle() && shuttleProtocol.isIdle())) {
                        //只要有一辆车不是空闲则不进行调度
                        map.put("sameLay", false);//不同层
                        map.put("result", null);
                        return map;
                    }
                    //获取提升机
                    LiftSlave liftSlave = slaveProperties.getLift().get(0);
                    //提升机库位号
                    String recentLiftLocNo = liftSlave.getLiftLocNo(recentShuttleLocNoLayInt);
                    String shuttleLiftLocNo = liftSlave.getLiftLocNo(shuttleLocNoLayInt);
                    //当前最近四向穿梭车到提升机路径
                    List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentShuttleLocNo, "1800201", ShuttleTaskModeType.PAK_IN.id);
                    List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentShuttleLocNo, recentLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
                    //当前楼层四向穿梭车到提升机路径
                    List<NavigateNode> shuttlePath = NavigateUtils.calc(shuttleLocNo, "1800201", ShuttleTaskModeType.PAK_IN.id);
                    List<NavigateNode> shuttlePath = NavigateUtils.calc(shuttleLocNo, shuttleLiftLocNo, ShuttleTaskModeType.PAK_IN.id);
                    //判断哪一个路径最短
                    if (shuttlePath.size() < recentShuttlePath.size()) {
                        //如果当前楼层的车路径更小,则更新最近穿梭车
@@ -811,9 +815,18 @@
            //四向穿梭车状态为等待确认
            if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id && shuttleProtocol.getTaskNo() != 0) {
                //将任务档标记为完成
                WrkMast wrkMast = wrkMastMapper.selectByWorkNo9(shuttleProtocol.getTaskNo().intValue());
                WrkMast wrkMast = wrkMastMapper.selectByWorkNo59(shuttleProtocol.getTaskNo().intValue());
                if (wrkMast != null) {
                    wrkMast.setWrkSts(14L);
                    switch (wrkMast.getWrkSts().intValue()) {
                        case 9:
                            wrkMast.setWrkSts(14L);
                            break;
                        case 5:
                            wrkMast.setWrkSts(6L);
                            break;
                        default:
                    }
                    if (wrkMastMapper.updateById(wrkMast) > 0) {
                        //设置四向穿梭车为空闲状态
                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
@@ -825,7 +838,7 @@
                        shuttleProtocol.setLocNo(null);
                        //标记复位
                        shuttleProtocol.setPakMk(true);
                        News.error("四向穿梭车已确认且任务完成状态,复位。堆垛机号={}", shuttleProtocol.getShuttleNo());
                        News.info("四向穿梭车已确认且任务完成状态,复位。堆垛机号={}", shuttleProtocol.getShuttleNo());
                    } else {
                        News.error("四向穿梭车已确认且任务完成状态,复位失败,但未找到工作档。四向穿梭车号={},工作号={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
                    }
src/main/java/com/zy/core/ServerBootstrap.java
@@ -73,6 +73,10 @@
        for (Slave ste : slaveProperties.getSte()) {
            MessageQueue.init(SlaveType.Ste, ste);
        }
        // 初始化提升机mq
        for (Slave lift : slaveProperties.getLift()) {
            MessageQueue.init(SlaveType.Lift, lift);
        }
        // 初始化四向穿梭车mq
        for (Slave shuttle : slaveProperties.getShuttle()) {
            MessageQueue.init(SlaveType.Shuttle, shuttle);
src/main/java/com/zy/core/model/LiftSlave.java
@@ -4,34 +4,49 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class LiftSlave extends Slave {
    private Integer rack;
    // 排
    private Integer row;
    private Integer slot;
    // 列
    private Integer bay;
    private Boolean demo;
    //提升机站点
    private List<Sta> sta = new ArrayList<>();
    @Data
    public static class Sta {
        // 输送线plc编号
        private Integer devpPlcId;
        // 穿梭车站点编号
        // 提升机站点号
        private Integer staNo;
        // 排
        private Integer row;
        // 列
        private Integer bay;
        // 层
        private Integer lev;
    }
    //获取提升机库位号
    public String getLiftLocNo(Integer lev) {
        StringBuffer sb = new StringBuffer();
        if (row < 10) {
            sb.append("0");
        }
        sb.append(row);
        if (bay < 10) {
            sb.append("00");
        } else if (bay < 100) {
            sb.append("0");
        }
        sb.append(bay);
        sb.append(lev);
        return sb.toString();
    }
}
src/main/java/com/zy/core/model/command/LiftCommand.java
@@ -62,6 +62,10 @@
    /**
     * 提升机锁定
     */
    private Short liftLock;
    private Boolean liftLock;
    public Short getLiftLockShortValue() {
        return liftLock ? (short) 1 : (short) 0;
    }
}
src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java
@@ -36,6 +36,6 @@
    /**
     * 目标库位
     */
    private String distLocNo;
    private String locNo;
}
src/main/java/com/zy/core/model/protocol/LiftProtocol.java
@@ -28,7 +28,7 @@
    /**
     * 提升机锁定
     */
    private Short liftLock;
    private Boolean liftLock;
    /**
     * 位置到达反馈
@@ -161,4 +161,8 @@
     */
    private Short liftActualSpeed;
    public Short getLiftLockShortValue() {
        return liftLock ? (short) 1 : (short) 0;
    }
}
src/main/java/com/zy/core/thread/LiftThread.java
@@ -105,7 +105,7 @@
                //获取数据
                byte[] content = result.Content;
                //提升机锁定
                liftProtocol.setLiftLock(modbusTcpNet.getByteTransform().TransInt16(content,0));
                liftProtocol.setLiftLock(modbusTcpNet.getByteTransform().TransBool(content,0));
                //位置到达反馈
                liftProtocol.setPositionArrivalFeedback(modbusTcpNet.getByteTransform().TransInt16(content,2));
                //准备就绪
@@ -150,7 +150,7 @@
                ///读取提升机状态-end
                OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                log.info(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
//                log.info(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 根据实时信息更新数据库
                //.....
@@ -187,7 +187,7 @@
        //四层高度设定
        array[5] = command.getHeight4();
        //提升机锁定
        array[29] = command.getLiftLock();
        array[29] = command.getLiftLockShortValue();
        OperateResult result = modbusTcpNet.Write("0", array);;
        if (result != null && result.IsSuccess) {
@@ -229,7 +229,7 @@
        command.setHeight2((short) 100);
        command.setHeight3((short) 200);
        command.setHeight4((short) 303);
        command.setLiftLock((short) 1);
        command.setLiftLock(true);
        thread.write(command);
    }
src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -227,7 +227,7 @@
                basShuttle.setPakMk(shuttleProtocol.getPakMk());
                if (shuttleService.updateById(basShuttle)) {
                    OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                    log.info(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
//                    log.info(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                }
            }else {
@@ -348,7 +348,7 @@
        HashMap<String, Object> map = new HashMap<>();
        //计算路径
        List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getDistLocNo(), assignCommand.getTaskMode().intValue());
        List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), assignCommand.getTaskMode().intValue());
        if (calc != null) {
            //获取分段路径
            ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
@@ -380,8 +380,11 @@
    }
    //执行下发的指令
    private void executeWork(ShuttleAssignCommand assignCommand) {
    private boolean executeWork(ShuttleAssignCommand assignCommand) {
        //读取redis数据
        if (assignCommand == null) {
            return false;
        }
        Object o = redisUtil.get("wrk_no_" + assignCommand.getTaskNo());
        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
        //当前步序
@@ -458,6 +461,7 @@
        //下发命令
        if (!write(command)) {
            News.error("四向穿梭车命令下发失败,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
            return false;
        } else {
            News.info("四向穿梭车命令下发成功,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
@@ -483,7 +487,7 @@
                            new Date(),
                            ShuttleTaskModeType.get(assignCommand.getTaskMode()).desc,
                            assignCommand.getSourceLocNo(),
                            assignCommand.getDistLocNo(),
                            assignCommand.getLocNo(),
                            null,
                            null,
                            null,
@@ -501,6 +505,7 @@
            }
        }
        return true;
    }
    /******************************************************************************************/
src/main/resources/mapper/WrkMastMapper.xml
@@ -240,10 +240,13 @@
        select top 1 *
        from dbo.asr_wrk_mast
        where 1=1
        and wrk_sts in (4,8) and source_sta_no = #{sourceStaNo} and wrk_no=#{workNo} order by io_pri desc,wrk_sts desc
        and ((wrk_sts = 4 and shuttle_no is null) or (wrk_sts = 8 and shuttle_no is not null))
        and source_sta_no = #{sourceStaNo}
        and wrk_no=#{workNo}
        order by io_pri desc,wrk_sts desc
    </select>
    <select id="selectByWorkNo9" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts in (9)
    <select id="selectByWorkNo59" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo} and wrk_sts in (5,9)
    </select>
</mapper>