src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -123,6 +123,13 @@ @TableField("wrk_crn") private Integer wrkCrn; @ApiModelProperty(value= "") @TableField("matnr1") private Integer matnr1; @ApiModelProperty(value= "") @TableField("matnr2") private Integer matnr2; public WrkMastSta() {} public WrkMastSta(Long wrkNo,Integer wrkStart,Integer wrkEnd,Integer staStart,Integer staEnd,Date createTime,Date updateTime,Integer type,Integer wrkSts,Integer lineNumber,Integer wrkType,Date bignTime,Integer wrkCrn) { src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2507,6 +2507,8 @@ short sta1 = 0; short souSta2 = 0; short sta2 = 0; short matnr = 0; short matnr2 = 0; //工位一任务 for (RgvSlave.Sta inStn : rgvSlave.getInStn()){ @@ -2534,9 +2536,19 @@ } workNo1 = workNo++; souSta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getSourceStaNo()); sta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getStaNo()); if (inStn.getSourceStaNo() == 4007 && staProtocol.getTongType() == 1){ sta1 = Utils.getRgvStaNo(rgvSlave.getId(),2103); } else if (inStn.getSourceStaNo() == 4007 && staProtocol.getTongType() == 2) { sta1 = Utils.getRgvStaNo(rgvSlave.getId(),2002); }else { sta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getStaNo()); } work1 = true; if (inStn.getSourcePlcId() == 4){ matnr = staProtocol.getMatnr(); } devpThread.setPakMk(inStn.getSourceStaNo(),false); break; } } @@ -2573,6 +2585,9 @@ souSta2 = inStn.getSourceStaNo().shortValue(); sta2 = inStn.getStaNo().shortValue(); work2 = true; if (inStn.getSourcePlcId() == 4){ matnr2 = staProtocol.getMatnr(); } devpThread.setPakMk(inStn.getSourceStaNo(),false); break; } @@ -2594,12 +2609,15 @@ command.setDestinationStaNo2(sta2); // 目标站 command.setAckFinish2(false); // 任务完成确认位 command.setMatnr(matnr); command.setMatnr2(matnr2); if (workNo1 == 0 && workNo2 !=0){ command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 取放货 command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 2取放货 } else if (workNo1 != 0 && workNo2 ==0) { command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 取放货 command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 1取放货 }else { command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: 取放货 command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: all取放货 } command.setCommand(false); rgvTaskSave(command); @@ -2627,23 +2645,24 @@ } //工位一任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 1) { if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 0) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1()); if (Cools.isEmpty(wrkMastSta)){ log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1()); continue; } for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){ SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getSourcePlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getSourceStaNo()); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk()){ // staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); // staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); staProtocol.setWorkNo(wrkMastSta.getWrkNo().shortValue()); staProtocol.setStaNo(wrkMastSta.getWrkEnd().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { continue; } @@ -2656,15 +2675,15 @@ } //工位二任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 1) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2()); if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 0) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo2(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2()); if (Cools.isEmpty(wrkMastSta)){ log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo2()); continue; } for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){ SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getSourcePlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getSourceStaNo()); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo()); if (staProtocol == null) { continue; } else { @@ -2672,16 +2691,122 @@ } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk()){ // staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); // staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { continue; } //// staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); // if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { // continue; // } } } MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(4,new RgvCommand())); log.info("{}号rgv工位二工作完成复位,工作号:{}",rgvSlave.getId(),wrkMastSta.getWrkNo2()); } } } //二号rgv输送线命令下发 public synchronized void RGV2Taskput() { for (RgvSlave rgvSlave:slaveProperties.getRgv()) { if (rgvSlave.getId() !=2){ continue; } ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (Cools.isEmpty(rgvProtocol)){ continue; }else { rgvProtocol = rgvProtocol.clone(); } //工位一任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.OUTSTN1 && rgvProtocol.getLoaded1() == 1) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1()); if (Cools.isEmpty(wrkMastSta)){ log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1()); continue; } for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){ SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (outStn.getStaPlcId() == 2){ if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isPakMk()){ staProtocol.setWorkNo(wrkMastSta.getWrkNo().shortValue()); staProtocol.setStaNo((short) 2106); staProtocol.setMatnr(wrkMastSta.getMatnr1().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { continue; } } } } } //工位二任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.OUTSTN8 && rgvProtocol.getLoaded1() == 1) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2()); if (Cools.isEmpty(wrkMastSta)){ log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo2()); continue; } for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){ SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (outStn.getStaPlcId() == 2){ if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isPakMk()){ staProtocol.setWorkNo(wrkMastSta.getWrkNo2().shortValue()); staProtocol.setStaNo((short) 2106); staProtocol.setMatnr(wrkMastSta.getMatnr2().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { continue; } } } } } } } public synchronized void RGV2TaskOver() { for (RgvSlave rgvSlave:slaveProperties.getRgv()) { if (rgvSlave.getId() !=2){ continue; } ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (Cools.isEmpty(rgvProtocol)){ continue; }else { rgvProtocol = rgvProtocol.clone(); } //工位一任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 0) { MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(3,new RgvCommand())); log.info("{}号rgv工位一工作完成复位,工作号:{}",rgvSlave.getId(),rgvProtocol.getTaskNo1()); } //工位二任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 0) { MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(4,new RgvCommand())); log.info("{}号rgv工位二工作完成复位,工作号:{}",rgvSlave.getId(),rgvProtocol.getTaskNo2()); } } } @@ -2705,6 +2830,8 @@ wrkMastSta.setUpdateTime(now); wrkMastSta.setWrkCrn(command.getRgvNo()); wrkMastSta.setWrkType(command.getTaskMode().intValue()); wrkMastSta.setMatnr1(command.getMatnr().intValue()); wrkMastSta.setMatnr2(command.getMatnr2().intValue()); return wrkMastStaService.insert(wrkMastSta); } src/main/java/com/zy/asrs/utils/Utils.java
@@ -40,7 +40,8 @@ public static short getRgvEndStaNo(Integer rgvNo,Integer staNo){ Map<Integer, Integer> rgv1Map = new HashMap<>(); Map<Integer, Integer> rgv2Map = new HashMap<>(); rgv2Map.put(4007,2103); rgv2Map.put(4002,4001); rgv2Map.put(4011,4010); rgv2Map.put(2101,2102); Map<Integer, Integer> rgv3Map = new HashMap<>(); switch (rgvNo){ case 1: src/main/java/com/zy/core/MainProcess.java
@@ -75,8 +75,11 @@ // mainService.crn5StnToOutStn(); //rgv任务 mainService.RGVTaskPut(); //rgv任务完成 //rgv1,3任务完成 mainService.RGVTaskOver(); //rgv2任务完成 mainService.RGV2Taskput(); mainService.RGV2TaskOver(); } catch (Exception e) { src/main/java/com/zy/core/enums/RgvModeType.java
@@ -10,6 +10,8 @@ HAND(1, "手动"), HALF_AUTO(2, "半自动"), AUTO(3, "自动"), OUTSTN1(7,"工作位1请求出站"), OUTSTN8(8,"工作位1请求出站"), AUTO2(100, "其它"), ; src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -11,8 +11,9 @@ PICK_WAIT((short) 2, "取货等待"), PICK_WORKING((short) 3, "取货中"), RELEASE_WALK((short) 4, "放货走行"), RELEASE_WAIT((short) 5, "放货等待"), RELEASE_WORKING((short) 6, "放货中"), OUTSTN1((short)5,"工作位1请求出站"), OUTSTN8((short)6,"工作位2请求出站"), WALKING((short) 9, "走行中"), WAITING((short) 90, "工位一任务完成等待WCS确认"), WAITING2((short) 91, "工位二任务完成等待WCS确认"), src/main/java/com/zy/core/model/RgvSlave.java
@@ -24,6 +24,8 @@ private Integer sourceStaNo;//源站 private Integer sourcePlcId; private Integer staNo;//目标站 private Integer staPlcId; src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -53,6 +53,10 @@ @JSONField(serialize = false) private RgvTaskModeType taskModeType; private Short matnr; private Short matnr2; //**************工位2************** src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -11,7 +11,7 @@ import java.util.Map; @Data public class RgvProtocol { public class RgvProtocol implements Cloneable{ private Integer RgvNo; src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -22,6 +22,10 @@ private Short staNo; // ---------------------------------------------------------------- // 物料代码 private Short matnr; // ---------------------------------------------------------------- // 自动 private boolean autoing; @@ -87,6 +91,7 @@ private boolean force = false; private short amount = 0; private Short tongType = 0; public Boolean isErr(){ if (frontErr || backErr || highErr || leftErr || rightErr || weightErr || barcodeErr){ @@ -107,7 +112,7 @@ basDevp.setLocType1((short) 0); // 高低类型{0:未知,1:低库位,2:高库位} basDevp.setLocType2((short) 0); // 宽窄类型{0:未知,1:窄库位,2:宽库位} basDevp.setLocType3((short) 0); // 轻重类型{0:未知,1:轻库位,2:重库位} basDevp.setLocType1(high != low && high ? (short) 2 : (short) 1); basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2); // basDevp. return basDevp; } src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -205,8 +205,9 @@ case 1: switch (slave.getId()){ case 1: case 2: read();break; case 2: read10();break; case 3: read30();break; case 4: @@ -216,7 +217,16 @@ break; // 写数据 ID+目标站 case 2: write((StaProtocol)task.getData()); switch (slave.getId()){ case 1: case 3: write((StaProtocol)task.getData()); case 2: write10((StaProtocol)task.getData());break; } break; default: break; @@ -359,6 +369,95 @@ } } private void read10() throws InterruptedException { ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (getStaNo().size() * 10)); if (result.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i * 10)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*10 + 4 )); // 目标站 staProtocol.setMatnr(siemensS7Net.getByteTransform().TransInt16(result.Content, i*10 + 6 )); // 目标站 } } Thread.sleep(200); OperateResultExOne<byte[]> result1 = null; result1 = siemensS7Net.Read("DB101.0", (short) (getStaNo().size() * 10)); if (result1.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(result1.Content, i*10+8, 2); StaProtocol staProtocol = station.get(siteId); 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]); // 低库位 staProtocol.setEmptyOutPalletRequire(status[8]); // 空托盘可出需求信号 staProtocol.setEmptyInPalletRequire(status[9]); // 空托盘可入需求信号 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } } // 条码扫描器 if(slave.getId() == 1) { Thread.sleep(200); OperateResultExOne<byte[]> result2 = null; result2 = siemensS7Net.Read("DB101.208.0", (short) (barcodeSize * 8)); if (result2.IsSuccess) { for (int i = 0; i < barcodeSize; i++) { String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1); if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { barcodeThread.setBarcode(barcode); } } } } if (result.IsSuccess && !Cools.isEmpty(result1) && result1.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 根据实时信息更新数据库 try { List<BasDevp> basDevps = new ArrayList<>(); for (Integer siteId : staNos) { StaProtocol staProtocol = station.get(siteId); basDevps.add(staProtocol.toSqlModel()); } BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class); if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) { throw new Exception("更新数据库数据失败"); } } catch (Exception e) { e.printStackTrace(); OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.error("更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); // log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } private void read30() throws InterruptedException { ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); @@ -440,7 +539,9 @@ staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 staProtocol.setAmount(matnr); staProtocol.setMatnr(matnr); staProtocol.setTongType(tongType); staProtocol.setLow(true); @@ -505,6 +606,32 @@ } /** * 写入 ID+目标站 =====> 单站点写入 */ private void write10(StaProtocol staProtocol) throws InterruptedException { if (null == staProtocol) { return; } ArrayList<Integer> staNos = getWriteStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); OperateResult write = siemensS7Net.Write("DB100." + index*8, staProtocol.getWorkNo().intValue()); // 工作号 OperateResult write1 = siemensS7Net.Write("DB100." + (index*8+4), staProtocol.getStaNo()); // 目标站 OperateResult write2 = siemensS7Net.Write("DB100." + (index*8+6), staProtocol.getMatnr()); // 目标站 if (!write.IsSuccess || !write1.IsSuccess || !write2.IsSuccess) { staProtocol = station.get(staProtocol.getSiteId()); if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { staProtocol.setPakMk(true); } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol))); log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol)); } } /** * 心跳 */ private void heartbeat(){ src/main/resources/application.yml
@@ -258,6 +258,10 @@ sourcePlcId: 4 staNo: 2103 staPlcId: 2 inStn[1]: sourceStaNo: 2003 sourcePlcId: 4 outStn[0]: staNo: 2103 staPlcId: 2 src/main/resources/mapper/WrkMastStaMapper.xml
@@ -19,6 +19,8 @@ <result column="bign_time" property="bignTime" /> <result column="wrk_crn" property="wrkCrn" /> <result column="wrk_no2" property="wrkNo2"/> <result column="matnr1" property="matnr1"/> <result column="matnr2" property="matnr2"/> </resultMap> <select id="selectByRgvNoandWrkNo" resultMap="BaseResultMap">