src/main/java/com/zy/asrs/entity/BasCrnp.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/MainProcess.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/CrnProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensCrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/BasCrnpMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/entity/BasCrnp.java
@@ -58,6 +58,13 @@ private Integer wrkNo; /** * 工作号 */ @ApiModelProperty(value= "工作号") @TableField("wrk_no_two") private Integer wrkNoTwo; /** * 异常码 */ @ApiModelProperty(value= "异常码") @@ -236,6 +243,10 @@ this.wrkNo = wrkNo; } public void setWrkNoTwo(Integer wrkNoTwo) { this.wrkNoTwo = wrkNoTwo; } public Long getCrnErr() { return crnErr; } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1395,8 +1395,12 @@ case 2: this.crnStnToLoc1Single(crn, crnProtocol); // 入库 break; case 3: case 4: case 5: break; default: this.crnStnToLoc1(crn, crnProtocol); // 入库 this.crnStnToLoc1(crn, crnProtocol,1); // 入库 } crnProtocol.setLastIo("O"); } else if (basCrnp.getOutEnable().equals("Y")) { @@ -1405,8 +1409,12 @@ case 2: this.locToCrnStn1Single(crn, crnProtocol); // 出库 break; case 3: case 4: case 5: break; default: this.locToCrnStn1(crn, crnProtocol); // 出库 this.locToCrnStn1(crn, crnProtocol,1); // 出库 } crnProtocol.setLastIo("I"); } @@ -1419,8 +1427,12 @@ case 2: this.locToCrnStn1Single(crn, crnProtocol); // 出库 break; case 3: case 4: case 5: break; default: this.locToCrnStn1(crn, crnProtocol); // 出库 this.locToCrnStn1(crn, crnProtocol,1); // 出库 } crnProtocol.setLastIo("I"); } else if (basCrnp.getInEnable().equals("Y")) { @@ -1429,13 +1441,120 @@ case 2: this.crnStnToLoc1Single(crn, crnProtocol); // 入库 break; case 3: case 4: case 5: break; default: this.crnStnToLoc1(crn, crnProtocol); // 入库 this.crnStnToLoc1(crn, crnProtocol,1); // 入库 } crnProtocol.setLastIo("O"); } } } // 库位移转 this.locToLoc(crn, crnProtocol); // this.crnRebackHp(crnProtocol, crnThread); } }catch (Exception e){ log.error("堆垛机出入库下发报错"+e); } } /** * 入出库 ===>> 堆垛机入出库作业下发 */ public synchronized void crnIoExecuteTwo() { try{ for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); if (basCrnp == null) { log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); continue; } int[] sign = new int[]{0,0}; // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getModeType() == CrnModeType.AUTO) { // 只有当堆垛机工位空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { sign[0] = 1; sign[1] = 1; }else if (crnProtocol.getStatusTypeTwo() == CrnStatusType.IDLE && crnProtocol.getTaskNoTwo() == 0 && crnProtocol.getLoadedTwo() == 0 && crnProtocol.getForkPosTwo() == 0){ sign[0] = 1; sign[1] = 2; } } if (sign[0]==1){ // 如果最近一次是入库模式 if (crnProtocol.getLastIo().equals("I")) { if (basCrnp.getInEnable().equals("Y")) { switch (crn.getId()){ case 3: case 4: case 5: this.crnStnToLoc1(crn, crnProtocol, sign[1]); // 入库 break; default: break; } crnProtocol.setLastIo("O"); } else if (basCrnp.getOutEnable().equals("Y")) { switch (crn.getId()){ case 3: case 4: case 5: this.locToCrnStn1(crn, crnProtocol, sign[1]); // 出库 break; default: break; } crnProtocol.setLastIo("I"); } } // 如果最近一次是出库模式 else if (crnProtocol.getLastIo().equals("O")) { if (basCrnp.getOutEnable().equals("Y")) { switch (crn.getId()){ case 3: case 4: case 5: this.locToCrnStn1(crn, crnProtocol, sign[1]); // 出库 break; default: break; } crnProtocol.setLastIo("I"); } else if (basCrnp.getInEnable().equals("Y")) { switch (crn.getId()){ case 3: case 4: case 5: this.crnStnToLoc1(crn, crnProtocol, sign[1]); // 入库 break; default: break; } crnProtocol.setLastIo("O"); } } } // 库位移转 this.locToLoc(crn, crnProtocol); // this.crnRebackHp(crnProtocol, crnThread); @@ -1703,7 +1822,7 @@ * 入库 ===>> 堆垛机站到库位 * 2022-12-03 TQS修改,先遍历查询同台堆垛机工作档所有站点入库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序 */ public synchronized void crnStnToLoc1(CrnSlave slave, CrnProtocol crnProtocol) { public synchronized void crnStnToLoc1(CrnSlave slave, CrnProtocol crnProtocol, Integer crnStation) { List<WrkMast> wrkMasts = wrkMastMapper.selectPakInStep12(slave.getId()); for(WrkMast wrkMast : wrkMasts){ if (wrkMast == null) { @@ -1755,10 +1874,21 @@ continue; } // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { continue; //工位 if (crnStation == 1){ // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { break; } }else if(crnStation == 2){ // 堆垛机控制过滤 if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) { break; } }else { break; } // 已经存在吊车执行任务时,则过滤 if (wrkMastMapper.selectWorking(slave.getId()) != null) { @@ -1815,7 +1945,7 @@ crnCommand.setDestinationPosX(locMast.getRow1().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(locMast.getBay1().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(locMast.getLev1().shortValue()); // 目标库位层 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(crnStation==1? 2:5, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 2.设备上走 => 3.吊车入库中 @@ -1828,7 +1958,6 @@ } } } } /** @@ -2107,7 +2236,7 @@ * 出库 ===>> 库位到堆垛机站 * 2022-12-03 TQS修改,先遍历查询工作档所有站点出库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序 */ public synchronized void locToCrnStn1(CrnSlave slave, CrnProtocol crnProtocol) { public synchronized void locToCrnStn1(CrnSlave slave, CrnProtocol crnProtocol, Integer crnStation) { List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep12(slave.getId()); for (WrkMast wrkMast : wrkMasts) { if (wrkMast == null) { @@ -2171,9 +2300,21 @@ && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { // 命令下发区 -------------------------------------------------------------------------- // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { //工位 if (crnStation == 1){ // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { // continue; break; } }else if(crnStation == 2){ // 堆垛机控制过滤 if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) { // continue; break; } }else { break; } @@ -2239,7 +2380,7 @@ crnCommand.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(crnStation==1? 2:5, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 11.生成出库ID => 12.吊车出库中 src/main/java/com/zy/core/MainProcess.java
@@ -70,6 +70,8 @@ mainService.crnStnToOutStn(); // 入出库 ===>> 堆垛机入出库作业下发 mainService.crnIoExecute(); // 入出库 ===>> 堆垛机入出库作业下发 双工位堆垛机 mainService.crnIoExecuteTwo(); // 入出库增强 ===>> 堆垛机命令下发后,异步修改工作档状态 // mainService.crnIoWrkMast(); // 入库 ===>> 执行对工作档的完成操作 src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -33,11 +33,13 @@ * 异常码 */ public Short alarm; public Short alarmTwo; /** * 任务号 */ public Short taskNo = 0; public Short taskNoTwo = 0; /** * 堆垛机当前状态 @@ -53,11 +55,13 @@ * 99:报警 */ public Short status; public Short statusTwo; /** * 状态枚举 */ public CrnStatusType statusType; public CrnStatusType statusTypeTwo; /** * 堆垛机当前列号 @@ -76,8 +80,10 @@ * 2 = 货叉在右侧 */ public Short forkPos; public Short forkPosTwo; public CrnForkPosType forkPosType; public CrnForkPosType forkPosTypeTwo; /** * 当前载货台位置 @@ -85,8 +91,10 @@ * 1 = 上定位 */ public Short liftPos; public Short liftPosTwo; public CrnLiftPosType liftPosType; public CrnLiftPosType liftPosTypeTwo; /** * 走行在定位 @@ -99,6 +107,7 @@ * 载货台有物 */ public Short loaded; public Short loadedTwo; private Short temp1; @@ -207,6 +216,16 @@ this.forkPos = CrnForkPosType.get(type).id.shortValue(); } public void setForkPosTwo(Short forkPosTwo) { this.forkPosTwo = forkPosTwo; this.forkPosTypeTwo = CrnForkPosType.get(forkPosTwo); } public void setForkPosTwo(CrnForkPosType typeTwo) { this.forkPosTypeTwo = typeTwo; this.forkPosTwo = CrnForkPosType.get(typeTwo).id.shortValue(); } public void setLiftPos(Short liftPos) { this.liftPos = liftPos; this.liftPosType = CrnLiftPosType.get(liftPos); @@ -217,9 +236,24 @@ this.liftPos = CrnLiftPosType.get(type).id.shortValue(); } public void setLiftPosTwo(Short liftPosTwo) { this.liftPosTwo = liftPosTwo; this.liftPosTypeTwo = CrnLiftPosType.get(liftPosTwo); } public void setLiftPosTwo(CrnLiftPosType typeTwo) { this.liftPosTypeTwo = typeTwo; this.liftPosTwo = CrnLiftPosType.get(typeTwo).id.shortValue(); } public void setStatus(Short status){ this.status = status; this.statusType = CrnStatusType.get(status); } public void setStatusTwo(Short statusTwo){ this.statusTwo = statusTwo; this.statusTypeTwo = CrnStatusType.get(statusTwo); } public void setStatus(CrnStatusType type){ @@ -248,6 +282,7 @@ basCrnp.setCrnErr(alarm.longValue()); } basCrnp.setWrkNo(taskNo.intValue()); basCrnp.setWrkNoTwo(taskNoTwo.intValue()); return basCrnp; } src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -90,6 +90,28 @@ command.setDestinationPosZ((short)0); // 目标库位层 write(command); break; // 写入数据 case 5: write5((CrnCommand) task.getData()); break; // 复位 case 6: CrnCommand command2 = (CrnCommand) task.getData(); if (null == command2) { command2 = new CrnCommand(); } command2.setCrnNo(slave.getId()); // 堆垛机编号 command2.setTaskNo((short) 0); // 工作号 command2.setAckFinish((short) 1); // 任务完成确认位 command2.setTaskMode(CrnTaskModeType.NONE); // 任务模式 command2.setSourcePosX((short)0); // 源库位排 command2.setSourcePosY((short)0); // 源库位列 command2.setSourcePosZ((short)0); // 源库位层 command2.setDestinationPosX((short)0); // 目标库位排 command2.setDestinationPosY((short)0); // 目标库位列 command2.setDestinationPosZ((short)0); // 目标库位层 write5(command2); break; default: break; } @@ -181,6 +203,14 @@ crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52)); //工位2数据 无则无需例会 crnProtocol.setTaskNoTwo(siemensNet.getByteTransform().TransInt16(result.Content, 56)); crnProtocol.setStatusTwo(siemensNet.getByteTransform().TransInt16(result.Content, 56)); crnProtocol.setForkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 58)); crnProtocol.setLiftPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 60)); crnProtocol.setLoadedTwo(siemensNet.getByteTransform().TransInt16(result.Content, 64)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 复位信号 @@ -299,6 +329,74 @@ } } /** * 写入数据 工位2 */ private boolean write5(CrnCommand command) throws InterruptedException { if (null == command) { log.error("堆垛机写入命令为空"); return false; } // convertRow(command); command.setCrnNo(slave.getId()); short[] array = new short[9]; // array[0] = command.getAckFinish(); array[0] = command.getTaskNo(); array[1] = command.getTaskMode(); array[2] = command.getSourcePosX(); array[3] = command.getSourcePosY(); array[4] = command.getSourcePosZ(); array[5] = command.getDestinationPosX(); array[6] = command.getDestinationPosY(); array[7] = command.getDestinationPosZ(); // array[9] = command.getSourceStaNo(); // array[10] = command.getDestinationStaNo(); array[9] = command.getCommand(); OperateResult result = siemensNet.Write("DB100.0", command.getAckFinish()); OperateResult result2 = siemensNet.Write("DB100.20", array); if (command.getAckFinish() == 0) { short commandFinish = 1; Thread.sleep(100L); result = siemensNet.Write("DB100.38", commandFinish); } try { // 日志记录 BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class); BasCrnOpt basCrnOpt = new BasCrnOpt( command.getTaskNo().intValue(), // 任务号 command.getCrnNo(), // 堆垛机[非空] new Date(), // 下发时间 command.getTaskModeType().toString(), // 模式 command.getSourcePosX().intValue(), // 源排 command.getSourcePosY().intValue(), // 源列 command.getSourcePosZ().intValue(), // 源层 null, // 源站 command.getDestinationPosX().intValue(), // 目标排 command.getDestinationPosY().intValue(), // 目标列 command.getDestinationPosZ().intValue(), // 目标层 null, // 目标站 null, // 响应结果 null, // 修改时间 null // 修改人员 ); bean.insert(basCrnOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } @Override public void close() { src/main/resources/mapper/BasCrnpMapper.xml
@@ -9,6 +9,7 @@ <result column="out_enable" property="outEnable" /> <result column="crn_sts" property="crnSts" /> <result column="wrk_no" property="wrkNo" /> <result column="wrk_no_two" property="wrkNoTwo" /> <result column="crn_err" property="crnErr" /> <result column="frm_locno" property="frmLocno" /> <result column="frm_sta" property="frmSta" />