src/main/java/com/zy/asrs/controller/ShuttleController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/ServerBootstrap.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/LiftSlave.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/command/LiftCommand.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/LiftProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/LiftThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/ShuttleThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | 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>