src/main/java/com/zy/controller/CrnController.java
@@ -249,7 +249,7 @@ command.setDestinationPosY(param.getBay()); // 目标库位列 command.setDestinationPosZ(param.getLev()); // 目标库位层 boolean locSts = isLocSts(param.getRow().toString(), param.getBay().toString(), param.getLev().toString()); command.setTraySize(locSts); // command.setTraySize(locSts); return crnControl(command)?R.ok():R.error(); } @@ -268,7 +268,7 @@ command.setDestinationPosY(param.getBay()); // 目标库位列 command.setDestinationPosZ(param.getLev()); // 目标库位层 boolean locSts = isLocSts(param.getSourceRow().toString(), param.getSourceBay().toString(), param.getSourceLev().toString()); command.setTraySize(locSts); // command.setTraySize(locSts); return crnControl(command)?R.ok():R.error(); } @@ -293,7 +293,7 @@ if (sourceLoc.getLocType1() != loc.getLocType1()){ return R.error("库位类型不一致"); } command.setTraySize(loc.getLocType1() == 2); // command.setTraySize(loc.getLocType1() == 2); // VersionUtils.locMoveCheckLocType(sourceLoc, loc); return crnControl(command)?R.ok():R.error(); } src/main/java/com/zy/core/MainProcess.java
@@ -75,6 +75,9 @@ // 堆垛机回原点 mainService.originGo(); // rgv搬运 mainService.rgvCarry(); } catch (Exception e) { e.printStackTrace(); } src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -7,7 +7,7 @@ PAKOUT(2), // 出库 LOC_MOVE(3), // 库位移转 X_MOVE(4), // 站位移转 Y_MOVE(5), // 站位移转 RESET(5), // 复位 XY_MOVE(6), // 站位移转 GO_ORIGIN(7), // 回原点 BACK_ORIGIN(8), // 回反原点 src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -6,11 +6,11 @@ IDLE(0, "空闲"), WORKING(1, "作业中"), SOS(2, "报警"), WORKING1(3, "作业中"), FETCHING(11, "取货中"), PUTTING(12, "放货中"), WAITING(90, "任务完成等待WCS确认"), FETCHWAITING(91, "取货任务完成等待WCS确认"), // WORKING1(3, "作业中"), // FETCHING(11, "取货中"), // PUTTING(12, "放货中"), // WAITING(90, "任务完成等待WCS确认"), // FETCHWAITING(91, "取货任务完成等待WCS确认"), ; public Integer id; src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -28,7 +28,7 @@ * 0 = 无 * 1 = 取货 * 2 = 放货 * 3 = 取放货 * 3 = 取放货 固定为3.取放货 */ private Short taskMode1 = 0; src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -187,6 +187,11 @@ */ public Float yDuration; // /** // * 任务接收 // */ // public Short taskReceive; public void setMode(Short mode) { this.mode = mode; this.modeType = CrnModeType.get(mode); src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -39,6 +39,16 @@ public RgvStatusType statusType; /** * 起点 */ public Short startSta; /** * 终点 */ public Short endSta; /** * 工位1任务号 */ public Short taskNo1 = 0; @@ -65,7 +75,7 @@ /** * RGV当前位置 */ public Short RgvPos; public Integer RgvPos; /** * 走行在定位 src/main/java/com/zy/core/thread/RgvThread.java
@@ -7,21 +7,19 @@ import com.alibaba.fastjson.JSON; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.entity.BasRgv; import com.zy.entity.BasRgvOpt; import com.zy.service.BasRgvOptService; import com.zy.service.BasRgvService; import com.zy.utils.News; import com.zy.core.RgvThread2; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.RgvStatusType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import com.zy.entity.BasRgv; import com.zy.entity.BasRgvOpt; import com.zy.service.BasRgvOptService; import com.zy.service.BasRgvService; import com.zy.utils.News; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -72,52 +70,52 @@ readStatus(); break; // // 工位1、2写入数据 // case 2: // write((RgvCommand) task.getData()); // break; //工位1写入数据 case 4: write1((RgvCommand) task.getData()); case 2: write((RgvCommand) task.getData()); break; //工位1写入数据 // case 4: // write1((RgvCommand) task.getData()); // break; // //工位2写入数据 // case 5: // write2((RgvCommand) task.getData()); // break; // 复位 case 3: RgvCommand command = (RgvCommand) task.getData(); if (null == command) { command = new RgvCommand(); } command.setRgvNo(slave.getId()); // RGV编号 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short)0); // 源站 command.setDestinationStaNo1((short)0); // 目标站 command.setCommand((short)0); write1(command); break; // 回原点 避让 case 9: RgvCommand commandAvoidanceXY = (RgvCommand) task.getData(); if (null == commandAvoidanceXY) { commandAvoidanceXY = new RgvCommand(); } commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号 commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式 commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo1((short)0); // 目标站 // commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 // commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 // commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式 // commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 // commandAvoidanceXY.setDestinationStaNo2((short)0); // 目标站 commandAvoidanceXY.setCommand((short)0); write(commandAvoidanceXY); break; // case 3: // RgvCommand command = (RgvCommand) task.getData(); // if (null == command) { // command = new RgvCommand(); // } // command.setRgvNo(slave.getId()); // RGV编号 // command.setTaskNo1((short) 0); // 工作号 // command.setAckFinish1((short) 1); // 任务完成确认位 // command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 // command.setSourceStaNo1((short)0); // 源站 // command.setDestinationStaNo1((short)0); // 目标站 // command.setCommand((short)0); // write1(command); // break; // // 回原点 避让 // case 9: // RgvCommand commandAvoidanceXY = (RgvCommand) task.getData(); // if (null == commandAvoidanceXY) { // commandAvoidanceXY = new RgvCommand(); // } // commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 // commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号 // commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 // commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式 // commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 // commandAvoidanceXY.setDestinationStaNo1((short)0); // 目标站 //// commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 //// commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 //// commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式 //// commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 //// commandAvoidanceXY.setDestinationStaNo2((short)0); // 目标站 // commandAvoidanceXY.setCommand((short)0); // write(commandAvoidanceXY); // break; default: break; } @@ -135,21 +133,25 @@ private void initRgv() { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(slave.getId()); } rgvProtocol.setMode((short) -1); rgvProtocol.setStatus((short)-1); rgvProtocol.setTaskNo1((short)0); rgvProtocol.setStatus1((short)-1); rgvProtocol.setLoaded1((short)0); rgvProtocol.setWalkPos((short)0); rgvProtocol.setRgvPos((short)0); rgvProtocol.setRgvPos(0); rgvProtocol.setStartSta((short)0); rgvProtocol.setEndSta((short)0); rgvProtocol.setTaskNo1((short)0); rgvProtocol.setAlarm((short)0); rgvProtocol.setStatus((short)-1); // rgvProtocol.setStatus1((short)-1); // rgvProtocol.setWalkPos((short)0); // rgvProtocol.setTaskNo2((short)0); // rgvProtocol.setStatus2((short)-1); // rgvProtocol.setLoaded2((short)0); rgvProtocol.setAlarm((short)0); rgvProtocol.setxSpeed((short) 0); rgvProtocol.setxDistance((short) 0); rgvProtocol.setxDuration((short) 0); // rgvProtocol.setxSpeed((short) 0); // rgvProtocol.setxDistance((short) 0); // rgvProtocol.setxDuration((short) 0); } @Override @@ -177,26 +179,29 @@ */ private void readStatus(){ try { OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30); OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 22); if (result.IsSuccess) { if (null == rgvProtocol || rgvProtocol.getRgvNo() == null) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(slave.getId()); } rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4)); rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6)); rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8)); rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10)); rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14)); rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 4)); rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 6)); rgvProtocol.setStartSta(siemensNet.getByteTransform().TransInt16(result.Content, 10)); rgvProtocol.setEndSta(siemensNet.getByteTransform().TransInt16(result.Content, 12)); rgvProtocol.setTaskNo1((short) siemensNet.getByteTransform().TransInt32(result.Content, 14)); rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18)); rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 20)); // rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6)); // rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); // rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16)); rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18)); // rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18)); // rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20)); rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22)); // rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22)); // rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24)); rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26)); // rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26)); // rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28)); // rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30)); // rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32)); @@ -207,16 +212,16 @@ OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId())); // 工位1复位信号 if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING) || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) { if (resetFlag1) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setAckFinish1((short)1); if (write(rgvCommand)) { resetFlag1 = false; } } } // if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING) // || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) { // if (resetFlag1) { // RgvCommand rgvCommand = new RgvCommand(); // rgvCommand.setAckFinish1((short)1); // if (write(rgvCommand)) { // resetFlag1 = false; // } // } // } // 工位2复位信号 // if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING) @@ -266,12 +271,18 @@ } // convertRow(command); command.setRgvNo(slave.getId()); short[] array = new short[11]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); short[] array = new short[3]; array[0] = command.getSourceStaNo1(); array[1] = command.getDestinationStaNo1(); array[2] = command.getTaskMode1(); array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); OperateResult result1 = siemensNet.Write("DB100.0", array); OperateResult result2 = siemensNet.Write("DB100.6", command.getTaskNo1().intValue()); Thread.sleep(100); OperateResult result3 = siemensNet.Write("DB100.10", command.getCommand()); // array[0] = command.getAckFinish1(); // array[1] = command.getTaskNo1(); // array[2] = command.getTaskMode1(); @@ -283,7 +294,7 @@ // array[8] = command.getSourceStaNo2(); // array[9] = command.getDestinationStaNo2(); // array[10] = command.getCommand(); OperateResult result = siemensNet.Write("DB100.0", array); // if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) { // short commandFinish = 3; //工位1、2任务同时写入 @@ -311,7 +322,7 @@ bean.insert(basRgvOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { if (result1 != null && result1.IsSuccess && result2 != null && result2.IsSuccess && result3 != null && result3.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); @@ -557,7 +568,7 @@ public static void main(String[] args) throws InterruptedException { RgvSlave slave = new RgvSlave(); slave.setId(1); slave.setIp("192.168.6.9"); slave.setIp("10.10.10.53"); slave.setRack(0); slave.setSlot(0); RgvThread rgvThread = new RgvThread(slave); @@ -565,6 +576,14 @@ rgvThread.readStatus(); System.out.println(JSON.toJSONString(rgvThread.rgvProtocol)); Thread.sleep(3000L); RgvCommand command = new RgvCommand(); command.setRgvNo(1); command.setSourceStaNo1((short)1120); command.setDestinationStaNo1((short)1101); command.setTaskNo1((short)1); command.setTaskMode1((short)3); command.setCommand((short)1); rgvThread.write(command); } src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -5,22 +5,22 @@ import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.core.CrnThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.CrnTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.CrnSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.entity.BasCrnOpt; import com.zy.entity.BasCrnp; import com.zy.service.BasCrnOptService; import com.zy.service.BasCrnpService; import com.zy.utils.News; import com.zy.core.CrnThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.*; import com.zy.core.model.CrnSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -80,15 +80,16 @@ command = new CrnCommand(); } command.setCrnNo(slave.getId()); // 堆垛机编号 command.setTaskNo((short) 0); // 工作号 command.setTaskNo((short)0); // 工作号 command.setAckFinish((short) 1); // 任务完成确认位 command.setTaskMode(CrnTaskModeType.NONE); // 任务模式 command.setTaskMode(CrnTaskModeType.RESET); // 任务模式 command.setSourcePosX((short)0); // 源库位排 command.setSourcePosY((short)0); // 源库位列 command.setSourcePosZ((short)0); // 源库位层 command.setDestinationPosX((short)0); // 目标库位排 command.setDestinationPosY((short)0); // 目标库位列 command.setDestinationPosZ((short)0); // 目标库位层 command.setCommand((short)0); write(command); break; default: @@ -194,23 +195,57 @@ crnProtocol.setyDistance(siemensNet.getByteTransform().TransSingle(result.Content, 44)); crnProtocol.setxDuration(siemensNet.getByteTransform().TransSingle(result.Content, 48)); crnProtocol.setyDuration(siemensNet.getByteTransform().TransSingle(result.Content, 52)); // crnProtocol.setTaskReceive(siemensNet.getByteTransform().TransInt16(result.Content, 60)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // if (crnProtocol.getStatus() == 0 && crnProtocol.getTaskReceive() == 0) { // OperateResultExOne<byte[]> taskResult = siemensNet.Read("DB100.0", (short) 20); // if (taskResult.IsSuccess) { // short taskNo = siemensNet.getByteTransform().TransInt16(taskResult.Content, 2); // short taskMode = siemensNet.getByteTransform().TransInt16(taskResult.Content, 4); // short sourcePosX = siemensNet.getByteTransform().TransInt16(taskResult.Content, 6); // short sourcePosY = siemensNet.getByteTransform().TransInt16(taskResult.Content, 8); // short sourcePosZ = siemensNet.getByteTransform().TransInt16(taskResult.Content, 10); // short destinationPosX = siemensNet.getByteTransform().TransInt16(taskResult.Content, 12); // short destinationPosY = siemensNet.getByteTransform().TransInt16(taskResult.Content, 14); // short destinationPosZ = siemensNet.getByteTransform().TransInt16(taskResult.Content, 16); // short confirm = siemensNet.getByteTransform().TransInt16(taskResult.Content, 18); // // if(taskNo != 0 || taskMode != 0 || sourcePosX != 0 || sourcePosY != 0 || sourcePosZ != 0 || destinationPosX != 0 || destinationPosY != 0 || destinationPosZ != 0 || confirm != 0) { // short[] array = new short[10]; // array[0] = (short) 0; // array[1] = (short) 0; // array[2] = (short) 0; // array[3] = (short) 0; // array[4] = (short) 0; // array[5] = (short) 0; // array[6] = (short) 0; // array[7] = (short) 0; // array[8] = (short) 0; // array[9] = (short) 0; // siemensNet.Write("DB100.0", array); // // // 最后任务完成时间 // basCrnp.setModiTime(new Date()); // Thread.sleep(300); // } // } // } // 复位信号 if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) { News.info("{}号堆垛机,收到任务{}完成信号",crnProtocol.getCrnNo(),crnProtocol.getTaskNo()); if (resetFlag) { if(crnProtocol.getTaskNo()==9999){ backHpFlag = false; } CrnCommand crnCommand = new CrnCommand(); crnCommand.setAckFinish((short)1); if (write(crnCommand)) { resetFlag = false; } } } // if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) { // News.info("{}号堆垛机,收到任务{}完成信号",crnProtocol.getCrnNo(),crnProtocol.getTaskNo()); // if (resetFlag) { // if(crnProtocol.getTaskNo()==9999){ // backHpFlag = false; // } // CrnCommand crnCommand = new CrnCommand(); // crnCommand.setAckFinish((short)1); // if (write(crnCommand)) { // resetFlag = false; // } // } // } try { // 根据实时信息更新数据库 @@ -244,140 +279,297 @@ News.error("堆垛机写入命令为空"); return false; } // 向堆垛机发任务前的堆垛机状态 try{ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24); if (resultRead.IsSuccess) { CrnCommand one = new CrnCommand(); one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) ){ News.error("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } else { News.info("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); // 任务完成确认位是否置0 int writeAck = 0; boolean commandResult = false; do { OperateResult result = siemensNet.Write("DB100.0", (short) 0); if (result.IsSuccess) { OperateResultExOne<byte[]> commandReadResult = siemensNet.Read("DB100.0", (short) 2); if (commandReadResult.IsSuccess) { short commandRead = siemensNet.getByteTransform().TransInt16(commandReadResult.Content, 0); if (commandRead == 1) { Thread.sleep(500); } else { commandResult = true; break; } } } }catch (Exception e){ News.error("堆垛机命令地址写入后回读出错"); } writeAck++; Thread.sleep(200); } while (writeAck < 5); command.setCrnNo(slave.getId()); short[] array = new short[10]; array[0] = command.getAckFinish(); // 任务完成确认位 array[1] = command.getTaskNo(); // 任务号 array[2] = command.getTaskMode(); // 模式 array[3] = command.getSourcePosX(); // 源位置排号 array[4] = command.getSourcePosY(); // 源位置列号 array[5] = command.getSourcePosZ(); // 源位置层号 array[6] = command.getDestinationPosX(); // 目标位置排号 array[7] = command.getDestinationPosY(); // 目标位置列号 array[8] = command.getDestinationPosZ(); // 目标位置层号 array[9] = command.getCommand(); // array[10] = 0; //备用1 OperateResult result = siemensNet.Write("DB100.0", array); News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array); if (!result.IsSuccess) { News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command)); Thread.sleep(100); readStatus(); if (!commandResult) { News.error("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "任务状态位异常"); return false; } //堆垛机任务写入后,回读一次,看是否成功 Thread.sleep(200); try{ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24); if (resultRead.IsSuccess) { CrnCommand one = new CrnCommand(); one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22)); if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) if(command.getTaskModeType() == CrnTaskModeType.RESET) { short[] array = new short[9]; array[0] = command.getAckFinish(); array[1] = (short) 0; array[2] = (short) 0; array[3] = (short) 0; array[4] = (short) 0; array[5] = (short) 0; array[6] = (short) 0; array[7] = (short) 0; array[8] = (short) 0; ){ try{ News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); }catch (Exception e){ try{ News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead)); }catch (Exception e1){ News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); // 写入任务数据 int idx = 0; boolean commandDataResult = false; do { OperateResult result = siemensNet.Write("DB100.0", array); if (result.IsSuccess) { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20); if (resultRead.IsSuccess) { short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2); short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4); short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6); short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8); short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10); short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12); short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14); short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16); if (taskNo != 0 || taskMode != 0 || sourcePosX != 0 || sourcePosY != 0 || sourcePosZ != 0 || destinationPosX != 0 || destinationPosY != 0 || destinationPosZ != 0) { result = siemensNet.Write("DB100.0", array); } else { commandDataResult = true; break; } } News.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command)); Thread.sleep(100); readStatus(); return false; } else { News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } idx++; Thread.sleep(200); } while (idx < 5); if (!commandDataResult) { News.error("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "堆垛机写入任务数据失败"); return false; } }catch (Exception e){ News.error("堆垛机命令地址写入后回读出错"); } if (command.getAckFinish() == 0) { if (result.IsSuccess) { Thread.sleep(300); //任务下发次数 int writeCount2 = 0; do { writeCount2++; short commandFinish = (short) 1; result = siemensNet.Write("DB100.18", commandFinish); if(result.IsSuccess){ //堆垛机任务写入后,回读一次,看是否成功 Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); if (commandFinish != 1){ News.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 News.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次"); break; } }else { News.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次"); } } else { News.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次"); } }while (writeCount2<5); } } else { BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class); BasCrnp basCrnp = basCrnpService.selectById(slave.getId()); basCrnp.setModiTime(new Date()); basCrnpService.updateById(basCrnp); } else { short[] array = new short[9]; array[0] = command.getAckFinish(); array[1] = command.getTaskNo(); array[2] = command.getTaskMode(); array[3] = command.getSourcePosX(); array[4] = command.getSourcePosY(); array[5] = command.getSourcePosZ(); array[6] = command.getDestinationPosX(); array[7] = command.getDestinationPosY(); array[8] = command.getDestinationPosZ(); // 写入任务数据 int idx = 0; boolean commandDataResult = false; do { OperateResult result = siemensNet.Write("DB100.0", array); if (result.IsSuccess) { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20); if (resultRead.IsSuccess) { short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2); short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4); short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6); short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8); short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10); short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12); short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14); short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16); if (taskNo != command.getTaskNo() || taskMode != command.getTaskMode() || sourcePosX != command.getSourcePosX() || sourcePosY != command.getSourcePosY() || sourcePosZ != command.getSourcePosZ() || destinationPosX != command.getDestinationPosX() || destinationPosY != command.getDestinationPosY() || destinationPosZ != command.getDestinationPosZ()) { result = siemensNet.Write("DB100.0", array); } else { commandDataResult = true; break; } } } idx++; Thread.sleep(200); } while (idx < 5); if (!commandDataResult) { News.error("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "堆垛机写入任务数据失败"); return false; } // 下发任务下发确认位 int writeConfirmIdx = 0; boolean commandConfirmResult = false; do { OperateResult result = siemensNet.Write("DB100.18", (short) 1); if (result.IsSuccess) { OperateResultExOne<byte[]> commandReadResult = siemensNet.Read("DB100.18", (short) 2); if (commandReadResult.IsSuccess) { short commandRead = siemensNet.getByteTransform().TransInt16(commandReadResult.Content, 0); if (commandRead == 0) { Thread.sleep(500); } else { commandConfirmResult = true; break; } } } writeConfirmIdx++; Thread.sleep(200); } while (writeConfirmIdx < 5); if (!commandConfirmResult) { News.error("堆垛机写入确认数据失败 ===>> [id:{}]", command.getCrnNo()); return false; } } // 向堆垛机发任务前的堆垛机状态 // try{ // OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24); // if (resultRead.IsSuccess) { // CrnCommand one = new CrnCommand(); // one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); // one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); // one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); // one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); // one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); // one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); // one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); // one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); // if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) // || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) // || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) // || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) // ){ // News.error("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); // } else { // News.info("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); // } // } // }catch (Exception e){ // News.error("堆垛机命令地址写入后回读出错"); // } // // command.setCrnNo(slave.getId()); // // short[] array = new short[10]; // array[0] = command.getAckFinish(); // 任务完成确认位 // array[1] = command.getTaskNo(); // 任务号 // array[2] = command.getTaskMode(); // 模式 // array[3] = command.getSourcePosX(); // 源位置排号 // array[4] = command.getSourcePosY(); // 源位置列号 // array[5] = command.getSourcePosZ(); // 源位置层号 // array[6] = command.getDestinationPosX(); // 目标位置排号 // array[7] = command.getDestinationPosY(); // 目标位置列号 // array[8] = command.getDestinationPosZ(); // 目标位置层号 // array[9] = command.getCommand(); //// array[10] = 0; //备用1 // // OperateResult result = siemensNet.Write("DB100.0", array); // News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array); // // if (!result.IsSuccess) { // News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); // MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command)); // Thread.sleep(100); // readStatus(); // return false; // } // // //堆垛机任务写入后,回读一次,看是否成功 // Thread.sleep(200); // try{ // OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24); // if (resultRead.IsSuccess) { // CrnCommand one = new CrnCommand(); // one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); // one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); // one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); // one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); // one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); // one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); // one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); // one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); // one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22)); // if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) // || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) // || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) // || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) // // ){ // try{ // News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); // }catch (Exception e){ // try{ // News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead)); // }catch (Exception e1){ // News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); // } // } // News.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); // MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command)); // Thread.sleep(100); // readStatus(); // return false; // } else { // News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); // } // } // }catch (Exception e){ // News.error("堆垛机命令地址写入后回读出错"); // } // // // if (command.getAckFinish() == 0) { // if (result.IsSuccess) { // Thread.sleep(300); // //任务下发次数 // int writeCount2 = 0; // // do { // writeCount2++; // short commandFinish = (short) 1; // result = siemensNet.Write("DB100.18", commandFinish); // if(result.IsSuccess){ // //堆垛机任务写入后,回读一次,看是否成功 // Thread.sleep(200); // OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2); // if (resultRead.IsSuccess) { // commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); // if (commandFinish != 1){ // News.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); // }else{ // //任务命令写入成功 // News.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次"); // break; // } // }else { // News.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次"); // } // } else { // News.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次"); // } // }while (writeCount2<5); // } // } else { // BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class); // BasCrnp basCrnp = basCrnpService.selectById(slave.getId()); // basCrnp.setModiTime(new Date()); // basCrnpService.updateById(basCrnp); // } // if (command.getAckFinish() == 1) { // } try { // 日志记录 @@ -402,16 +594,16 @@ bean.insert(basCrnOpt); } catch (Exception ignore) {} if (result.IsSuccess) { this.readStatus(); // if (result.IsSuccess) { // this.readStatus(); News.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())); News.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } // } else { // OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); // News.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); // return false; // } } @Override @@ -424,8 +616,8 @@ /*****************************************************************************************/ public static void main(String[] args) throws InterruptedException { CrnSlave slave = new CrnSlave(); slave.setId(1); slave.setIp("10.10.10.1"); slave.setId(3); slave.setIp("10.10.10.100"); slave.setRack(0); slave.setSlot(0); SiemensCrnThread crnThread = new SiemensCrnThread(slave); @@ -435,39 +627,41 @@ Thread.sleep(3000L); // 1.入库 源和目标都发 // CrnCommand command = new CrnCommand(); // command.setCrnNo(1); // 堆垛机编号 // command.setTaskNo((short) 0); // 工作号 CrnCommand command = new CrnCommand(); command.setCrnNo(1); // 堆垛机编号 command.setTaskNo((short) 80); // 工作号 // command.setAckFinish((short) 0); // 任务完成确认位 // command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 // command.setSourcePosX((short) 1); // 源库位排 // command.setSourcePosY((short) 0); // 源库位列 // command.setSourcePosZ((short) 1); // 源库位层 // command.setDestinationPosX((short) 2); // 目标库位排 // command.setDestinationPosY((short) 3); // 目标库位列 // command.setDestinationPosZ((short) 1); // 目标库位层 // crnThread.write(command); command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式 command.setSourcePosX((short) 11); // 源库位排 command.setSourcePosY((short) 4); // 源库位列 command.setSourcePosZ((short) 1); // 源库位层 command.setDestinationPosX((short) 12); // 目标库位排 command.setDestinationPosY((short) 5); // 目标库位列 command.setDestinationPosZ((short) 1); // 目标库位层 command.setCommand((short) 1); // 目标库位层 crnThread.write(command); // 2.出库 源和目标都发 // CrnCommand command = new CrnCommand(); // command.setCrnNo(1); // 堆垛机编号 // command.setTaskNo((short) 0); // 工作号 // command.setAckFinish((short) 0); // 任务完成确认位 // command.setTaskMode(CrnTaskModeType.PAKOUT); // 任务模式 // command.setSourcePosX((short) 2); // 源库位排 // command.setSourcePosY((short) 4); // 源库位列 // command.setSourcePosZ((short) 3); // 源库位层 // command.setDestinationPosX((short) 1); // 目标库位排 // command.setDestinationPosY((short) 0); // 目标库位列 // command.setCrnNo(2); // 堆垛机编号 // command.setTaskNo((short) 80); // 工作号 //// command.setAckFinish((short) 0); // 任务完成确认位 // command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式 // command.setSourcePosX((short) 5); // 源库位排 // command.setSourcePosY((short) 1); // 源库位列 // command.setSourcePosZ((short) 1); // 源库位层 // command.setDestinationPosX((short) 7); // 目标库位排 // command.setDestinationPosY((short) 1); // 目标库位列 // command.setDestinationPosZ((short) 1); // 目标库位层 // command.setCommand((short) 1); // crnThread.write(command); // // 3.库位移转 源和目标都发 pass // CrnCommand command = new CrnCommand(); // command.setCrnNo(slave.getId()); // 堆垛机编号 // command.setTaskNo((short) 2); // 工作号 // command.setAckFinish((short) 0); // 任务完成确认位 // command.setCrnNo(2); // 堆垛机编号 // command.setTaskNo((short) 88); // 工作号 //// command.setAckFinish((short) 0); // 任务完成确认位 // command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 // command.setSourcePosX((short)2); // 源库位排 // command.setSourcePosY((short)1); // 源库位列 @@ -475,6 +669,7 @@ // command.setDestinationPosX((short)3); // 目标库位排 // command.setDestinationPosY((short)1); // 目标库位列 // command.setDestinationPosZ((short)1); // 目标库位层 // command.setCommand((short)1); // crnThread.write(command); // 4.站位移转 源和目标都发 src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -44,16 +44,16 @@ // 站点 public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ for(int i = 1 ;i <= 20; i ++) {add(1100+i);} for(int i = 1 ;i <= 21; i ++) {add(1100+i);} }}; public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{ for(int i = 1 ;i <= 20; i ++) {add(1200+i);} for(int i = 1 ;i <= 21; i ++) {add(1200+i);} }}; public static final ArrayList<Integer> staNos3 = new ArrayList<Integer>() {{ for(int i = 1 ;i <= 20; i ++) {add(1300+i);} for(int i = 1 ;i <= 21; i ++) {add(1300+i);} }}; public static final ArrayList<Integer> staNos4 = new ArrayList<Integer>() {{ for(int i = 1 ;i <= 20; i ++) {add(1400+i);} for(int i = 1 ;i <= 21; i ++) {add(1400+i);} }}; private ArrayList<Integer> getStaNo() { switch (this.slave.getId()) { src/main/java/com/zy/entity/WrkDetl.java
@@ -166,8 +166,7 @@ /** * 长度 */ @ApiModelProperty(value= "长度") private Double length; // @ApiModelProperty(value= "长度")\\\\\\\\\\ /** * 体积 src/main/java/com/zy/entity/WrkMast.java
@@ -42,6 +42,9 @@ @ApiModelProperty(value= "") private String mk; /** * 0默认,1.已给RGV发任务,一层楼只能有一个为1 */ @ApiModelProperty(value= "") @TableField("whs_type") private Integer whsType; src/main/java/com/zy/entity/vo/RgvStateTableVo.java
@@ -27,7 +27,7 @@ private String loading1 = "-"; // RGV位置 private Short RgvPos = 0; private Integer RgvPos = 0; // 走行定位 private String walkPos = "-"; src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -22,11 +22,14 @@ import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.command.LedCommand; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.LedThread; import com.zy.core.thread.RgvThread; import com.zy.core.thread.SiemensDevpThread; import com.zy.entity.*; import com.zy.mapper.*; @@ -319,11 +322,12 @@ wrkMast.setIoTime(now); wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走 wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 wrkMast.setSourceStaNo(pickSta.getStaNo()); // 源站 wrkMast.setStaNo(staNo); // 目标站 wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 wrkMast.setSourceLocNo(""); // 源库位清空 wrkMast.setModiTime(now); wrkMast.setWhsType(0); if (wrkMastMapper.updateById(wrkMast) == 0) { throw new CoolException("更新工作档数据状态失败"); } @@ -344,7 +348,7 @@ // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(staProtocol.getSiteId().shortValue()); staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); @@ -413,7 +417,13 @@ if (wrkMastMapper.updateById(wrkMast) != 0) { // 复位堆垛机 News.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo()); crnThread.setResetFlag(true); // 堆垛机复位 if (!MessageQueue.offer(SlaveType.Crn, crnThread.getCrnProtocol().getCrnNo(), new Task(3, null))) { News.error(crnThread.getCrnProtocol().getCrnNo() + "出库任务完成下发堆垛机复位,下发复位命令失败"); } else { News.warnNoLog(""+mark+" - 2"+" - 出库任务完成下发堆垛机复位成功 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo()); } // crnThread.setResetFlag(true); } else { News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo()); } @@ -451,7 +461,7 @@ // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0 && crnProtocol.getAlarm() == 0) { News.warnNoLog(""+mark+" - 0"+" - 开始执行堆垛机入出库作业下发"); // 如果最近一次是入库模式 if (crnProtocol.getLastIo().equals("I")) { @@ -550,40 +560,42 @@ News.warnNoLog(""+mark+" - 1"+" - 8"+" - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}",wrkMast.getWrkNo()); String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo()); LocMast shallowLoc = locMastService.selectById(shallowLocNo); // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { News.warnNoLog(""+mark+" - 1"+" - 9"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); if (null == waitWrkMast) { News.error(""+mark+" - 1"+" - 10"+" - {}库位异常,未检索到相应工作档!", shallowLocNo); } else { waitWrkMast.setIoPri(15D); waitWrkMast.setModiTime(new Date()); if (wrkMastMapper.updateById(waitWrkMast) == 0) { News.error(""+mark+" - 1"+" - 11"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); if(shallowLoc != null) { // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { News.warnNoLog(""+mark+" - 1"+" - 9"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); if (null == waitWrkMast) { News.error(""+mark+" - 1"+" - 10"+" - {}库位异常,未检索到相应工作档!", shallowLocNo); } else { waitWrkMast.setIoPri(15D); waitWrkMast.setModiTime(new Date()); if (wrkMastMapper.updateById(waitWrkMast) == 0) { News.error(""+mark+" - 1"+" - 11"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); } continue; } } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); // 此标记避免多次执行移库任务 if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { wrkMast.setUpdMk("Y"); wrkMast.setIoPri(14D); wrkMastMapper.updateById(wrkMast); // 生成工作档,将浅库位移转到新的库位中 moveLocForDeepLoc(slave, shallowLoc,mark); // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) // moveLocForDeepLocPakin(slave, shallowLoc, wrkMast); } continue; } } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); // 此标记避免多次执行移库任务 if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { wrkMast.setUpdMk("Y"); wrkMast.setIoPri(14D); wrkMastMapper.updateById(wrkMast); // 生成工作档,将浅库位移转到新的库位中 moveLocForDeepLoc(slave, shallowLoc,mark); // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) // moveLocForDeepLocPakin(slave, shallowLoc, wrkMast); } continue; } else if (shallowLoc.getLocSts().equals("Q")) { News.warnNoLog(""+mark+" - 1"+" - 13"+" - // Q 库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { News.infoNoLog(""+mark+" - 1"+" - 14"+" - // F、D 工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts()); continue; } else if (shallowLoc.getLocSts().equals("Q")) { News.warnNoLog(""+mark+" - 1"+" - 13"+" - // Q 库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { News.infoNoLog(""+mark+" - 1"+" - 14"+" - // F、D 工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts()); continue; } } } } @@ -603,7 +615,8 @@ crnCommand.setDestinationPosX(locMast.getRow1().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(locMast.getBay1().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(locMast.getLev1().shortValue()); // 目标库位层 crnCommand.setTraySize(locMast.getLocType1() == 2); crnCommand.setCommand((short) 1); // 任务确认 // crnCommand.setTraySize(locMast.getLocType1() == 2); if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { News.error(""+mark+" - 1"+" - 16"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { @@ -688,46 +701,48 @@ News.warnNoLog(""+mark+" - 2"+" - 6"+" - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}",wrkMast.getWrkNo()); String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); LocMast shallowLoc = locMastService.selectById(shallowLocNo); // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { News.warnNoLog(""+mark+" - 2"+" - 7"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); if (null == waitWrkMast) { News.error("{}库位异常,未检索到相应工作档!", shallowLocNo); } else { if (waitWrkMast.getWrkSts() == 11) { waitWrkMast.setIoPri(15D); waitWrkMast.setModiTime(new Date()); if (wrkMastMapper.updateById(waitWrkMast) == 0) { News.error(""+mark+" - 2"+" - 8"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); } continue; if (shallowLoc != null) { // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { News.warnNoLog(""+mark+" - 2"+" - 7"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); if (null == waitWrkMast) { News.error("{}库位异常,未检索到相应工作档!", shallowLocNo); } else { if (waitWrkMast.getWrkSts() == 11) { waitWrkMast.setIoPri(15D); waitWrkMast.setModiTime(new Date()); if (wrkMastMapper.updateById(waitWrkMast) == 0) { News.error(""+mark+" - 2"+" - 8"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); } continue; } else { } } } } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { News.warnNoLog(""+mark+" - 2"+" - 9"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { News.warnNoLog(""+mark+" - 2"+" - 9"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); // WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务 WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); // 此标记避免多次执行移库任务 //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务 WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); // 此标记避免多次执行移库任务 // if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk()) // || Cools.isEmpty(waitWrkMast)) { if (Cools.isEmpty(waitWrkMast)) { wrkMast.setUpdMk("Y"); wrkMastMapper.updateById(wrkMast); // 生成工作档,将浅库位移转到新的库位中 moveLocForDeepLoc(slave, shallowLoc,mark); } News.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo); break; } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) { News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q、S 库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { News.infoNoLog(""+mark+" - 2"+" - 11"+" - // F、D 工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts()); continue; if (Cools.isEmpty(waitWrkMast)) { wrkMast.setUpdMk("Y"); wrkMastMapper.updateById(wrkMast); // 生成工作档,将浅库位移转到新的库位中 moveLocForDeepLoc(slave, shallowLoc,mark); } News.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo); break; } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) { News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q、S 库位状态={}",shallowLoc.getLocSts()); WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { News.infoNoLog(""+mark+" - 2"+" - 11"+" - // F、D 工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts()); continue; } } } } @@ -754,7 +769,8 @@ crnCommand.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 crnCommand.setCommand((short)1); // 任务确认 // crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { News.error(""+mark+" - 2"+" - 13"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { @@ -828,7 +844,7 @@ CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 // crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(sourceSta.getRow1().shortValue()); // 源库位排 crnCommand.setSourcePosY(sourceSta.getBay1().shortValue()); // 源库位列 @@ -836,7 +852,8 @@ crnCommand.setDestinationPosX(sta.getRow1().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(sta.getBay1().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(sta.getLev1().shortValue()); // 目标库位层 crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 crnCommand.setCommand((short)1); // 任务确认 // crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { News.error(""+mark+" - 3"+" - 4"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { @@ -866,11 +883,12 @@ continue; } // 状态:等待确认 并且 任务完成位 = 1 if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { if (crnProtocol.getMode().intValue() == CrnModeType.AUTO.id && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { News.warnNoLog(""+mark+" - 0"+" - 开始执行对工作档的完成操作"); if (crnProtocol.getTaskNo() == 9999) { // 堆垛机复位 crnThread.setResetFlag(true); if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(3, null))) { News.error(crn.getId() + "堆垛机回原点任务,下发复位命令失败"); } } else { // 获取入库待确认工作档 WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); @@ -890,8 +908,11 @@ // 修改成功后复位堆垛机 if (wrkMastMapper.updateById(wrkMast) > 0) { // 堆垛机复位 News.warnNoLog(""+mark+" - 2"+" - 修改成功后复位堆垛机 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo()); crnThread.setResetFlag(true); if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(3, null))) { News.error(crn.getId() + "入库完成,下发复位命令失败"); } else { News.warnNoLog(""+mark+" - 2"+" - 入库完成复位堆垛机 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo()); } } } @@ -1073,7 +1094,7 @@ // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(dto.getWorkNo()); staProtocol.setStaNo(staProtocol.getSiteId().shortValue()); staProtocol.setStaNo(dto.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId()); @@ -1585,7 +1606,10 @@ * 堆垛机回原点 */ public synchronized void originGo() throws InterruptedException { Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "crnAutoHome").eq("status", 1)); if (config == null || Cools.isEmpty(config.getValue()) || !config.getValue().equals("Y")) { return; } for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); @@ -1625,13 +1649,15 @@ CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(crn.getId()); // 堆垛机编号 crnCommand.setTaskNo((short) 9999); // 工作号 crnCommand.setAckFinish((short)0); crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 回原点 crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 3 : 6)); // 源库位排 crnCommand.setSourcePosY((short) 1); // 源库位列 crnCommand.setSourcePosZ((short) 1); // 源库位层 crnCommand.setSourcePosX((short) 0); // 源库位排 crnCommand.setSourcePosY((short) 0); // 源库位列 crnCommand.setSourcePosZ((short) 0); // 源库位层 crnCommand.setDestinationPosX((short) 0); // 目标库位排 crnCommand.setDestinationPosY((short) 0); // 目标库位列 crnCommand.setDestinationPosZ((short) 0); // 目标库位层 crnCommand.setCommand((short)1); if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) { News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand)); } else { @@ -1644,4 +1670,82 @@ } } public static final HashMap<Integer,Integer> wrkStaNoToRgvStaMap = new HashMap<>(); static { wrkStaNoToRgvStaMap.put(1101,1114); wrkStaNoToRgvStaMap.put(1201,1203); wrkStaNoToRgvStaMap.put(1206,1203); wrkStaNoToRgvStaMap.put(1301,1303); wrkStaNoToRgvStaMap.put(1306,1303); wrkStaNoToRgvStaMap.put(1408,1413); } public static final HashMap<Integer,Integer> wrkSourceStaNoToRgvStaMap = new HashMap<>(); static { wrkSourceStaNoToRgvStaMap.put(1112,1114); wrkSourceStaNoToRgvStaMap.put(1109,1114); wrkSourceStaNoToRgvStaMap.put(1209,1213); wrkSourceStaNoToRgvStaMap.put(1309,1313); wrkSourceStaNoToRgvStaMap.put(1402,1403); wrkSourceStaNoToRgvStaMap.put(1407,1403); } public synchronized void rgvCarry() { for(int i = 1; i <= 4; i ++) { List<Integer> rgvCarrySiteList; RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, i); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, i); if(rgvProtocol.modeType == RgvModeType.AUTO && rgvProtocol.statusType == RgvStatusType.IDLE && rgvProtocol.loaded1 == 0 && rgvProtocol.alarm == 0 && rgvProtocol.getTaskNo1() == 0) { switch (i) { case 1: rgvCarrySiteList = Arrays.asList(1114,1118,1120); break; case 2: rgvCarrySiteList = Arrays.asList(1213,1216,1218,1220); break; case 3: rgvCarrySiteList = Arrays.asList(1313,1316,1318,1320); break; case 4: rgvCarrySiteList = Arrays.asList(1403,1418,1420); break; default: return; } List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().ne("wrk_no", 0).in("dev_no", rgvCarrySiteList)); if(!basDevps.isEmpty()) { List<Integer> wrkNos = basDevps.stream().map(BasDevp::getWrkNo).distinct().collect(Collectors.toList()); List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_no", wrkNos) .last("ORDER BY CASE WHEN crn_end_time IS NULL THEN 0 ELSE 1 END,crn_end_time ASC")); Optional<WrkMast> first = wrkMastList.stream().filter(wrkMast -> wrkMast.getWhsType() == 1).findFirst(); if(first.isPresent()) { log.warn("有任务处在{}号小车搬运中,任务号{}",i,first.get().getWrkNo()); continue; } for(WrkMast wrkMast:wrkMastList) { // 判断目标站点是否可用 StaProtocol staProtocol = devpThread.getStation().get(wrkStaNoToRgvStaMap.get(wrkMast.getStaNo()) == null ? wrkMast.getStaNo() : wrkStaNoToRgvStaMap.get(wrkMast.getStaNo())); if (staProtocol != null && staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo() == 0) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvProtocol.getRgvNo()); // rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 Integer sourcesStaNo = wrkSourceStaNoToRgvStaMap.get(wrkMast.getSourceStaNo()); rgvCommand.setSourceStaNo1(sourcesStaNo == null ? wrkMast.getSourceStaNo().shortValue() : sourcesStaNo.shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMast.getStaNo().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) { log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); break; } wrkMast.setWhsType(1); wrkMastService.updateById(wrkMast); break; } } } } } } } src/main/resources/application.yml
@@ -492,7 +492,7 @@ port: 5005 devpPlcId: ${wcs-slave.devp[1].id} staArr: 1206 crnId: 1 crnId: 2 # LED6 led[5]: id: 6 @@ -500,7 +500,7 @@ port: 5005 devpPlcId: ${wcs-slave.devp[1].id} staArr: 1209 crnId: 1 crnId: 3 # LED7 led[6]: id: 7 @@ -516,7 +516,7 @@ port: 5005 devpPlcId: ${wcs-slave.devp[2].id} staArr: 1306 crnId: 1 crnId: 2 # LED9 led[8]: id: 9 @@ -524,7 +524,7 @@ port: 5005 devpPlcId: ${wcs-slave.devp[2].id} staArr: 1309 crnId: 1 crnId: 3 # LED10 led[9]: id: 10 @@ -540,7 +540,7 @@ port: 5005 devpPlcId: ${wcs-slave.devp[3].id} staArr: 1407 crnId: 1 crnId: 2 # LED12 led[11]: id: 12 @@ -548,11 +548,11 @@ port: 5005 devpPlcId: ${wcs-slave.devp[3].id} staArr: 1408 crnId: 1 crnId: 3 rgv[0]: id: 1 ip: 192.168.5.20 ip: 10.10.10.53 port: 102 rack: 0 slot: 0 src/main/webapp/static/js/console.map.js
@@ -389,8 +389,8 @@ } ,{ "type": "stn", "id": "site-1", "text": "1", "id": "site-1121", "text": "1121", "top": 442, "left": 1629, "width": 50, src/main/webapp/views/console.html
@@ -44,11 +44,11 @@ <div class="machine-status"> <div class="body-head">堆垛机状态</div> <div class="state"> <span>堆垛机 1</span> <span>堆垛机状态</span> <span class="state-ss machine-put-flag ">入库</span> </div> <div class="state"> <span>堆垛机 2</span> <span>堆垛机状态</span> <span class="state-ss machine-auto-flag ">自动</span> </div> @@ -600,12 +600,12 @@ crns[i].bay = 1 } var offSet = 350; var offSet = 1520; if(crns[i].bay === 1){ crnEl.animate({left: offSet + 'px'}, 1000); } else { let lf = (offSet + (crns[i].bay - 1 )* 50); let lf = (offSet - crns[i].bay * 40); crnEl.animate({left: lf + 'px'}, 1000); } src/main/webapp/views/crn.html
@@ -144,7 +144,7 @@ <div class="select-container" style="padding: 20px 0;"> <label><input type="radio" name="crnSelect" value="1" checked> 1号堆垛机</label> <label><input type="radio" name="crnSelect" value="2"> 2号堆垛机</label> <!-- <label><input type="radio" name="crnSelect" value="3"> 3号堆垛机</label>--> <label><input type="radio" name="crnSelect" value="3"> 3号堆垛机</label> <!-- <label><input type="radio" name="crnSelect" value="4"> 4号堆垛机</label>--> </div> </div>