自动化立体仓库 - WCS系统
Junjie
2023-06-29 0c9b8fe24e495da1f5e3362fa6b36acc41617cb7
优化寻车,出库问题
12个文件已修改
88 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LiftController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ShuttleTaskModeType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ShuttleThread.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/lift.html 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LiftController.java
@@ -121,6 +121,7 @@
            vo.setLineEndHasStock(liftProtocol.getLineEndHasStock());
            vo.setInConveyLineCardTrayAlarm(liftProtocol.getInConveyLineCardTrayAlarm());
            vo.setOutConveyLineCardTrayAlarm(liftProtocol.getOutConveyLineCardTrayAlarm());
            vo.setShuttleNo(liftProtocol.getShuttleNo().intValue());
        }
        return R.ok().add(list);
    }
src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java
@@ -56,6 +56,11 @@
     */
    private Boolean outConveyLineCardTrayAlarm;
    /**
     * 穿梭车号
     */
    private Integer shuttleNo;
    public String getLineFrontHasStock$() {
        if (this.lineFrontHasStock == null) {
            return "N";
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -1,6 +1,7 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@@ -105,4 +106,7 @@
    WrkMast selectByWorkNo372428(Integer workNo);
    List<WrkMast> selectBy2125();
    //查询指定楼层待分配车辆的任务
    List<LocMast> selectNoShuttleWrkByLev(String lev);
}
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import java.util.List;
@@ -13,4 +14,7 @@
    List<WrkMast> selectToBeHistoryData();
    //查询指定楼层待分配车辆的任务
    List<LocMast> selectNoShuttleWrkByLev(Integer lev);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -53,6 +53,8 @@
    @Autowired
    private WrkMastMapper wrkMastMapper;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private LocMastService locMastService;
@@ -1100,7 +1102,7 @@
                            if (wrkMastMapper.updateById(wrkMast) > 0) {
                                //下发任务
                                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
//                                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
                            }
                        }else {
                            //不同层,将目标库位分配成提升机库位号(将小车移动到提升机位置)
@@ -1278,16 +1280,23 @@
            //同一楼层,没有空闲穿梭车,只能从其他楼层调度
            //寻找离任务最近的穿梭车
            for (ShuttleThread shuttleThread : diffLev) {
                if (recentShuttle == null) {//最近穿梭车为空,则默认赋予为最近穿梭车
                    recentShuttle = shuttleThread;
                }
                //当前穿梭车库位号
                String currentLocNo = shuttleThread.getShuttleProtocol().getCurrentLocNo();
                int currentLev = Utils.getLev(currentLocNo);
                List<LocMast> locMasts = wrkMastService.selectNoShuttleWrkByLev(currentLev);//判断当前穿梭车楼层是否有待分配车辆的任务,如果有则不分配这辆车
                if (locMasts.size() > 0) {
                    //存在其他任务,跳过这辆车
                    continue;
                }
                if (recentShuttle == null) {//最近穿梭车为空,则默认赋予为最近穿梭车
                    recentShuttle = shuttleThread;
                }
                //目前最近穿梭车库位号
                String recentLocNo = recentShuttle.getShuttleProtocol().getCurrentLocNo();
                int recentLev = Utils.getLev(recentLocNo);
                //当前最近四向穿梭车到当前车子所在楼层的提升机口距离
                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), recentLev));//搜索空闲穿梭车,使用正常通道地图
@@ -1330,6 +1339,8 @@
            ) {
                //标记复位
                shuttleProtocol.setPakMk(true);
                ShuttleAssignCommand assignCommand = shuttleProtocol.getAssignCommand();
                //将任务档标记为完成
                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue());
@@ -1383,6 +1394,23 @@
                    } else {
                        News.error("四向穿梭车已确认且任务完成状态,复位失败,但未找到工作档。四向穿梭车号={},工作号={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
                    }
                }
                if (assignCommand != null) {
                    if (assignCommand.getTaskMode().intValue() == ShuttleTaskModeType.AVOID.id) {
                        //避让任务
                        //设置四向穿梭车为空闲状态
                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                        //任务号清零
                        shuttleProtocol.setTaskNo((short) 0);
                        //源库位清零
                        shuttleProtocol.setSourceLocNo(null);
                        //目标库位清零
                        shuttleProtocol.setLocNo(null);
                        //任务指令清零
                        shuttleProtocol.setAssignCommand(null);
                        News.info("四向穿梭车避让任务已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo());
                    }
                }
@@ -1744,6 +1772,8 @@
                                throw new CoolException("更新plc站点信息失败");
                            }
                            wrkMast.setWrkSts(4L);
                            //任务号清零
                            liftProtocol.setTaskNo((short) 0);
                            break;
                        case 7://7.提升机迁移小车中 ==> 8.提升机迁移小车完成
                            if (liftProtocol.getLev().intValue() != lev) {
@@ -1763,6 +1793,8 @@
                            }
                            wrkMast.setWrkSts(29L);
                            wrkMast.setWrkSts(34L);//34.出库完成,暂时先直接完成出库工作档,后续需要根据输送线给出的状态来确定34.出库完成状态
                            //任务号清零
                            liftProtocol.setTaskNo((short) 0);
                            break;
                        default:
                    }
