| src/main/java/com/zy/asrs/entity/BasCrnp.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/WrkMastService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/utils/Utils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/CrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/enums/CrnTaskModeType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/thread/SiemensCrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/webapp/views/crn.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/entity/BasCrnp.java
@@ -44,6 +44,13 @@ private String outEnable; /** * 回原点 */ @ApiModelProperty(value= "回原点") @TableField("move_origin") private String moveOrigin; /** * 状态 */ @ApiModelProperty(value= "状态") @@ -150,9 +157,10 @@ public BasCrnp() {} public BasCrnp(String inEnable,String outEnable,Integer crnSts,Integer wrkNo,Long crnErr,String frmLocno,Integer frmSta,Integer toSta,String toLocno,Long appeUser,Date appeTime,Long modiUser,Date modiTime,String hpMk,String retrieveMk,String ctlHp,String ctlRest,String empIn,Integer tankQty,Integer tankQty1) { public BasCrnp(String inEnable,String outEnable,String moveOrigin,Integer crnSts,Integer wrkNo,Long crnErr,String frmLocno,Integer frmSta,Integer toSta,String toLocno,Long appeUser,Date appeTime,Long modiUser,Date modiTime,String hpMk,String retrieveMk,String ctlHp,String ctlRest,String empIn,Integer tankQty,Integer tankQty1) { this.inEnable = inEnable; this.outEnable = outEnable; this.moveOrigin = moveOrigin; this.crnSts = crnSts; this.wrkNo = wrkNo; this.crnErr = crnErr; @@ -220,6 +228,12 @@ this.outEnable = outEnable; } public String getMoveOrigin() { return moveOrigin; } public void setMoveOrigin(String moveOrigin) { this.moveOrigin = moveOrigin; } public Integer getCrnSts() { return crnSts; } src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -108,5 +108,9 @@ WrkMast selectPakoutEmpty(@Param("staNo")Integer outSite); WrkMast wrkCrnMoveOutXY(@Param("crnNo")Integer crnNo); WrkMast wrkCrnMoveOutXYing(@Param("crnNo")Integer crnNo); WrkMast wrkCrnMoveOutXYingOther(@Param("crnNo")Integer crnNo); } src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -15,4 +15,6 @@ int getOutToStn182(Integer devpNo); WrkMast wrkCrnMoveOutXY(Integer crnNo); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -87,6 +87,8 @@ private BasErrLogService basErrLogService; @Autowired private BasCrnErrorMapper basCrnErrorMapper; @Autowired private WrkMastService wrkMastService; @Value("${wms.url}") private String wmsUrl; @@ -600,21 +602,21 @@ if (crnProtocol.getLastIo().equals("I")) { if (basCrnp.getInEnable().equals("Y")) { //mark - 1 - .... this.crnStnToLoc(crn, crnProtocol,mark); // 入库 this.crnStnToLoc(crn, crnThread,mark); // 入库 crnProtocol.setLastIo("O"); } else if (basCrnp.getOutEnable().equals("Y")) { //mark - 2 - .... this.locToCrnStn(crn, crnProtocol,mark); // 出库 this.locToCrnStn(crn, crnThread,mark); // 出库 crnProtocol.setLastIo("I"); } } // 如果最近一次是出库模式 else if (crnProtocol.getLastIo().equals("O")) { if (basCrnp.getOutEnable().equals("Y")) { this.locToCrnStn(crn, crnProtocol,mark); // 出库 this.locToCrnStn(crn, crnThread,mark); // 出库 crnProtocol.setLastIo("I"); } else if (basCrnp.getInEnable().equals("Y")) { this.crnStnToLoc(crn, crnProtocol,mark); // 入库 this.crnStnToLoc(crn, crnThread,mark); // 入库 crnProtocol.setLastIo("O"); } } @@ -622,10 +624,101 @@ // 库位移转 //mark - 3 - .... this.locToLoc(crn, crnProtocol,mark); if (!Cools.isEmpty(basCrnp.getMoveOrigin()) && basCrnp.getMoveOrigin().equals("Y")){ if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && crnThread.isCmdFlag()) { this.crnMoveIntXY(crn, crnProtocol, crnThread); this.crnMoveOutXY(crn, crnProtocol, crnThread); } } // this.crnRebackHp(crnProtocol, crnThread); } News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); } /** * 堆垛机xy移动 */ public synchronized void crnMoveIntXY(CrnSlave crn,CrnProtocol crnProtocol, CrnThread crnThread) { // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && !crnProtocol.getBay().equals((short)1) && crnThread.isCmdFlag()) { List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().ne("io_type", 1).and().ne("wrk_sts", 40L).and().ne("io_type",10)); if (Cools.isEmpty(wrkMasts) || wrkMasts.size()==0){ // 堆垛机入库 命令下发区 -------------------------------------------------------------------------- CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(crn.getId()); // 堆垛机编号 crnCommand.setTaskNo((short)9999); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 回原点 crnCommand.setSourcePosX((short)1); // 源库位排 crnCommand.setSourcePosY((short)1); // 源库位列 crnCommand.setSourcePosZ((short)1); // 源库位层 crnCommand.setDestinationPosX((short)1); // 目标库位排 crnCommand.setDestinationPosY((short)1); // 目标库位列 crnCommand.setDestinationPosZ((short)1); // 目标库位层 if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) { News.error("堆垛机命令下发失败,堆垛机号={},任务数据={} ,任务类型:回原点", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand)); } else { crnThread.setCmdFlag(false); } } } } /** * 堆垛机xy移动 */ public synchronized void crnMoveOutXY(CrnSlave crn,CrnProtocol crnProtocol, CrnThread crnThread) { // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && crnThread.isCmdFlag()) { List<WrkMast> wrkMastsM = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 1).and().ne("wrk_sts", 20L)); List<WrkMast> wrkMastsK = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 10).and().ne("wrk_sts", 20L)); if ((Cools.isEmpty(wrkMastsM) || wrkMastsM.size()==0) && (Cools.isEmpty(wrkMastsK) || wrkMastsK.size()==0)){ WrkMast wrkMast = wrkMastService.wrkCrnMoveOutXY(crnProtocol.getCrnNo()); if (Cools.isEmpty(wrkMast)){ return; } short locRow = 1; short locBay = 1; short locLev = 1; if (wrkMast.getIoType().equals(111)) { //库位移转-入库,获取工作档目标库位的排列层 String locNo = wrkMast.getLocNo(); locBay = (short) Utils.getBay(locNo); locLev = (short) Utils.getLev(locNo); }else if ( wrkMast.getIoType().equals(101) || wrkMast.getIoType().equals(110) || wrkMast.getIoType().equals(11)){ //出库,获取工作档源库位的排列层 String sourceLocNo = wrkMast.getSourceLocNo(); locBay = (short) Utils.getBay(sourceLocNo); locLev = (short) Utils.getLev(sourceLocNo); } if (crnProtocol.getBay().equals(locBay)){ return; } // 堆垛机入库 命令下发区 -------------------------------------------------------------------------- CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(crn.getId()); // 堆垛机编号 crnCommand.setTaskNo((short)9999); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.XY_MOVE); // 任务模式: 站位转移 crnCommand.setSourcePosX(locRow); // 源库位排 crnCommand.setSourcePosY(locBay); // 源库位列 crnCommand.setSourcePosZ(locLev); // 源库位层 crnCommand.setDestinationPosX(locRow); // 目标库位排 crnCommand.setDestinationPosY(locBay); // 目标库位列 crnCommand.setDestinationPosZ(locLev); // 目标库位层 if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) { News.error("堆垛机命令下发失败,堆垛机号={},任务数据={} ,任务类型:回原点", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand)); return;//continue } else { crnThread.setCmdFlag(false); } } } } /** @@ -687,7 +780,12 @@ /** * 入库 ===>> 堆垛机站到库位 */ public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { public synchronized void crnStnToLoc(CrnSlave slave, CrnThread crnThread,Integer mark) { CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { return; } // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && crnThread.isCmdFlag()) { News.warnNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发:执行入库"); for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { boolean flag = false; @@ -833,12 +931,18 @@ } News.infoNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发 : 入库执行完毕"); } } /** * 出库 ===>> 库位到堆垛机站 * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 */ public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { public synchronized void locToCrnStn(CrnSlave slave, CrnThread crnThread,Integer mark) { CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { return; } // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && crnThread.isCmdFlag()) { News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库"); for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { // 获取工作状态为11(生成出库ID)的出库工作档 @@ -984,6 +1088,7 @@ } News.infoNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发 : 出库执行完毕"); } } // /** // * 出库 ===>> 库位到堆垛机站 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.core.common.Cools; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.service.WrkMastService; @@ -31,4 +32,16 @@ public int getOutToStn182(Integer devpNo) { return selectCount(new EntityWrapper<WrkMast>().eq("sta_no", devpNo).in("wrk_sts",11,12)); } @Override public WrkMast wrkCrnMoveOutXY(Integer crnNo) { WrkMast wrkMast = this.baseMapper.wrkCrnMoveOutXYing(crnNo); if (!Cools.isEmpty(wrkMast)){ return wrkMast; } WrkMast wrkMast1 = this.baseMapper.wrkCrnMoveOutXYingOther(crnNo); if (!Cools.isEmpty(wrkMast1)){ return null; } return this.baseMapper.wrkCrnMoveOutXY(crnNo); } } src/main/java/com/zy/asrs/utils/Utils.java
@@ -149,6 +149,26 @@ } /** * 通过库位号获取 列 */ public static int getBay(String locNo) { if (!Cools.isEmpty(locNo)) { return Integer.parseInt(locNo.substring(2, 5)); } throw new RuntimeException("库位解析异常"); } /** * 通过库位号获取 层 */ public static int getLev(String locNo) { if (!Cools.isEmpty(locNo)) { return Integer.parseInt(locNo.substring(5, 7)); } throw new RuntimeException("库位解析异常"); } /** * 当检索到双深库位的浅库位时,如果深库位无货,则放入对应的深库位 */ public static void toDeepIfEmptyByShallow(String shallowLoc) { src/main/java/com/zy/core/CrnThread.java
@@ -14,4 +14,16 @@ * 堆垛机是否在回原点运动中标记 */ boolean isBackHpFlag(); /** * 设置堆垛机是否允许下发命令标记 * @param flag */ void setCmdFlag(boolean flag); /** * 堆垛机当前是否允许下发命令标记 * @return */ boolean isCmdFlag(); } src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -6,11 +6,11 @@ PAKIN(1), // 入库 PAKOUT(2), // 出库 LOC_MOVE(3), // 库位移转 X_MOVE(4), // 站位移转 Y_MOVE(5), // 站位移转 XY_MOVE(6), // 站位移转 GO_ORIGIN(7), // 回原点 BACK_ORIGIN(8), // 回反原点 X_MOVE(6), // 站位移转 Y_MOVE(7), // 站位移转 XY_MOVE(8), // 站位移转 GO_ORIGIN(4), // 回原点 BACK_ORIGIN(5), // 回反原点 CLEAR(9), // 清错 ; src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -41,6 +41,15 @@ private boolean resetFlag = false; /** * 20230711 Add,判断是否允许下发堆垛机任务的命令标记,默认为true * 为了防止时间差导致的WCS连续下发多笔任务,WCS下发任务后,主线程轮询时还未读到堆垛机非空闲、有任务状态时,可能会重复下发 * 主线程下发堆垛机任务的同时,cmdFlag置为false,当堆垛机处于等待确认状态并且resetFlag为true时,才复位cmdFlag为true * 所有堆垛机任务下发前,先判断cmdFlag为true后才能下发 * 改动前,是通过判断工作档是否存在堆垛机执行中工作状态判断的,如果不生成工作档,或者是有充电、移车等任务漏判断了也会存在问题 */ private boolean cmdFlag = true; /** * 堆垛机是否在回原点运动中标记 */ private boolean backHpFlag = false; src/main/resources/mapper/WrkMastMapper.xml
@@ -185,4 +185,28 @@ <select id="selectPakoutEmpty" resultMap="BaseResultMap"> select top 1 * from dbo.asr_wrk_mast where io_type = 110 and sta_no = #{staNo} order by io_time,wrk_no </select> <select id="wrkCrnMoveOutXY" resultMap="BaseResultMap"> select top 1 * from dbo.asr_wrk_mast where wrk_sts in (21) and io_type>100 and io_type != 111 and ste_no is not null and crn_no = #{crnNo} order by io_pri desc,io_time,wrk_no asc </select> <select id="wrkCrnMoveOutXYing" resultMap="BaseResultMap"> select top 1 * from dbo.asr_wrk_mast where wrk_sts in (26) and io_type>100 and io_type != 111 and ste_no is not null and crn_no = #{crnNo} order by io_pri desc,io_time,wrk_no asc </select> <select id="wrkCrnMoveOutXYingOther" resultMap="BaseResultMap"> select top 1 * from dbo.asr_wrk_mast where wrk_sts in (22,23,24,25,27,28) and io_type>100 and io_type != 111 and crn_no = #{crnNo} order by io_pri desc,io_time,wrk_no asc </select> </mapper> src/main/webapp/views/crn.html
@@ -100,6 +100,7 @@ <th>走行在定位</th> <th>故障代码</th> <th>故障描述</th> <th>任务允许下发标记</th> </tr> </thead> <tbody> @@ -320,6 +321,7 @@ setVal(tr.children("td").eq(8), table[i-1].walkPos); setVal(tr.children("td").eq(9), table[i-1].warnCode); setVal(tr.children("td").eq(10), table[i-1].alarm); setVal(tr.children("td").eq(11), table[i-1].cmdFlag); } } else if (res.code === 403){ window.location.href = baseUrl+"/login"; @@ -527,6 +529,7 @@ " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " <td></td>\n" + " </tr>\n"; } $('#crn-state-table tbody').after(html);