src/main/java/com/zy/asrs/controller/SiteController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.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/command/RgvCommand.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/RgvProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/RgvThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensDevpThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/WrkMastStaMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -73,7 +73,7 @@ for (BasDevp devp : basDevps) { SiteTableVo vo = new SiteTableVo(); vo.setDevNo(devp.getDevNo()); // 站点编号 vo.setWorkNo(devp.getWrkNo()); list.add(vo); StaProtocol staProtocol = station.get(devp.getDevNo()); if (null == staProtocol) { continue; } src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -35,6 +35,6 @@ List<WrkMastSta> selectNoInterfereList(@Param("staStarts") List<Integer> staStarts, @Param("staEnds") List<Integer> staEnds); WrkMastSta selectByWorkSta(@Param("workSta") Integer workSta, @Param("rgv_no") Integer rgv_no); WrkMastSta selectByWorkSta(@Param("workSta") Integer workSta, @Param("rgvo") Integer rgvNo); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -3218,16 +3218,18 @@ // 只有当RGV空闲 并且 无任务时才继续执行 if ((rgvProtocol.getStatusType1() == RgvStatusType.IDLE || rgvProtocol.getStatusType2() == RgvStatusType.IDLE) && rgvProtocol.getModeType() == RgvModeType.AUTO // && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk()) { News.warnNoLog(""+mark+" - 0"+" - 开始执行RGV入出库作业下发"); // 如果最近一次是入库模式 // rgvRunWrkMastInTest(); if (rgvProtocol.getLastIo().equals("I")) { if (basRgv.getInEnable().equals("Y") && rgvThread.isPakIn()) { if (basRgv.getInEnable().equals("1") && rgvThread.isPakIn()) { //mark - 1 - .... this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); // 入库 rgvProtocol.setLastIo("O"); } else if (basRgv.getOutEnable().equals("Y") && rgvThread.isPakOut()) { } else if (basRgv.getOutEnable().equals("1") && rgvThread.isPakOut()) { //mark - 2 - .... this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); // 出库 rgvProtocol.setLastIo("I"); @@ -3235,10 +3237,10 @@ } // 如果最近一次是出库模式 else if (rgvProtocol.getLastIo().equals("O")) { if (basRgv.getOutEnable().equals("Y") && rgvThread.isPakOut()) { if (basRgv.getOutEnable().equals("1") && rgvThread.isPakOut()) { this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); // 出库 rgvProtocol.setLastIo("I"); } else if (basRgv.getInEnable().equals("Y") && rgvThread.isPakIn()) { } else if (basRgv.getInEnable().equals("1") && rgvThread.isPakIn()) { this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); // 入库 rgvProtocol.setLastIo("O"); } @@ -3259,6 +3261,44 @@ rgvOutExecute(); } } } public synchronized void rgvRunWrkMastInTest(){ BasRgvMap basRgvMap = basRgvMapMapper.selectById(1); List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(1031); //更新小车当前位置站点号 WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(342);//根据站点工作号和小车工作范围检索任务档 // WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, 1); boolean result = false; // if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 // result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 // } // if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 // rgvThread.setPakRgv(false); // continue; // } wrkMastSta.setWorkSta(1); wrkMastSta.setRgvNo(1); wrkMastSta.setStaStart(1031); Short direction = 2;//双工位最终抵达位置 boolean sign = false; sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发 if (sign){ wrkMastSta.setWrkSts(1); try{ wrkMastStaMapper.updateById(wrkMastSta); log.error("更新小车任务成功"); }catch (Exception e){ log.error("更新小车任务失败"); } // rgvThread.setPakOut(false);//出库不允许 boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526"); if (!signMap){ log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); } } else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } } /** @@ -3920,7 +3960,8 @@ rgvCommand.setTaskStatus2(RgvTaskStatusType.X_MOVE); // 工位2任务模式: 取放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaStart()); //工位2目标站点 rgvCommand.setDirection2(direction); // rgvCommand.setDirection1((short) 2); // rgvCommand.setWrkTaskMove2(direction); rgvCommand.setCommand(true); //工位1任务确认 pakIn1 = false; }else{ //入库RGV取货行走 @@ -3929,11 +3970,12 @@ rgvCommand.setTaskStatus1(RgvTaskStatusType.X_MOVE); // 工位1任务模式: 取放货 rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd()); //工位1 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaStart()); //工位1目标站点 rgvCommand.setDirection1(direction); // rgvCommand.setDirection1((short) 1); // rgvCommand.setDirection1(direction); rgvCommand.setCommand(true); //工位1任务确认 } if(!pakIn1){ if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; @@ -3941,7 +3983,7 @@ return true; } }else{ if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; @@ -3957,7 +3999,8 @@ rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式: 取放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaStart()); //工位2目标站点 rgvCommand.setDirection2(direction); rgvCommand.setDirection1((short)2); rgvCommand.setWrkTaskMove2(direction); rgvCommand.setCommand(true); //工位1任务确认 pakIn1 = false; }else{ //入库RGV取货 @@ -3966,7 +4009,8 @@ rgvCommand.setTaskStatus1(RgvTaskStatusType.FETCH); // 工位1任务模式: 取放货 rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd()); //工位1 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaStart()); //工位1目标站点 rgvCommand.setDirection1(direction); rgvCommand.setDirection1((short)1); rgvCommand.setWrkTaskMove1(direction); rgvCommand.setCommand(true); //工位1任务确认 } if(!pakIn1){ @@ -3994,6 +4038,7 @@ rgvCommand.setTaskStatus2(RgvTaskStatusType.PUT); // 工位2任务模式: 放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd()); //工位2目标站点 rgvCommand.setDirection1((short)2); rgvCommand.setCommand(true); //工位1任务确认 pakIn2 = false; }else{ //工位1任务放货 @@ -4002,6 +4047,7 @@ rgvCommand.setTaskStatus1(RgvTaskStatusType.PUT); // 工位1任务模式: 放货 rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd()); //工位1 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd()); //工位1目标站点 rgvCommand.setDirection1((short)1); rgvCommand.setCommand(true); //工位1任务确认 } if(!pakIn2){ src/main/java/com/zy/core/MainProcess.java
@@ -157,12 +157,12 @@ continue; } //arm任务完成 mainService.armMissionAccomplished(); mainService.armMissionAccomplishedScanToCheckIn(); //arm任务下发 mainService.armTaskAssignment(); // //arm任务完成 // mainService.armMissionAccomplished(); // mainService.armMissionAccomplishedScanToCheckIn(); // // //arm任务下发 // mainService.armTaskAssignment(); } catch (Exception e) { e.printStackTrace(); src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -140,6 +140,9 @@ */ Short wrkTaskPri = 0; Short wrkTaskMove1 = 0; Short wrkTaskMove2 = 0; public void setTaskMode1(Short taskMode1){ this.taskMode1 = taskMode1; this.taskModeType1 = RgvTaskModeType.get(taskModeType1); src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -36,6 +36,10 @@ */ public Short wrkTaskPri; public Short wrkTaskMove1; public Short wrkTaskMove2; /** * RGV当前状态工位1 src/main/java/com/zy/core/thread/RgvThread.java
@@ -104,6 +104,7 @@ command.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式 command.setTargetPosition1( 0); // 源站 command.setEndStaNo1(0); // 目标站 command.setWrkTaskMove1((short) 0); command.setWrkTaskPri((short)0); command.setCommand(false); write1(command); @@ -120,6 +121,7 @@ command2.setTargetPosition2( 0); // 源站 command2.setEndStaNo2(0); // 目标站 command2.setWrkTaskPri((short)0); command2.setWrkTaskMove2((short)0); command2.setCommand(false); write2(command2); break; @@ -204,10 +206,12 @@ rgvProtocol.setTaskNo1(0); rgvProtocol.setStatus1((short)-1); rgvProtocol.setLoaded1(false); rgvProtocol.setWrkTaskMove1((short)0); //工位2状态 rgvProtocol.setTaskNo2(0); rgvProtocol.setStatus2((short)-1); rgvProtocol.setLoaded2(false); rgvProtocol.setWrkTaskMove2((short)0); // rgvProtocol.setAlarm((short)0); // rgvProtocol.setxSpeed((short) 0); // rgvProtocol.setxDistance((short) 0); @@ -273,14 +277,14 @@ rgvProtocol.setErr5(status2[4]); rgvProtocol.setErr6(status2[5]); rgvProtocol.setErr7(status2[6]); boolean[] status3 = siemensNet.getByteTransform().TransBool(result.Content, 27, 1); rgvProtocol.setErr1(status3[0]); rgvProtocol.setErr2(status3[1]); rgvProtocol.setErr3(status3[2]); rgvProtocol.setErr4(status3[3]); rgvProtocol.setErr5(status3[4]); rgvProtocol.setErr6(status3[5]); rgvProtocol.setErr7(status3[6]); // boolean[] status3 = siemensNet.getByteTransform().TransBool(result.Content, 27, 1); // rgvProtocol.setErr1(status3[0]); // rgvProtocol.setErr2(status3[1]); // rgvProtocol.setErr3(status3[2]); // rgvProtocol.setErr4(status3[3]); // rgvProtocol.setErr5(status3[4]); // rgvProtocol.setErr6(status3[5]); // rgvProtocol.setErr7(status3[6]); // rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); @@ -544,6 +548,7 @@ one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(result1.Content, 8)); one.setTaskNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 10)); one.setDirection1(siemensNet.getByteTransform().TransInt16(result1.Content, 14)); one.setWrkTaskMove1(siemensNet.getByteTransform().TransInt16(result1.Content, 36)); // one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0)); // one.setTaskNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 2)); // one.setTaskMode1(siemensNet.getByteTransform().TransInt16(result3.Content, 4)); @@ -561,23 +566,17 @@ } byte[] writeBytes = new byte[34]; command.setRgvNo(slave.getId()); siemensNet.getByteTransform().TransInt32(writeBytes, 0, command.getTargetPosition1()); siemensNet.getByteTransform().TransInt32(writeBytes, 4, command.getEndStaNo1()); siemensNet.getByteTransform().TransInt16(writeBytes, 8, command.getTaskStatus1()); siemensNet.getByteTransform().TransInt32(writeBytes, 10, command.getTaskNo1()); siemensNet.getByteTransform().TransInt16(writeBytes, 14, command.getDirection1()); setBool(writeBytes, 32, 0, command.getAckFinish1()); // command.setRgvNo(slave.getId()); // short[] array = new short[5]; // array[0] = command.getAckFinish1(); // array[1] = command.getTaskNo1(); // array[2] = command.getTaskMode1(); // array[3] = command.getSourceStaNo1(); // array[4] = command.getDestinationStaNo1(); // siemensNet.Write("DB100.10", command.getCommand()); writeInt32(writeBytes, 0, command.getTargetPosition1()); writeInt32(writeBytes, 4, command.getEndStaNo1()); writeInt16(writeBytes, 8, (short)command.getTaskStatus1()); writeInt32(writeBytes, 10, command.getTaskNo1()); writeInt16(writeBytes, 14, (short)command.getDirection1()); writeBool(writeBytes, 32, 0, command.getAckFinish1()); writeInt16(writeBytes, 36, (short)command.getWrkTaskMove1()); OperateResult result = siemensNet.Write("DB100.0", writeBytes); if (!result.IsSuccess){ News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); @@ -593,6 +592,7 @@ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); one.setWrkTaskMove1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 36)); one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10)); one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); @@ -603,7 +603,8 @@ !command.getTaskNo1().equals(one.getTaskNo1()) || !command.getTaskStatus1().equals(one.getTaskStatus1()) || !command.getEndStaNo1().equals(one.getEndStaNo1()) || !command.getTargetPosition1().equals(one.getTargetPosition1()) !command.getTargetPosition1().equals(one.getTargetPosition1()) || !command.getWrkTaskMove1().equals(one.getWrkTaskMove1()) ) { try{ News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); @@ -643,7 +644,7 @@ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0); if (!commandFinish){ if (commandFinish){ News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 @@ -715,6 +716,7 @@ one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(result1.Content, 24)); one.setTaskNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 26)); one.setDirection2(siemensNet.getByteTransform().TransInt16(result1.Content, 30)); one.setWrkTaskMove2(siemensNet.getByteTransform().TransInt16(result1.Content, 38)); News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } @@ -723,16 +725,23 @@ if (result2.IsSuccess){ News.error("下发前把车子确认位置为0"); } byte[] writeBytes = new byte[34]; command.setRgvNo(slave.getId()); siemensNet.getByteTransform().TransInt32(writeBytes, 16, command.getTargetPosition2()); siemensNet.getByteTransform().TransInt32(writeBytes, 20, command.getEndStaNo2()); siemensNet.getByteTransform().TransInt16(writeBytes, 24, command.getTaskStatus2()); siemensNet.getByteTransform().TransInt32(writeBytes, 26, command.getTaskNo2()); siemensNet.getByteTransform().TransInt16(writeBytes, 30, command.getDirection2()); setBool(writeBytes, 32, 1, command.getAckFinish2()); writeInt32(writeBytes, 16, command.getTargetPosition1()); writeInt32(writeBytes, 20, command.getEndStaNo2()); writeInt16(writeBytes, 24, (short)command.getTaskStatus2()); writeInt32(writeBytes, 26, command.getTaskNo2()); writeInt16(writeBytes, 30, (short)command.getDirection2()); writeBool(writeBytes, 32, 0, command.getAckFinish2()); writeInt16(writeBytes, 38, (short)command.getWrkTaskMove2()); OperateResult result = siemensNet.Write("DB100.0", writeBytes); if (!result.IsSuccess){ News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); @@ -748,6 +757,7 @@ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); one.setWrkTaskMove2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 38)); one.setDirection2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30)); one.setTaskNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26)); one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24)); @@ -758,7 +768,8 @@ !command.getTaskNo2().equals(one.getTaskNo2()) || !command.getTaskStatus2().equals(one.getTaskStatus2()) || !command.getEndStaNo2().equals(one.getEndStaNo2()) || !command.getTargetPosition2().equals(one.getTargetPosition2()) !command.getTargetPosition2().equals(one.getTargetPosition2()) || !command.getWrkTaskMove2().equals(one.getWrkTaskMove2()) ) { try{ News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); @@ -798,7 +809,7 @@ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 1); if (!commandFinish){ if (commandFinish){ News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 @@ -844,6 +855,28 @@ return false; } } public static void writeInt32(byte[] buffer, int index, int value) { buffer[index] = (byte)((value >> 24) & 0xFF); buffer[index + 1] = (byte)((value >> 16) & 0xFF); buffer[index + 2] = (byte)((value >> 8) & 0xFF); buffer[index + 3] = (byte)(value & 0xFF); } public static void writeInt16(byte[] buffer, int index, short value) { buffer[index] = (byte)((value >> 8) & 0xFF); // 高字节 buffer[index + 1] = (byte)(value & 0xFF); // 低字节 } public static void writeBool(byte[] buffer, int byteIndex, int bitIndex, boolean value) { if (value) { buffer[byteIndex] |= (1 << bitIndex); } else { buffer[byteIndex] &= ~(1 << bitIndex); } } @Override public void close() { src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -28,10 +28,7 @@ import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** @@ -51,20 +48,58 @@ // // }}; public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(100);add(101);add(102);add(103); add(104);add(105);add(106);add(107); add(108);add(109);add(110);add(111); add(112);add(113);add(114);add(115); add(116);add(117);add(118);add(119); add(1001);add(1002);add(1004); add(1005);add(1007); add(1008);add(1010); add(1011);add(1012);add(1014); add(1015);add(1016);add(1018); add(1019);add(1021); add(1022);add(1024); add(1025);add(1026);add(1028); add(1029);add(1031); add(1032);add(1033);add(1035); add(1036);add(1037);add(1038); add(1039);add(1041); // add(1042);add(1043);add(1044);add(1045);add(1046);add(1047);add(1048);add(1050);add(1051);add(1052);add(1053);add(1054);add(1055);add(1056);add(1057); // add(1058);add(1059);add(1060);add(1061);add(1062);add(1063);add(1064);add(1065);add(1066);add(1067);add(1068);add(1069);add(1070);add(1071);add(1072); // add(1073);add(1074);add(1075);add(1076);add(1077);add(1078);add(1079);add(1080);add(1081);add(1082);add(1083);add(1084);add(1085);add(1086);add(1087); // add(1088);add(1089);add(1090);add(1091);add(1092);add(1093);add(1094);add(1095);add(1096);add(1097);add(1098);add(1099);add(1100);add(1101);add(1102); // add(1103);add(1104);add(1105);add(1106);add(1107);add(1108);add(1109); }}; public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{ add(100);add(101);add(102);add(103); add(104);add(105);add(106);add(107); add(108);add(109);add(110);add(111); add(2001);add(2003); add(2004);add(2006); add(2007);add(2009); add(2010);add(2012); add(2013);add(2015); add(2016);add(2018); add(2019);add(2021); add(2022);add(2024); add(2025);add(2027); add(2031);add(2033); add(2034);add(2035);add(2037); add(2041);add(2042);add(2043);add(2044); add(2045);add(2046);add(2047);add(2048); add(2101);add(2102);add(2103);add(2104);add(2105);add(2106);add(2107);add(2108);add(2109);add(2110); add(2111);add(2112);add(2113);add(2114);add(2115);add(2116);add(2117);add(2118);add(2119);add(2120); add(4001);add(4003);add(4004);add(4006); }}; // 站点偏移量映射表 public static final Map<Integer, Integer> siteOffsetMap = new HashMap<Integer, Integer>() {{ put(1001, 0);put(1002, 116);put(1003, 208);put(1004, 300);put(1005, 392);put(1006, 508);put(1007, 600); put(1008, 692);put(1009, 808);put(1010, 900);put(1011, 992);put(1012, 1108);put(1013, 1200);put(1014, 1292); put(1015, 1384);put(1016, 1500);put(1017, 1592);put(1018, 1684);put(1019, 1776);put(1020, 1892);put(1021, 1984); put(1022, 2076);put(1023, 2192);put(1024, 2284);put(1025, 2376);put(1026, 2492);put(1027, 2584);put(1028, 2676); put(1029, 0);put(1030, 116);put(1031, 208);put(1032, 300);put(1033, 416);put(1034, 508);put(1035, 600); put(1036, 692);put(1037, 784);put(1038, 876);put(1039, 968);put(1040, 1084);put(1041, 1176); // 其他站点同理继续加 }}; // 特殊站点集合 private static final Set<Integer> specialSites = new HashSet<>( Arrays.asList(1001,1005,1008,1011,1015,1019,1022,1025,1029, 1032,1039)); public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{ @@ -74,10 +109,31 @@ add(3); add(4); }}; public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{ add(106); add(107); add(159); add(1036); }}; private Integer count=0; // 偏移量计算方法 public static int getOffsetBySiteId(int siteId) { int offset = 0; if (specialSites.contains(siteId)) { offset = 96; // 特殊站点占 96 } else { offset = 72; // 普通站点占 72 } return offset; } // 偏移量计算方法 public static int getOffsetBySiteId2(int siteId) { int offset = 0; if (specialSites.contains(siteId)) { offset = 72; // 特殊站点占 96 } else { offset = 60; // 普通站点占 72 } return offset; } /** * 条码数量 @@ -204,8 +260,11 @@ // updateIoMode(); ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8)); if (result.IsSuccess) { OperateResultExOne<byte[]> result = null; OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.0", (short) (2764)); OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.0", (short) (1264)); if (result1.IsSuccess && result2.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); @@ -214,60 +273,81 @@ staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8)); // 工作号 if(siteId < 1029){ result = result1; }else{ result = result2; } // 获取该站点对应的偏移量 Integer offset = siteOffsetMap.get(siteId); if (offset == null) { continue; // 如果没定义偏移量,跳过 } Integer offset2 = getOffsetBySiteId(siteId); Integer offset3 = getOffsetBySiteId2(siteId); staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4)); // 目标站 staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 12)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2); boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3, 2); staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 staProtocol.setOutEnable(status[3]);// 可出 staProtocol.setEmptyMk(status[4]); // 空板信号 staProtocol.setFullPlt(status[5]); // 满托盘 staProtocol.setHigh(status[6]); // 高库位 staProtocol.setLow(status[7]); // 低库位 boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3 - 4, 3); staProtocol.setLoading(status1[0]); // 有物 if(staProtocol.isLoading()){ staProtocol.setInEnable(false); // 可入 staProtocol.setOutEnable(false);// 可出 }else{ staProtocol.setInEnable(true); // 可入 staProtocol.setOutEnable(true);// 可出 } // staProtocol.setInEnable(status1[1]); // 可入 // staProtocol.setOutEnable(status1[3]);// 可出 // staProtocol.setEmptyMk(status[4]); // 空板信号 // staProtocol.setFullPlt(status[5]); // 满托盘 // staProtocol.setHigh(status[6]); // 高库位 // staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } } BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); // BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); //RGV小车1 // Thread.sleep(100); OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10); if (result3.IsSuccess) { BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0)); if (!Cools.isEmpty(basRgvMap)){ Integer siteId = 1; StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setAutoing(true); staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8))); } } // OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10); // if (result3.IsSuccess) { // BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0)); // if (!Cools.isEmpty(basRgvMap)){ // Integer siteId = 1; // StaProtocol staProtocol = station.get(siteId); // if (null == staProtocol) { // staProtocol = new StaProtocol(); // staProtocol.setSiteId(siteId); // station.put(siteId, staProtocol); // } // staProtocol.setAutoing(true); // staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8))); // } // } //RGV小车2 // Thread.sleep(100); OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB50.212",(short)10); if (result4.IsSuccess) { BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result4.Content, 0)); if (!Cools.isEmpty(basRgvMap)){ Integer siteId = 2; StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setAutoing(true); staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result4.Content, 8))); } } // OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB50.212",(short)10); // if (result4.IsSuccess) { // BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result4.Content, 0)); // if (!Cools.isEmpty(basRgvMap)){ // Integer siteId = 2; // StaProtocol staProtocol = station.get(siteId); // if (null == staProtocol) { // staProtocol = new StaProtocol(); // staProtocol.setSiteId(siteId); // station.put(siteId, staProtocol); // } // staProtocol.setAutoing(true); // staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result4.Content, 8))); // } // } // //RGV小车3 //// Thread.sleep(100); @@ -287,98 +367,98 @@ // } // } // //条码扫描器 // ArrayList<Integer> barcodeList = BarcodeList; // OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840", (short) (barcodeList.size() * 8)); // if (result2.IsSuccess) { // for (int i = 0; i < barcodeList.size(); i++) { // Integer barcodeId = barcodeList.get(i); // String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8"); // BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1); // if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { // barcodeThread.setBarcode(barcode); // } // } // } //条码扫描器 ArrayList<Integer> barcodeList = BarcodeList; OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840", (short) (barcodeList.size() * 8)); if (result2.IsSuccess) { for (int i = 0; i < barcodeList.size(); i++) { Integer barcodeId = barcodeList.get(i); String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1); if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { barcodeThread.setBarcode(barcode); } } } //条码扫描器 ArrayList<Integer> barcodeListMat = BarcodeListMat; OperateResultExOne<byte[]> result2Mat = siemensS7Net.Read("DB103.0", (short) (barcodeListMat.size() * 30)); if (result2Mat.IsSuccess) { for (int i = 0; i < barcodeListMat.size(); i++) { Integer barcodeId = barcodeListMat.get(i); String barcode = siemensS7Net.getByteTransform().TransString(result2Mat.Content,i*30,30, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1); if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { barcodeThread.setBarcode(barcode); } } } // ArrayList<Integer> barcodeListMat = BarcodeListMat; // OperateResultExOne<byte[]> result2Mat = siemensS7Net.Read("DB103.0", (short) (barcodeListMat.size() * 30)); // if (result2Mat.IsSuccess) { // for (int i = 0; i < barcodeListMat.size(); i++) { // Integer barcodeId = barcodeListMat.get(i); // String barcode = siemensS7Net.getByteTransform().TransString(result2Mat.Content,i*30,30, "UTF-8"); // BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1); // if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { // barcodeThread.setBarcode(barcode); // } // } // } //外形检测 ArrayList<Integer> staNoErrs = staNosErrList; int staNoErrsSize = staNoErrs.size(); OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.800", (short) (staNoErrsSize*8)); if (resultErr.IsSuccess){ for (int i = 0;i<3;i++){ Integer siteId = staNoErrs.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4+2, 1); StaProtocol staProtocol = station.get(siteId); staProtocol.setFrontErr(status[0]); staProtocol.setBackErr(status[1]); staProtocol.setHighErr(status[2]); staProtocol.setLeftErr(status[3]); staProtocol.setRightErr(status[4]); staProtocol.setWeightErr(status[5]); staProtocol.setBarcodeErr(status[6]); } } // ArrayList<Integer> staNoErrs = staNosErrList; // int staNoErrsSize = staNoErrs.size(); // OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.800", (short) (staNoErrsSize*8)); // if (resultErr.IsSuccess){ // for (int i = 0;i<3;i++){ // Integer siteId = staNoErrs.get(i); // 站点编号 // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4+2, 1); // StaProtocol staProtocol = station.get(siteId); // staProtocol.setFrontErr(status[0]); // staProtocol.setBackErr(status[1]); // staProtocol.setHighErr(status[2]); // staProtocol.setLeftErr(status[3]); // staProtocol.setRightErr(status[4]); // staProtocol.setWeightErr(status[5]); // staProtocol.setBarcodeErr(status[6]); // } // } OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB13.2", (short) (staNoSize*4)); if (resultErr2.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*4, 1); StaProtocol staProtocol = station.get(siteId); staProtocol.setBreakerErr(status[0]); staProtocol.setInfraredErr(status[1]); staProtocol.setOutTimeErr(status[2]); staProtocol.setSeizeSeatErr(status[3]); staProtocol.setWrkYgoodsN(status[4]); staProtocol.setInverterErr(status[5]); staProtocol.setContactErr(status[6]); staProtocol.setUpcontactErr(status[7]); } } OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB13.400", (short) 3); if (resultErr3.IsSuccess) { if (staError1 == null){ staError1 = new StaError1(); } boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, 0, 3); staError1.setEMERGENCY_Stop_Core(status[0]); staError1.setEMERGENCY_STOP1(status[1]); staError1.setEMERGENCY_STOP2(status[2]); staError1.setEMERGENCY_STOP3(status[3]); staError1.setEMERGENCY_STOP4(status[4]); staError1.setDoor_EMERGENCY_STOP1(status[5]); staError1.setDoor_EMERGENCY_STOP2(status[6]); staError1.setDoor_EMERGENCY_STOP3(status[7]); staError1.setDoor_EMERGENCY_STOP4(status[8]); staError1.setDoor_EMERGENCY_STOP5(status[9]); staError1.setDoor_EMERGENCY_STOP6(status[10]); staError1.setDoor_Open_Err1(status[11]); staError1.setDoor_Open_Err1(status[12]); staError1.setDoor_Open_Err1(status[13]); staError1.setDoor_Open_Err1(status[14]); staError1.setDoor_Open_Err1(status[15]); staError1.setDoor_Open_Err1(status[16]); } // OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB13.2", (short) (staNoSize*4)); // if (resultErr2.IsSuccess) { // for (int i = 0; i < staNoSize; i++) { // Integer siteId = staNos.get(i); // 站点编号 // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*4, 1); // StaProtocol staProtocol = station.get(siteId); // staProtocol.setBreakerErr(status[0]); // staProtocol.setInfraredErr(status[1]); // staProtocol.setOutTimeErr(status[2]); // staProtocol.setSeizeSeatErr(status[3]); // staProtocol.setWrkYgoodsN(status[4]); // staProtocol.setInverterErr(status[5]); // staProtocol.setContactErr(status[6]); // staProtocol.setUpcontactErr(status[7]); // // } // } // OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB13.400", (short) 3); // if (resultErr3.IsSuccess) { // if (staError1 == null){ // staError1 = new StaError1(); // } // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, 0, 3); // staError1.setEMERGENCY_Stop_Core(status[0]); // staError1.setEMERGENCY_STOP1(status[1]); // staError1.setEMERGENCY_STOP2(status[2]); // staError1.setEMERGENCY_STOP3(status[3]); // staError1.setEMERGENCY_STOP4(status[4]); // // staError1.setDoor_EMERGENCY_STOP1(status[5]); // staError1.setDoor_EMERGENCY_STOP2(status[6]); // staError1.setDoor_EMERGENCY_STOP3(status[7]); // staError1.setDoor_EMERGENCY_STOP4(status[8]); // staError1.setDoor_EMERGENCY_STOP5(status[9]); // staError1.setDoor_EMERGENCY_STOP6(status[10]); // // staError1.setDoor_Open_Err1(status[11]); // staError1.setDoor_Open_Err1(status[12]); // staError1.setDoor_Open_Err1(status[13]); // staError1.setDoor_Open_Err1(status[14]); // staError1.setDoor_Open_Err1(status[15]); // staError1.setDoor_Open_Err1(status[16]); // // } if (result.IsSuccess) { if (result1.IsSuccess && result2.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); @@ -416,14 +496,25 @@ } ArrayList<Integer> staNos = getStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); Integer siteId = staProtocol.getSiteId(); // 获取该站点对应的偏移量 Integer offset = siteOffsetMap.get(siteId); Integer offset2 = getOffsetBySiteId(siteId); Integer offset3 = getOffsetBySiteId2(siteId); OperateResult write = null; OperateResult write1 = null; //任务下发次数 int writeCount = 0; do { write = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo()); // 工作号 Thread.sleep(200); write1 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo().shortValue()); // 目标站 if(siteId > 1028){ write = siemensS7Net.Write("DB101." + (offset + offset2), staProtocol.getWorkNo()); // 工作号 Thread.sleep(200); write1 = siemensS7Net.Write("DB101." + (offset + offset2 + 12), staProtocol.getStaNo()); // 目标站 }else{ write = siemensS7Net.Write("DB100." + (offset + offset2), staProtocol.getWorkNo()); // 工作号 Thread.sleep(200); write1 = siemensS7Net.Write("DB100." + (offset + offset2 + 12), staProtocol.getStaNo()); // 目标站 } if(write.IsSuccess && write1.IsSuccess){ log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); break; src/main/resources/application.yml
@@ -8,8 +8,8 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver # url: jdbc:sqlserver://localhost:1433;databasename=jshdasrs url: jdbc:sqlserver://10.10.10.235:1433;databasename=jshdasrs url: jdbc:sqlserver://localhost:1433;databasename=jshdasrs # url: jdbc:sqlserver://10.10.10.235:1433;databasename=jshdasrs username: sa password: sa@123 # url: jdbc:sqlserver://192.168.4.191:50948;databasename=jshdasrs @@ -175,7 +175,7 @@ # RGV穿梭车1 rgv[0]: id: 1 ip: 10.10.10.60 ip: 10.10.10.190 port: 502 rack: 0 slot: 0 @@ -292,7 +292,7 @@ # 输送线1 devp[0]: id: 1 ip: 10.10.10.50 ip: 10.10.10.51 port: 102 rack: 0 slot: 0 src/main/resources/mapper/WrkMastStaMapper.xml
@@ -17,6 +17,8 @@ <result column="line_number" property="lineNumber" /> <result column="wrk_type" property="wrkType" /> <result column="bign_time" property="bignTime" /> <result column="work_sta" property="workSta"/> <result column="rgv_no" property="rgvNo"/> </resultMap> @@ -94,7 +96,7 @@ order by line_number,id </select> <select id="selectByWorkSta" resultMap="BaseResultMap"> select * select top 1 * from asr_wrk_mast_sta where work_sta = #{workSta} and rgv_no = #{rgvNo} </select>