@@ -1772,8 +1804,6 @@
                        liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                        //任务指令清零
                        liftProtocol.setAssignCommand(null);
                        //任务号清零
                        liftProtocol.setTaskNo((short) 0);
                        News.info("提升机已确认且任务完成状态。提升机号={}", liftProtocol.getLiftNo());
                    } else {
                        News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.WrkMastService;
@@ -27,4 +28,8 @@
        return this.baseMapper.selectToBeHistoryData();
    }
    @Override
    public List<LocMast> selectNoShuttleWrkByLev(Integer lev) {
        return this.baseMapper.selectNoShuttleWrkByLev("%" + lev);
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -582,7 +582,7 @@
            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//四向穿梭车号
            assignCommand.setTaskNo((short) commonService.getWorkNo(7));//任务号
            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id.shortValue());//移动到目标库位
            assignCommand.setTaskMode(ShuttleTaskModeType.AVOID.id.shortValue());//避让任务
            assignCommand.setSourceLocNo(startLocNo);//源库位
            //分配目标库位
src/main/java/com/zy/core/enums/ShuttleTaskModeType.java
@@ -19,6 +19,7 @@
    MOVE_LOC_NO(14, "移动到目标库位"),
    CHARGE(15, "充电"),
    MOVE_LIFT(16, "移动到提升机"),
    AVOID(17, "避让任务"),
    ;
    public Integer id;
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
@@ -251,7 +251,7 @@
                if (chargeLine == null) {
                    return false;
                }
                return this.getBatteryPower$() > chargeLine;
                return this.getBatteryPower$() >= chargeLine;
            } catch (Exception e) {
                News.error("fail", e);
                return false;
src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -804,6 +804,10 @@
            }
        }
        if (commands.size() == 0) {
            return false;
        }
        //取出命令
        ShuttleCommand command = commands.get(commandStep);
@@ -1069,8 +1073,13 @@
    }
    private boolean executeLift(LiftThread liftThread, LiftProtocol liftProtocol, ShuttleRedisCommand redisCommand, Integer shuttleLocNoLev) {//调度提升机
        if (liftProtocol.getRunning()) {
            //提升机运行中,禁止下发
        if (!liftProtocol.isIdle()) {
            //提升机不空闲禁止下发
            return false;
        }
        if (liftProtocol.getPlatShuttleCheck()) {
            //提升机内有车禁止下发
            return false;
        }
src/main/resources/mapper/WrkMastMapper.xml
@@ -272,4 +272,11 @@
        where wrk_sts in (21,25)
        order by io_pri desc,wrk_sts desc
    </select>
    <select id="selectNoShuttleWrkByLev" resultMap="BaseResultMap">
        select * from dbo.asr_wrk_mast
        where shuttle_no is null
        and (wrk_sts = 2 and loc_no like #{lev}) or (wrk_sts = 21 and source_loc_no like #{lev})
        order by io_pri desc,wrk_sts desc
    </select>
</mapper>
src/main/webapp/views/lift.html
@@ -65,6 +65,7 @@
                    <th>进输送线卡托盘报警</th>
                    <th>出输送线卡托盘报警</th>
                    <th>作业标记</th>
                    <th>穿梭车号</th>
                </tr>
                </thead>
                <tbody>
@@ -369,6 +370,7 @@
                        setVal(tr.children("td").eq(7), table[i-1].inConveyLineCardTrayAlarm$);
                        setVal(tr.children("td").eq(8), table[i-1].outConveyLineCardTrayAlarm$);
                        setVal(tr.children("td").eq(9), table[i-1].pakMk);
                        setVal(tr.children("td").eq(10), table[i-1].shuttleNo);
                    }
                } else if (res.code === 403){
                    window.location.href = baseUrl+"/login";