src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/MainProcess.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/StaProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensDevpThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-wcs.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -95,7 +95,7 @@ * 组托 * 入库站,根据条码扫描生成入库工作档,工作状态 2 */ public synchronized void generateStoreWrkFile(Integer mark) { public synchronized void generateStoreWrkFile(Integer mark) throws InterruptedException { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 @@ -115,43 +115,15 @@ staProtocol = staProtocol.clone(); } //调用外形检测 if (!shape(devp, staProtocol, devpThread, inSta)) { continue; } //LED LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); // 入出库模式判断 // if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; } // if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) { // continue; // } // 判断是否满足入库条件 if (!staProtocol.isLoading()){ continue; } String barcode11 = barcodeThread.getBarcode(); if (Cools.isEmpty(barcode11)){ if (staProtocol.isAutoing()&& !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 9999 && staProtocol.isPakMk() && staProtocol.getStamp()==2){ staProtocol.setStamp(3); News.info(""+mark+" - 7"+" - 扫码失败2 ===>> {}号条码扫描器检测条码信息:{},站点:{}", inSta.getBarcode(), barcode11, inSta.getStaNo()); staProtocol.setWorkNo((short) 9989); staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); // led 异常显示 if (ledThread != null) { String errorMsg = "扫码失败,请重试"; MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg)); } continue; } } if (staProtocol.isAutoing() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() > 9990 && staProtocol.getWorkNo()!=9999 && staProtocol.getWorkNo()!=9992 && staProtocol.getWorkNo()!=0 && staProtocol.isPakMk() && staProtocol.getStamp()>=2 && staProtocol.getStamp()!=3) {// && !Cools.isEmpty(barcode)) { News.warnNoLog(""+mark+" - 0"+" - 开始执行"); // try { // Thread.sleep(300); // }catch (Exception e){} String barcode = barcodeThread.getBarcode(); if(!Cools.isEmpty(barcode)) { @@ -184,6 +156,11 @@ } continue; } if (staProtocol.isAutoing() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() > 9990 && staProtocol.getWorkNo() != 9999 && staProtocol.getWorkNo() != 9992 && staProtocol.getWorkNo() != 0 && staProtocol.isPakMk()) { News.warnNoLog("" + mark + " - 0" + " - 开始执行"); // 判断重复工作档 WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); @@ -279,7 +256,7 @@ }else { News.errorNoLog(""+mark+" - 6"+" - 站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isAutoing()+"、可入信号:" + staProtocol.isInEnable() +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo() +"、锁定标记"+ staProtocol.isPakMk()+"、入库印记:" + staProtocol.getStamp()); + "、锁定标记" + staProtocol.isPakMk()); } } @@ -346,7 +323,7 @@ }else { News.errorNoLog(""+mark+" - 6"+" - 站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isLoading()+"、可入信号:" + staProtocol.isInEnable() +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo() +"、锁定标记"+ staProtocol.isPakMk()+"、入库印记:" + staProtocol.getStamp()); + "、锁定标记" + staProtocol.isPakMk()); } } } @@ -1467,7 +1444,7 @@ && staProtocol.isInEnable() && staProtocol.isEmptyMk() && (staProtocol.getWorkNo() > 9990 && staProtocol.getWorkNo() <= 9999) && staProtocol.isPakMk()&& staProtocol.getStamp()>=2) { && staProtocol.isPakMk()) { News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货"); try { @@ -1644,25 +1621,7 @@ if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) { continue; } // 命令下发 ------------------------------------------------------------------------------- // if (!commands.isEmpty()) { // if (led.getId() < 7) { // if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) { // News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); // continue; // } else { // ledThread.setLedMk(false); // } // } else { // if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) { // News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); // continue; // } else { // ledThread.setLedMk(false); // } // } // // } // 命令下发 ------------------------------------------------------------------------------- if (!commands.isEmpty()) { if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) { @@ -2242,4 +2201,58 @@ } } } public short wrkNo = 9999; private boolean shape(DevpSlave devp, StaProtocol staProtocol, DevpThread devpThread, DevpSlave.Sta sta) throws InterruptedException { // 尺寸检测异常 boolean back = false; String errMsg = ""; if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; } if (!back && staProtocol.isBackErr()) { errMsg = "后超限"; back = true; } if (!back && staProtocol.isHighErr()) { errMsg = "高超限"; back = true; } if (!back && staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; } if (!back && staProtocol.isRightErr()) { errMsg = "右超限"; back = true; } if (!back && staProtocol.isWeightErr()) { errMsg = "超重"; back = true; } if (!back && staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; } // 退回 if (back) { if (!staProtocol.isLoading()) { return true; } if (!staProtocol.isPakMk()) { return true; } staProtocol.setWorkNo(wrkNo); News.warn("{}入库回退:{},任务号:{}", sta.getStaNo(), errMsg, wrkNo); staProtocol.setStaNo(sta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); MessageQueue.offer(SlaveType.Led, sta.getLed(), new Task(5, errMsg)); Thread.sleep(500); } return true; } } src/main/java/com/zy/core/MainProcess.java
@@ -44,9 +44,7 @@ } // 演示 mainService.crnDemoOfLocMove1(); // 入出库模式切换函数 // mainService.ioConvert(); // mainService.crnDemoOfLocMove1(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 mainService.generateStoreWrkFile(1); // 组托 mainService.generateStoreWrkFile0(2); // WMS入库 @@ -72,6 +70,9 @@ mainService.outOfDevp(11); // 堆垛机回原点 //mainService.crnRebackHp(); //空托盘自动出库 // mainService.autoEmptyOut(); // //空托盘自动入库 src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -56,8 +56,30 @@ private String nearbySta; private String barcode; //lfd入库印记 当stamp>=2时才入库 private Integer stamp = 0; // 外形检测 ------------------------------------------------------------------------ // 前超限 private boolean frontErr = false; // 后超限 private boolean backErr = false; // 高超限 private boolean highErr = false; // 左超限 private boolean leftErr = false; // 右超限 private boolean rightErr = false; // 超重 private boolean weightErr = false; // 扫码失败 private boolean barcodeErr = false; private boolean weight = false; public BasDevp toSqlModel(){ BasDevp basDevp = new BasDevp(); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -47,7 +47,8 @@ // // }}; public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(101);add(102); add(101); add(102); }}; @@ -116,6 +117,7 @@ } } /** * 初始化站点状态 */ @@ -192,20 +194,7 @@ staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result4.Content, i*2)); // 目标站 } } // Thread.sleep(200); // OperateResultExOne<byte[]> result0 = siemensS7Net.Read("DB101.0", (short) 186); // if (result0.IsSuccess) { // for (int i = 0; i < 93; 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.setStaNo(siemensS7Net.getByteTransform().TransInt16(result0.Content, i*2)); // 目标站 // } // } //条码扫描器 Thread.sleep(200); OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100.200",(short)(barcodeSize*8)); @@ -218,7 +207,20 @@ barcodeThread.setBarcode(barcode); } } } //外形检测 OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.42", (short) 8); if (resultErr.IsSuccess) { boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, 0, 1); StaProtocol staProtocol = station.get(304); 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]); } Thread.sleep(200); @@ -240,21 +242,12 @@ if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } if (staProtocol.getStamp()>=2 && !staProtocol.isLoading()){ staProtocol.setStamp(0); }else if (staProtocol.getStamp()<2 && staProtocol.isLoading()){ //lfd入库印记 当stamp>=2时才入库 staProtocol.setStamp(staProtocol.getStamp()+1); } } } if (result.IsSuccess && result1.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 根据实时信息更新数据库 try { List<BasDevp> basDevps = new ArrayList<>(); @@ -320,8 +313,7 @@ writeCount++; log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); } } else { } else { writeCount++; log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); } src/main/resources/application-wcs.yml
New file @@ -0,0 +1,77 @@ # 下位机配置 wcs-slave: inSta: 102,104,110,115 outSta: 101,103,111,116 # 双深 doubleDeep: true # 双深库位排号 doubleLocs: 31,34 # 一个堆垛机负责的货架排数 groupCount: 4 # 堆垛机1 crn[0]: id: 1 ip: 10.10.11.7 port: 6000 rack: 0 slot: 0 # 偏移量,当堆垛机站点列号=1时,偏移量=2 offset: 2 demo: false # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 102 row: 33 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 102 row: 33 bay: 1 lev: 1 # 输送线1 devp[0]: id: 1 ip: 10.10.11.10 port: 102 rack: 0 slot: 0 # 入库口1 inSta[0]: staNo: 102 barcode: ${wcs-slave.barcode[0].id} backSta: 101 led: ${wcs-slave.led[0].id} # 空板入库口1 emptyInSta[0]: staNo: 102 barcode: ${wcs-slave.barcode[0].id} backSta: 101 led: ${wcs-slave.led[0].id} # 拣料入库口1 pickSta[0]: staNo: 102 barcode: ${wcs-slave.barcode[0].id} backSta: 101 led: ${wcs-slave.led[0].id} # 出库口1 outSta[0]: staNo: 102 led: ${wcs-slave.led[0].id} # 条码扫描仪1 barcode[0]: id: 1 ip: 10.10.10.121 port: 51236 # LED1 led[0]: id: 1 ip: 10.10.11.210 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} # 入库站和出库站 staArr: 102,101 src/main/resources/application.yml
@@ -4,6 +4,8 @@ context-path: /@pom.build.finalName@ spring: profiles: active: wcs application: name: @pom.build.finalName@ datasource: @@ -35,80 +37,3 @@ wms: url: 127.0.0.1:8080/wms # 下位机配置 wcs-slave: inSta: 102,104,110,115 outSta: 101,103,111,116 # 双深 doubleDeep: true # 双深库位排号 doubleLocs: 31,34 # 一个堆垛机负责的货架排数 groupCount: 4 # 堆垛机1 crn[0]: id: 1 ip: 10.10.11.7 port: 6000 rack: 0 slot: 0 # 偏移量,当堆垛机站点列号=1时,偏移量=2 offset: 2 demo: false # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 102 row: 33 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 102 row: 33 bay: 1 lev: 1 # 输送线1 devp[0]: id: 1 ip: 10.10.11.10 port: 102 rack: 0 slot: 0 # 入库口1 inSta[0]: staNo: 102 barcode: ${wcs-slave.barcode[0].id} backSta: 101 led: ${wcs-slave.led[0].id} # 空板入库口1 emptyInSta[0]: staNo: 102 barcode: ${wcs-slave.barcode[0].id} backSta: 101 led: ${wcs-slave.led[0].id} # 拣料入库口1 pickSta[0]: staNo: 102 barcode: ${wcs-slave.barcode[0].id} backSta: 101 led: ${wcs-slave.led[0].id} # 出库口1 outSta[0]: staNo: 102 led: ${wcs-slave.led[0].id} # 条码扫描仪1 barcode[0]: id: 1 ip: 10.10.10.121 port: 51236 # LED1 led[0]: id: 1 ip: 10.10.11.210 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102