| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.baomidou.mybatisplus.mapper.Wrapper; |
| | | import com.baomidou.mybatisplus.plugins.Page; |
| | | import com.core.common.Cools; |
| | | import com.core.common.DateUtils; |
| | | import com.core.exception.CoolException; |
| | |
| | | import com.zy.core.thread.LedThread; |
| | | import com.zy.core.thread.RgvThread; |
| | | import com.zy.core.thread.SiemensDevpThread; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private BasRgvMapService basRgvMapService; |
| | | @Autowired |
| | | private BasCrnOptService crnOptService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | |
| | | private boolean isToOrigin; |
| | | |
| | | public Integer wrkNo = 10000; |
| | | |
| | | /*堆垛机入出库任务下发控制参数*/ |
| | | // Integer ioControl=configService.selectCrnIo(Integer mark); |
| | | |
| | | /** |
| | | * 组托 |
| | |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = ""; |
| | | boolean fail = false; |
| | | // 检测是否有出库任务 如果有出库任务 入库就停止 |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 12).in("io_type",101,103,104,107,110)); |
| | | // 检测104站(堆垛机出库站 入库站)是否有物 如果有物没有工作号 入库停止 如果有物工作号是出库 入库停止 如果有物工作号是入库 可以入库 如果有物工作号不存在 入库停止 |
| | | StaProtocol staProtocol104 = devpThread.getStation().get(104); |
| | | if (staProtocol104 == null){ |
| | | log.error("104站点信息未获取"); |
| | | continue; |
| | | } |
| | | //104站有物 有工作号 判断这个任务的类型 |
| | | WrkMast wrkMast1 = null; |
| | | if (staProtocol104.isLoading() && staProtocol104.getWorkNo() != 0){ |
| | | wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol104.getWorkNo())); |
| | | } |
| | | |
| | | if (wrkMast1 != null){ |
| | | if (wrkMast1.getIoType() > 100){ |
| | | fail = true; |
| | | } |
| | | } |
| | | |
| | | // 检测102站是否有物 有物继续向下执行 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | |
| | | // 如果工作号不是 9999 (入库任务) 不向下执行 |
| | | if (staProtocol.getWorkNo() != 9999){ |
| | | continue; |
| | | } |
| | | |
| | | if (staProtocol.isFrontErr()) { |
| | | errMsg = "前超限"; |
| | | back = true; |
| | |
| | | errMsg = "扫码失败"; |
| | | back = true; |
| | | } |
| | | // 判断托盘码格式 |
| | | if (!back &&(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode))){ |
| | | errMsg = "托盘码格式有误--->" + barcode; |
| | | back = true; |
| | | } |
| | | if (!back && (!barcode.startsWith("5") && !barcode.startsWith("6") && !barcode.startsWith("7") && !barcode.startsWith("8"))) { |
| | | errMsg = "托盘码格式有误--->" + barcode; |
| | | back = true; |
| | | } |
| | | if (!back && !wrkMastList.isEmpty()) { |
| | | errMsg = "堆垛机有出库任务,入库停止"; |
| | | back = true; |
| | | }if (!back && staProtocol104.isLoading() && staProtocol104.getWorkNo() == 0 && (barcode.startsWith("6") || barcode.startsWith("5"))){ |
| | | errMsg = "104站有物但是无工作号,请检查"; |
| | | back = true; |
| | | }if (!back && ((wrkMast1 != null && fail))){ |
| | | errMsg = "1号堆垛机有出库任务,入库停止"; |
| | | back = true; |
| | | }if (!back && (staProtocol104.isLoading() && wrkMast1 == null) && (barcode.startsWith("5") || barcode.startsWith("6"))){ |
| | | errMsg = "104站有物但是对应的工作号无工作档,请检查"; |
| | | back = true; |
| | | } |
| | | |
| | | // 退回 |
| | | if (back) { |
| | | log.info("errmsg: " + errMsg); |
| | | // News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); |
| | | |
| | | if (!staProtocol.isLoading()) { |
| | |
| | | if (!staProtocol.isPakMk()) { |
| | | continue; |
| | | } |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setWorkNo(wrkNo);//退回 工作号:10000 |
| | | News.info("{}PLC入库回退:{},任务号:{}", inSta.getStaNo(), errMsg, wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta()); |
| | | log.error("输送线下发(全板退回):" + wrkNo + "," + inSta.getBackSta()); |
| | | break;//超限托盘退回不生成工作档 |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | |
| | | && staProtocol.isLoading() |
| | | && staProtocol.isInEnable() |
| | | && !staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk()) { |
| | | && staProtocol.isPakMk() |
| | | && staProtocol.getWorkNo()==9999) { |
| | | if (Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) { |
| | | News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); |
| | | |
| | | staProtocol.setWorkNo(wrkNo); |
| | | News.info("{}barcode入库回退:{},任务号:{}", inSta.getStaNo(), errMsg, wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta()); |
| | | log.error("输送线下发(扫码全板退回):" + wrkNo + "," + inSta.getBackSta()); |
| | | continue; |
| | | } |
| | | // 判断重复工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); |
| | | if (wrkMast != null) { |
| | | // int wrkNo1 = basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo())); |
| | | // if (wrkNo1 != 0){ |
| | | // if (ledThread != null) { |
| | | // News.error(methodName + ":扫码失败,请重试"); |
| | | // } |
| | | // |
| | | // } |
| | | News.error(barcode + "条码已存在状态为( 2.设备上走 )的数据,请查看WCS输送线界面,工作号={}", wrkMast.getWrkNo()); |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, barcode + "条码已存在状态为( 2.设备上走 )的任务,工作号=" + wrkMast.getWrkNo())); |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | if (!result) { |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } |
| | | continue; |
| | | // barcodeThread.setBarcode(""); |
| | | // staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | // staProtocol.setStaNo(RouteUtils.SouStaEnd(null,wrkMast.getSourceStaNo())); |
| | | // devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | // boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | // log.info("输送线下发(存在设备上走的工作档,直接下发!)):"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); |
| | | // |
| | | // ledThread.errorReset(); |
| | | // log.info("组托请求后LED错误清除"); |
| | | // |
| | | // if (!result) { |
| | | // News.error(methodName + ":更新plc站点信息失败"); |
| | | // log.error("输送线下发(存在设备上走的工作档,直接下发!)==>更新plc站点信息失败"); |
| | | // |
| | | //// throw new CoolException("更新plc站点信息失败"); |
| | | // continue; |
| | | // } |
| | | |
| | | } |
| | | WrkMast checkPick = wrkMastService.selectOne(new EntityWrapper<WrkMast>() |
| | | .eq("barcode", barcode) |
| | | .in("io_type", 107, 103, 57)); |
| | | .in("io_type", 107, 103, 104)); |
| | | if (!Cools.isEmpty(checkPick)) { |
| | | continue; |
| | | } |
| | |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | locTypeDto.setLocType1((short) 1); |
| | | locTypeDto.setLocType1(staProtocol.toSqlModel().getLocType1()); |
| | | param.setBarcode(barcode); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(inSta.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | param.setLocType1(locTypeDto.getLocType1()); // 高低 |
| | | param.setWeight(staProtocol.getWeight()); // 重量 |
| | | String response = new HttpHandler.Builder() |
| | | .setTimeout(30,TimeUnit.SECONDS) |
| | | .setUri(wmsUrl) |
| | |
| | | staProtocol.setStaNo(dto.getStaNo().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo()); |
| | | log.error("输送线下发(全板):" + dto.getWorkNo() + "," + dto.getStaNo()); |
| | | |
| | | ledThread.errorReset(); |
| | | log.error("组托请求后LED错误清除"); |
| | |
| | | } |
| | | } else { |
| | | if (jsonObject.getString("msg").equals("工作档已存在")) { |
| | | |
| | | //工作档已存在 再次进去 |
| | | // wrkMast = wrkMastMapper.selectPakInStepBarcode(barcode); |
| | | // if (wrkMast != null) { |
| | | // barcodeThread.setBarcode(""); |
| | | // staProtocol.setWorkNo(9999); |
| | | // //staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | // //staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo())); |
| | | // staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | // devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | // boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | // log.error("输送线下发2:" + wrkMast.getWrkNo() + "," + wrkMast.getStaNo()); |
| | | // ledThread.errorReset(); |
| | | // log.error("组托请求后LED错误清除"); |
| | | // if (!result) { |
| | | // News.error(methodName + ":更新plc站点信息失败"); |
| | | // |
| | | // throw new CoolException("更新plc站点信息失败"); |
| | | // } |
| | | // } |
| | | |
| | | continue; |
| | | } |
| | | staProtocol.setWorkNo(wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | // |
| | | // if (ledThread != null) { |
| | | log.error("输送线下发(全板退回):" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo()); |
| | | |
| | | String errorMsg = jsonObject.getString("msg"); |
| | | if (!Cools.isEmpty(errorMsg)) { |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); |
| | | } |
| | | // } |
| | | // News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | } |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 组托 ===》执行完成"); |
| | | News.infoNoLog(""+mark+" - 0"+" - 组托 ===》执行完成"); |
| | | |
| | | } |
| | | |
| | |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // // 入出库模式判断 |
| | | // 入出库模式判断 |
| | | if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { |
| | | continue; |
| | | } |
| | |
| | | // News.error("站点信息未获得"); |
| | | continue; |
| | | } |
| | | // 检测102站是否有物 有物继续向下执行 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | // 如果工作号不是 9999 (入库任务) 不向下执行 |
| | | if (staProtocol.getWorkNo() != 9999){ |
| | | continue; |
| | | } |
| | | // 检测是否有出库任务 如果有出库任务 入库就停止 |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 12).in("io_type",101,103,104,107,110)); |
| | | // 检测104站(堆垛机出库站 入库站)是否有物 如果有物没有工作号 入库停止 如果有物工作号是出库 入库停止 如果有物工作号是入库 可以入库 如果有物工作号不存在 入库停止 |
| | | StaProtocol staProtocol104 = devpThread.getStation().get(104); |
| | | if (staProtocol104 == null){ |
| | | log.error("104站点信息未获取"); |
| | | continue; |
| | | } |
| | | //104站有物 有工作号 判断这个任务的类型 |
| | | WrkMast wrkMast1 = null; |
| | | if (staProtocol104.isLoading() && staProtocol104.getWorkNo() != 0){ |
| | | wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol104.getWorkNo())); |
| | | } |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | boolean fail = false; |
| | | String errMsg = ""; |
| | | if (!back && staProtocol.isFrontErr()) { |
| | | |
| | | if (wrkMast1 != null){ |
| | | if (wrkMast1.getIoType() > 100){ |
| | | fail = true; |
| | | } |
| | | } |
| | | |
| | | if (staProtocol.isFrontErr()) { |
| | | errMsg = "前超限"; |
| | | back = true; |
| | | } |
| | |
| | | errMsg = "扫码失败"; |
| | | back = true; |
| | | } |
| | | if(staProtocol.getSiteId() > 400){ |
| | | back = false; |
| | | // 判断托盘码格式 |
| | | if (!back &&(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode))){ |
| | | errMsg = "托盘码格式有误--->" + barcode; |
| | | back = true; |
| | | } |
| | | if (!back && (!barcode.startsWith("5") && !barcode.startsWith("6") && !barcode.startsWith("7") && !barcode.startsWith("8"))) { |
| | | errMsg = "托盘码格式有误--->" + barcode; |
| | | back = true; |
| | | } |
| | | if (!back && !wrkMastList.isEmpty()) { |
| | | errMsg = "堆垛机有出库任务,入库停止"; |
| | | back = true; |
| | | }if (!back && staProtocol104.isLoading() && staProtocol104.getWorkNo() == 0 && (barcode.startsWith("6") || barcode.startsWith("5"))){ |
| | | errMsg = "104站有物但是无工作号,请检查"; |
| | | back = true; |
| | | }if (!back && (wrkMast1 != null && fail)){ |
| | | errMsg = "1号堆垛机有出库任务,入库停止"; |
| | | back = true; |
| | | }if (!back && (staProtocol104.isLoading() && Cools.isEmpty(wrkMast1)) && (barcode.startsWith("5") || barcode.startsWith("6"))){ |
| | | errMsg = "104站有物但是对应的工作号无工作档,请检查"; |
| | | back = true; |
| | | } |
| | | |
| | | // 退回 |
| | | if (back) { |
| | | log.info("errmsg: " + errMsg); |
| | | // News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); |
| | | News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", pickSta.getStaNo(), errMsg); |
| | | MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(5, errMsg)); |
| | | if (!staProtocol.isLoading()) { |
| | | continue; |
| | |
| | | } |
| | | staProtocol.setWorkNo(wrkNo); |
| | | News.info("{}入库回退:{},任务号:{}", pickSta.getStaNo(), errMsg, wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(pickSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发1:" + 9999 + "," + pickSta.getBackSta()); |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed()); |
| | | |
| | | // led 异常显示 |
| | |
| | | MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(5, errMsg)); |
| | | } |
| | | continue; |
| | | } |
| | | if(staProtocol.getSiteId() < 400){ |
| | | if (!Cools.isEmpty(barcode)) { |
| | | News.infoNoLog("" + mark + " - 1" + " - {}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); |
| | | if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) { |
| | | continue; |
| | | } |
| | | } else { |
| | | continue; |
| | | } |
| | | |
| | | |
| | | if (!Cools.isEmpty(barcode)) { |
| | | // News.info(""+mark+" - 1"+" - {}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); |
| | | if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) { |
| | | continue; |
| | | } |
| | | } else { |
| | | continue; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // // 入出库模式判断 |
| | | // 入出库模式判断 |
| | | // if (devpThread.ioMode != IoModeType.PAKIN_MODE) { continue; } |
| | | |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) { |
| | | News.warnNoLog("" + mark + " - 0" + " - 开始执行"); |
| | | WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); |
| | | if(staProtocol.getSiteId() > 400){ |
| | | wrkMast = wrkMastMapper.selectPickStep3(staProtocol.getWorkNo()); |
| | | } |
| | | // WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue()); |
| | | if (wrkMast == null) { |
| | | // 无拣料数据 |
| | |
| | | || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) { |
| | | continue; |
| | | } |
| | | |
| | | // 拣、盘、并 作业站转换 |
| | | // int stnNo = 0; |
| | | // if (wrkMast.getStaNo() == 109) { |
| | | // stnNo = 127; |
| | | // } else if (wrkMast.getStaNo() == 113) { |
| | | // stnNo = 128; |
| | | // } else { |
| | | // log.error("{}号任务数据异常!", wrkMast.getWrkNo()); |
| | | // } |
| | | // 获取目标站 |
| | | Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() |
| | | .eq("type_no", wrkMast.getIoType() - 50) |
| | |
| | | StaDesc staDesc = staDescService.selectOne(wrapper); |
| | | if (Cools.isEmpty(staDesc)) { |
| | | News.error("" + mark + " - 2" + " - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo()); |
| | | staProtocol.setWorkNo(wrkNo++); |
| | | staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue() - (short) 1)); |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setStaNo(pickSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发4:" + 9989 + "," + (pickSta.getStaNo().shortValue() - (short) 1)); |
| | | log.error("输送线下发(盘点、拣料、并板退回):" + wrkNo + "," + pickSta.getBackSta()); |
| | | //LED |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed()); |
| | | // led 异常显示 |
| | |
| | | |
| | | // 更新站点信息 且 下发plc命令 |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | if(staProtocol.getSiteId() < 400){ |
| | | staProtocol.setStaNo(Short.valueOf(wrkMast.getStaNo().toString())); |
| | | } |
| | | staProtocol.setStaNo(Short.valueOf(wrkMast.getStaNo().toString())); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发5:" + wrkMast.getWrkNo() + "," + wrkMast.getStaNo()); |
| | | log.error("输送线下发(盘点、拣料、并板):" + wrkMast.getWrkNo() + "," + wrkMast.getStaNo()); |
| | | if (!result) { |
| | | News.error("" + mark + " - 3" + " - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId()); |
| | | } |
| | |
| | | } |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 拣料、并板、盘点再入库 ===》执行完成"); |
| | | News.infoNoLog(""+mark+" - 0"+" - 拣料、并板、盘点再入库 ===》执行完成"); |
| | | } |
| | | |
| | | |
| | |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | //判断是不是2号堆垛机的106出库站 |
| | | if (staProtocol.getSiteId() == 106 && staProtocol.isLoading()){ |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, 2); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) { |
| | | // 移动中 |
| | | continue; |
| | | } |
| | | if (crnProtocol.modeType == CrnModeType.AUTO |
| | | && crnProtocol.statusType == CrnStatusType.WAITING |
| | | && crnProtocol.forkPosType == CrnForkPosType.HOME){ |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", crnProtocol.getTaskNo()).eq("wrk_sts",12)); |
| | | if (wrkMast == null){ |
| | | News.errorNoLog("2号堆垛机等待确认的工作档不存在"); |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMast.setCrnEndTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) != 0) { |
| | | // 复位堆垛机 |
| | | log.error("出库任务完成下发堆垛机复位,{}", wrkMast.getWrkNo()); |
| | | crnThread.setResetFlag(true); |
| | | } else { |
| | | News.error("" + mark + " - 1" + " - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo()); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) { |
| | | // 查询工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId()); |
| | |
| | | */ |
| | | public synchronized void crnIoExecute(Integer mark) { |
| | | |
| | | /*堆垛机入出库任务下发控制参数*/ |
| | | Integer ioControl=configService.selectCrnIo(); |
| | | |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | |
| | | crnProtocol.setLastIo("O"); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | // if (ioControl==1){ |
| | | // //入库优先 先执行入库再执行出库 |
| | | // Integer inCount=wrkMastService.selectIn(); |
| | | // if (inCount == 0 && basCrnp.getOutEnable().equals("Y")){ |
| | | // this.locToCrnStn(crn, crnProtocol, mark); // 出库 |
| | | // } |
| | | // if (basCrnp.getInEnable().equals("Y")){ |
| | | // this.crnStnToLoc(crn, crnProtocol, mark); // 入库 |
| | | // } |
| | | // }else if (ioControl==2){ |
| | | // //出库优先 先执行出库再执行入库 |
| | | // Integer outCount=wrkMastService.selectOut(); |
| | | // if (outCount==0 && basCrnp.getInEnable().equals("Y")){ |
| | | // this.crnStnToLoc(crn, crnProtocol, mark); // 入库 |
| | | // } |
| | | // if (basCrnp.getOutEnable().equals("Y")){ |
| | | // this.locToCrnStn(crn, crnProtocol, mark); // 出库 |
| | | // } |
| | | // }else if(ioControl==3){ |
| | | // //入出库交替执行 不做限制 |
| | | // // 如果最近一次是入库模式 |
| | | // if (crnProtocol.getLastIo().equals("I")) { |
| | | // if (basCrnp.getInEnable().equals("Y")) { |
| | | // //mark - 1 - .... |
| | | // this.crnStnToLoc(crn, crnProtocol, mark); // 入库 |
| | | // crnProtocol.setLastIo("O"); |
| | | // } else if (basCrnp.getOutEnable().equals("Y")) { |
| | | // //mark - 2 - .... |
| | | // this.locToCrnStn(crn, crnProtocol, mark); // 出库 |
| | | // crnProtocol.setLastIo("I"); |
| | | // } |
| | | // } |
| | | // // 如果最近一次是出库模式 |
| | | // else if (crnProtocol.getLastIo().equals("O")) { |
| | | // if (basCrnp.getOutEnable().equals("Y")) { |
| | | // this.locToCrnStn(crn, crnProtocol, mark); // 出库 |
| | | // crnProtocol.setLastIo("I"); |
| | | // } else if (basCrnp.getInEnable().equals("Y")) { |
| | | // this.crnStnToLoc(crn, crnProtocol, mark); // 入库 |
| | | // crnProtocol.setLastIo("O"); |
| | | // } |
| | | // } |
| | | // } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | // 库位移转 |
| | | //mark - 3 - .... |
| | | // this.locToLoc(crn, crnProtocol, mark); |
| | | this.locToLoc(crn, crnProtocol, mark); |
| | | // this.crnRebackHp(crnProtocol, crnThread); |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); |
| | | News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); |
| | | } |
| | | |
| | | /** |
| | |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位列 |
| | | // crnCommand.setSourcePosY((short)(wrkMast.getBarcode().startsWith("7")? 0:1)); // 源库位列 |
| | | crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) (locMast.getRow1() + slave.getOffset())); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) (locMast.getBay1() + slave.getOffset())); // 目标库位列 |
| | |
| | | // 获取工作状态为11(生成出库ID)的出库工作档 |
| | | // WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); |
| | | List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); |
| | | if (wrkMasts.isEmpty()) { |
| | | wrkMasts = wrkMastMapper.selectPakOutStep11To2(slave.getId(), 103); |
| | | } |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | if (wrkMast == null) { |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | | // 工作档状态判断 |
| | |
| | | } |
| | | // 获取堆垛机出库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getSourceStaNo()); |
| | | if (staProtocol == null) { |
| | | News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol); |
| | | break; |
| | | // continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | //工作档目标站为101 且 101有物 目标站为101 且工作档状态为12 15 14 停止给堆垛机下全板出库以外的任务 |
| | | if (wrkMast.getStaNo() == 101){ |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("sta_no", 101).in("wrk_sts", 12, 14, 15)); |
| | | StaProtocol staProtocol101 = devpThread.getStation().get(101); |
| | | StaProtocol staProtocol102 = devpThread.getStation().get(102); |
| | | StaProtocol staProtocol103 = devpThread.getStation().get(103); |
| | | if (staProtocol101 == null) { |
| | | News.infoNoLog("" + mark + " - 2" + " - 3" + " - 工作档目标站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol); |
| | | break; |
| | | } else { |
| | | staProtocol101 = staProtocol101.clone(); |
| | | } |
| | | if (staProtocol101.isLoading() || !Cools.isEmpty(wrkMastList) || staProtocol101.getWorkNo() != 0 || staProtocol102.isLoading() || staProtocol102.getWorkNo() != 0 || staProtocol103.isLoading() || staProtocol103.getWorkNo() != 0){ |
| | | break; |
| | | } |
| | | } |
| | | // StaProtocol staProtocol1 = staProtocol.getSiteId()==101?devpThread.getStation().get(crnStn.getStaNo() + 1):devpThread.getStation().get(crnStn.getStaNo() - 1); |
| | | // StaProtocol staProtocol1 = devpThread.getStation().get(crnStn.getStaNo() - 1); |
| | | // StaProtocol staProtocol1 = devpThread.getStation().get(crnStn.getStaNo() + 1); |
| | | // if (staProtocol1 == null) { |
| | | // News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol); |
| | | // break; |
| | | // } else { |
| | | // staProtocol1 = staProtocol1.clone(); |
| | | // } |
| | | // StaProtocol staProtocol2 = staProtocol.getSiteId()==101?devpThread.getStation().get(crnStn.getStaNo() + 2):devpThread.getStation().get(crnStn.getStaNo()); |
| | | // StaProtocol staProtocol2 = devpThread.getStation().get(crnStn.getStaNo() - 2); |
| | | // StaProtocol staProtocol2 = devpThread.getStation().get(crnStn.getStaNo() + 2); |
| | | // if (staProtocol2 == null) { |
| | | // News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol); |
| | | // break; |
| | | // } else { |
| | | // staProtocol2 = staProtocol2.clone(); |
| | | // } |
| | | //出入口输送线只允许存在一个托盘 |
| | | // if(staProtocol.isLoading() || staProtocol1.isLoading() || staProtocol2.isLoading() || staProtocol.getWorkNo() != 0 || staProtocol1.getWorkNo() != 0 || staProtocol2.getWorkNo() != 0) { |
| | | // break; |
| | | // } |
| | | |
| | | // // 入出库模式判断 |
| | | // if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } |
| | |
| | | break; |
| | | // continue; |
| | | } |
| | | |
| | | // 堆垛机出库站可出信号校验参数 |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "OutStationVerify")); |
| | | boolean out = false; |
| | | if (config != null){ |
| | | if (config.getValue().equals("Y")){ |
| | | if (staProtocol.isOutEnable()){ |
| | | out = true; // 校验堆垛机出库站可出信号 出库站可出 |
| | | }else { |
| | | out = false; // 校验堆垛机出库站信号 出库站不可出 |
| | | } |
| | | }else if (config.getValue().equals("N")){ |
| | | out = true; // 不校验堆垛机出库站可出信号 |
| | | }else { |
| | | throw new CoolException("校验堆垛机出库站可出信号参数异常 请马上检查参数对应的值"); |
| | | } |
| | | } |
| | | |
| | | // 判断堆垛机出库站状态 |
| | | if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") |
| | | && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { |
| | | && staProtocol.getWorkNo() == 0 && out) { |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | |
| | | // 堆垛机控制过滤 |
| | |
| | | break; |
| | | } |
| | | |
| | | // // 双深库位且浅库位有货,则需先对浅库位进行库位移转 |
| | | // 双深库位且浅库位有货,则需先对浅库位进行库位移转 |
| | | // if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) { |
| | | // News.warnNoLog("" + mark + " - 2" + " - 6" + " - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}", wrkMast.getWrkNo()); |
| | | // String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); |
| | |
| | | |
| | | // 1.堆垛机开始移动 |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 |
| | | // crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX((short) (sourceSta.getRow1() + slave.getOffset())); // 源库位排 |
| | | crnCommand.setSourcePosY((short) (sourceSta.getBay1() + slave.getOffset())); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) (sourceSta.getLev1() + slave.getOffset())); // 源库位层 |
| | | crnCommand.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 |
| | | crnCommand.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 |
| | | crnCommand.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 |
| | | crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 |
| | | if (wrkMast.getCrnNo() == 2){ |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 |
| | | // crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX((short) (sourceSta.getRow1() + slave.getOffset())); // 源库位排 |
| | | crnCommand.setSourcePosY((short) (sourceSta.getBay1() + slave.getOffset())); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) (sourceSta.getLev1() + slave.getOffset())); // 源库位层 |
| | | crnCommand.setDestinationPosX(wrkMast.getIoType() == 101? crnStn.getRow().shortValue() : 3); // 目标库位排 |
| | | // crnCommand.setDestinationPosY((short)(Utils.getLev(wrkMast.getSourceLocNo()) <= 2? 0 : 1)); // 目标库位列 |
| | | crnCommand.setDestinationPosY((short)1); // 目标库位列 |
| | | crnCommand.setDestinationPosZ((short)1); // 目标库位层 |
| | | crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 |
| | | }else { |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 |
| | | // crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX((short) (sourceSta.getRow1() + slave.getOffset())); // 源库位排 |
| | | crnCommand.setSourcePosY((short) (sourceSta.getBay1() + slave.getOffset())); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) (sourceSta.getLev1() + slave.getOffset())); // 源库位层 |
| | | crnCommand.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 |
| | | crnCommand.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 |
| | | crnCommand.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 |
| | | 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 { |
| | |
| | | // 状态:等待确认 并且 任务完成位 = 1 |
| | | if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { |
| | | News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); |
| | | |
| | | if (crnProtocol.getTaskNo() == 9999){ |
| | | crnThread.setResetFlag(true); |
| | | continue; |
| | | } |
| | | // 获取入库待确认工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); |
| | | if (wrkMast == null) { |
| | |
| | | |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 对工作档的完成操作执行完成"); |
| | | News.infoNoLog(""+mark+" - 0"+" - 对工作档的完成操作执行完成"); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 堆垛机异常信息记录执行完成"); |
| | | News.infoNoLog(""+mark+" - 0"+" - 堆垛机异常信息记录执行完成"); |
| | | } |
| | | |
| | | |
| | |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历空板入库口 |
| | | for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) { |
| | | // 获取条码扫描仪信息 |
| | | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, emptyInSta.getBarcode()); |
| | | if (barcodeThread == null) { |
| | | continue; |
| | | } |
| | | String barcode = barcodeThread.getBarcode(); |
| | | // 获取空板入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()); |
| | |
| | | if (!staProtocol.isLoading()) { |
| | | continue; |
| | | } |
| | | // 如果工作号不是 9998 (入库任务) 不向下执行 |
| | | if (staProtocol.getWorkNo() != 9998){ |
| | | continue; |
| | | } |
| | | |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = ""; |
| | | // 检测是否有出库任务 如果有出库任务 入库就停止 |
| | | List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type",101,103,104,107,110).in("wrk_sts", 12)); |
| | | // 检测104站(堆垛机出库站 入库站)是否有物 如果有物没有工作号 入库停止 如果有物工作号是出库 入库停止 如果有物工作号是入库 可以入库 如果有物工作号不存在 入库停止 |
| | | StaProtocol staProtocol104 = devpThread.getStation().get(104); |
| | | if (staProtocol104 == null){ |
| | | log.error("104站点信息未获取"); |
| | | continue; |
| | | } |
| | | //104站有物 有工作号 判断这个任务的类型 |
| | | WrkMast wrkMast1 = null; |
| | | if (staProtocol104.isLoading() && staProtocol104.getWorkNo() != 0){ |
| | | wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol104.getWorkNo())); |
| | | } |
| | | // 判断托盘码格式 |
| | | if (Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)){ |
| | | errMsg = "托盘码格式有误--->" + barcode; |
| | | back = true; |
| | | } |
| | | if (!back && (!barcode.startsWith("5") && !barcode.startsWith("6") && !barcode.startsWith("7") && !barcode.startsWith("8"))) { |
| | | errMsg = "托盘码格式有误--->" + barcode; |
| | | back = true; |
| | | } |
| | | if (!back && !wrkMastList.isEmpty()) { |
| | | errMsg = "堆垛机有出库任务,入库停止"; |
| | | back = true; |
| | | }if (!back && staProtocol104.isLoading() && staProtocol104.getWorkNo() == 0 && (barcode.startsWith("5") || barcode.startsWith("6"))){ // 104虽然有物没有工作号 但是如果102的货物要进的是2号堆垛机 不能阻拦 (1号堆垛机条码 5xxx 6xxx 2号堆垛机 7xxx 8xxx) |
| | | errMsg = "104站有物但是无工作号,请检查"; |
| | | back = true; |
| | | }if (!back && (wrkMast1 != null && wrkMast1.getIoType() > 100)){ |
| | | errMsg = "1号堆垛机有出库任务,入库停止"; |
| | | back = true; |
| | | }if (!back && (staProtocol104.isLoading() && wrkMast1 == null) && (barcode.startsWith("5") || barcode.startsWith("6"))){ // 同上 |
| | | errMsg = "104站有物但是对应的工作号无工作档,请检查"; |
| | | back = true; |
| | | } |
| | | |
| | | // 退回 |
| | | if (back) { |
| | | log.info("errmsg: " + errMsg); |
| | | MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errMsg)); |
| | | |
| | | if (!staProtocol.isLoading()) { |
| | | continue; |
| | | } |
| | | if (!staProtocol.isPakMk()) { |
| | | continue; |
| | | } |
| | | staProtocol.setWorkNo(wrkNo);//退回 工作号:10000 |
| | | News.info("{}PLC入库回退:{},任务号:{}", emptyInSta.getStaNo(), errMsg, wrkNo); |
| | | staProtocol.setStaNo(emptyInSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发:" + wrkNo + "," + emptyInSta.getBackSta()); |
| | | break;//托盘退回不生成工作档 |
| | | } |
| | | // 站点条件判断 |
| | | if (staProtocol.isAutoing() |
| | | && staProtocol.isLoading() |
| | | && staProtocol.isInEnable() |
| | | && staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk() |
| | | && (staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() > 9700) |
| | | && staProtocol.getWorkNo() == 9998 |
| | | ) { |
| | | News.warnNoLog("" + mark + " - 0" + " - 开始执行:空栈板初始化入库,叉车入库站放货"); |
| | | |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | SearchLocParam param = new SearchLocParam(); |
| | | locTypeDto.setLocType1((short) 1); |
| | | locTypeDto.setLocType1(staProtocol.toSqlModel().getLocType1()); |
| | | param.setIoType(10); |
| | | param.setSourceStaNo(emptyInSta.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | param.setBarcode(barcode); // 空托盘入库需要根据托盘码分库位 |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | |
| | | //staProtocol.setStaNo(staProtocol.getSiteId().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()); |
| | | log.error("输送线下发(空板):" + dto.getWorkNo() + "," + staProtocol.getSiteId()); |
| | | if (!result) { |
| | | News.errorNoLog("" + mark + " - 1" + " - 更新plc站点信息失败"); |
| | | throw new CoolException("更新plc站点信息失败"); |
| | |
| | | LedCommand ledCommand = new LedCommand(); |
| | | ledCommand.setWorkNo(dto.getWorkNo()); |
| | | ledCommand.setIoType(1); |
| | | ledCommand.setTitle("全板入库"); |
| | | ledCommand.setTitle("空板入库"); |
| | | ledCommand.setLocNo(dto.getLocNo()); |
| | | ledCommand.setStaNo(dto.getStaNo()); |
| | | commands.add(ledCommand); |
| | |
| | | } |
| | | } |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 空栈板初始化入库,叉车入库站放货执行完成"); |
| | | News.infoNoLog(""+mark+" - 0"+" - 空栈板初始化入库,叉车入库站放货执行完成"); |
| | | } |
| | | |
| | | /** |
| | |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); |
| | | // 命令集合 |
| | | List<LedCommand> commands = new ArrayList<>(); |
| | | // 工作档集合 |
| | | List<WrkMast> wrkMasts = new ArrayList<>(); |
| | | List<Integer> workNoList = new ArrayList<>(); |
| | | for (Integer staNo : led.getStaArr()) { |
| | | // 获取叉车站点 |
| | | StaProtocol staProtocol = devpThread.getStation().get(staNo); |
| | |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | Integer wrkNo = null; |
| | | Integer ioType = null; |
| | | Integer targetStaNo = null; |
| | | String sourceLocNo = null; |
| | | String locNo = null; |
| | | String barcode = null; |
| | | // 获取条码扫描仪信息 |
| | | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, staNo); |
| | | |
| | | // 获取工作档数据 |
| | | WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); |
| | | if (null == wrkMast) { |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",staProtocol.getWorkNo())); |
| | | if (wrkMast == null && barcodeThread != null) { |
| | | wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode",barcodeThread.getBarcode())); |
| | | } |
| | | if (wrkMast == null){ |
| | | continue; |
| | | } |
| | | wrkMasts.add(wrkMast); |
| | | wrkNo = wrkMast.getWrkNo(); |
| | | ioType = wrkMast.getIoType(); |
| | | sourceLocNo = wrkMast.getSourceLocNo(); |
| | | locNo = wrkMast.getLocNo(); |
| | | targetStaNo = wrkMast.getStaNo(); |
| | | barcode = wrkMast.getBarcode(); |
| | | News.warnNoLog("" + mark + " - 0" + " - 开始执行:出库 ===>> 工作档信息写入led显示器"); |
| | | workNoList.add(wrkNo); |
| | | // 组装命令 |
| | | LedCommand ledCommand = new LedCommand(); |
| | | ledCommand.setWorkNo(wrkMast.getWrkNo()); |
| | | ledCommand.setIoType(wrkMast.getIoType()); |
| | | ledCommand.setWorkNo(wrkNo); |
| | | ledCommand.setIoType(ioType); |
| | | // 出库模式 |
| | | switch (wrkMast.getIoType()) { |
| | | switch (ioType) { |
| | | case 1: |
| | | ledCommand.setTitle("全板入库"); |
| | | break; |
| | | case 10: |
| | | ledCommand.setTitle("空板入库"); |
| | | break; |
| | | case 53: |
| | | ledCommand.setTitle("拣料再入库"); |
| | | break; |
| | | case 57: |
| | | ledCommand.setTitle("盘点再入库"); |
| | | break; |
| | | case 101: |
| | | ledCommand.setTitle("全板出库"); |
| | |
| | | ledCommand.setTitle("空板出库"); |
| | | ledCommand.setEmptyMk(true); |
| | | break; |
| | | case 53: |
| | | ledCommand.setTitle("拣料入库"); |
| | | break; |
| | | case 57: |
| | | ledCommand.setTitle("盘点入库"); |
| | | break; |
| | | case 54: |
| | | ledCommand.setTitle("并板入库"); |
| | | break; |
| | | default: |
| | | News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); |
| | | News.error("" + mark + " - 1" + " - 任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkNo, ioType); |
| | | break; |
| | | } |
| | | ledCommand.setSourceLocNo(wrkMast.getSourceLocNo()); |
| | | ledCommand.setStaNo(wrkMast.getStaNo()); |
| | | ledCommand.setBarcode(wrkMast.getBarcode()); |
| | | if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) { |
| | | List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo()); |
| | | ledCommand.setSourceLocNo(sourceLocNo); |
| | | ledCommand.setLocNo(locNo); |
| | | ledCommand.setStaNo(targetStaNo); |
| | | ledCommand.setBarcode(barcode); |
| | | |
| | | wrkDetls.forEach(wrkDetl -> { |
| | | Double total = 0.0; |
| | | EntityWrapper<LocDetl> wrapper = new EntityWrapper<>(); |
| | | LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr())); |
| | | if (Cools.isEmpty(locDetl)) { |
| | | total = wrkDetl.getAnfme(); |
| | | } else { |
| | | total = locDetl.getAnfme(); |
| | | // 修改开始:处理多个wrkDetl,不合并 |
| | | if (ioType != 110 && ioType != 10) { |
| | | List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkNo); |
| | | |
| | | if (!wrkDetls.isEmpty()) { |
| | | // 获取库存信息 |
| | | List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>() |
| | | .eq("loc_no", wrkMast.getSourceLocNo())); |
| | | double totalAnfme = 0D; |
| | | double totalWeight = 0D; |
| | | for (LocDetl locDetl : locDetls) { |
| | | totalAnfme += locDetl.getAnfme(); |
| | | // totalWeight += locDetl.getWeight(); |
| | | } |
| | | if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(), total)); |
| | | |
| | | // 为每个WrkDetl创建独立的MatDto |
| | | for (WrkDetl wrkDetl : wrkDetls) { |
| | | // 注意:这里使用每个wrkDetl的原始数据,不合并 |
| | | ledCommand.getMatDtos().add(new MatDto( |
| | | wrkDetl.getMatnr() |
| | | , wrkDetl.getMaktx() |
| | | , wrkDetl.getAnfme() // 使用单个物料的数量,不累加 |
| | | , wrkDetl.getWeight() // 使用单个物料的重量,不累加 |
| | | , totalAnfme // 库存总数(这个是正常的) |
| | | , totalWeight // 库存总重量(这个是正常的) |
| | | , wrkDetl.getSpecs() |
| | | , wrkDetl.getSku() |
| | | , wrkDetl.getZpallet() |
| | | , wrkDetl.getModel() |
| | | , wrkDetl.getSupp() |
| | | , wrkDetl.getBarcode() |
| | | , wrkDetl.getOrderNo() |
| | | , wrkDetl.getBatch() |
| | | // , wrkDetl.getCstateid$() |
| | | )); |
| | | } |
| | | if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(), total)); |
| | | } |
| | | if (wrkMast.getIoType() == 107) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(), total)); |
| | | } |
| | | }); |
| | | } else { |
| | | // List<WrkDetlLog> wrkDetlLogs = wrkDetlLogService.selectTodayByWrkNo(wrkNo); |
| | | // if (!wrkDetlLogs.isEmpty()) { |
| | | // // 获取库存信息 |
| | | // List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>() |
| | | // .eq("loc_no", sourceLocNo)); |
| | | // double totalAnfme = 0D; |
| | | // double totalWeight = 0D; |
| | | // for (LocDetl locDetl : locDetls) { |
| | | // totalAnfme += locDetl.getAnfme(); |
| | | // totalWeight += locDetl.getWeight(); |
| | | // } |
| | | // |
| | | // // 为每个WrkDetlLog创建独立的MatDto |
| | | // for (WrkDetlLog wrkDetlLog : wrkDetlLogs) { |
| | | // // 注意:这里使用每个wrkDetlLog的原始数据,不合并 |
| | | // ledCommand.getMatDtos().add(new MatDto( |
| | | // wrkDetlLog.getMatnr() |
| | | // , wrkDetlLog.getMaktx() |
| | | // , wrkDetlLog.getAnfme() // 使用单个物料的数量,不累加 |
| | | // , wrkDetlLog.getWeight() // 使用单个物料的重量,不累加 |
| | | // , totalAnfme // 库存总数 |
| | | // , totalWeight // 库存总重量 |
| | | // , wrkDetlLog.getSpecs() |
| | | // , wrkDetlLog.getSku() |
| | | // , wrkDetlLog.getZpallet() |
| | | // , wrkDetlLog.getModel() |
| | | // , wrkDetlLog.getSupp() |
| | | // , wrkDetlLog.getKpCstmrName() |
| | | // , wrkDetlLog.getOrderNo() |
| | | // , wrkDetlLog.getBatch() |
| | | //// , wrkDetlLog.getCstateid$() |
| | | // )); |
| | | // } |
| | | // } |
| | | } |
| | | } |
| | | // 修改结束 |
| | | |
| | | commands.add(ledCommand); |
| | | } |
| | | Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet()); |
| | | Set<Integer> workNos = new HashSet<>(workNoList); |
| | | // 获取LED线程 |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId()); |
| | | // 相同工作号集合则过滤 |
| | | if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) { |
| | | continue; |
| | | } |
| | | |
| | | // 命令下发 ------------------------------------------------------------------------------- |
| | | if (!commands.isEmpty()) { |
| | | if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) { |
| | | News.error("{}号LED显示内容命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); |
| | | News.error("{}号LED命令下发失败--->出库!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); |
| | | continue; |
| | | } else { |
| | | ledThread.setLedMk(false); |
| | | } |
| | | } |
| | | |
| | | try { |
| | | // 修改主档led标记 |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | wrkMast.setOveMk("Y"); |
| | | wrkMast.setModiTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | throw new CoolException("更新工作档失败"); |
| | | for (Integer wrkNo : workNoList) { |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo)); |
| | | if (wrkMast != null) { |
| | | wrkMast.setOveMk("Y"); |
| | | wrkMast.setModiTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | News.errorNoLog("" + mark + " - 4" + " - 更新工作档失败"); |
| | | throw new CoolException("更新工作档失败"); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | } |
| | | News.infoNoLog("" + mark + " - 0" + " - 出库 ===>> 工作档信息写入led显示器执行完成"); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | LocMast sourceLoc = locMastService.queryDemoSourceLoc(crn.getId()); |
| | | LocMast loc = locMastService.queryDemoLoc(crn.getId()); |
| | | if (null == sourceLoc || null == loc) { |
| | | if (null == sourceLoc) { |
| | | continue; |
| | | } |
| | | |
| | | if (null == loc) { |
| | | log.error("库位已全部标记"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | if (loc.getLocSts().equals("O")) { |
| | | loc.setLocSts("S"); // S.入库预约 |
| | | loc.setModiTime(new Date()); |
| | | loc.setLocType2((short) 1); // 标记 |
| | | if (!locMastService.updateById(loc)) { |
| | | throw new CoolException("更新目标库位状态失败"); |
| | | } |
| | |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); |
| | | List<Integer> list = new ArrayList<>(); |
| | | list.add(101); |
| | | list.add(112); |
| | | Map<Integer, Integer> map = new HashMap<>(); |
| | | map.put(101, 102); |
| | | map.put(112, 111); |
| | | for (Integer site : list) { |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("sta_no", map.get(site))); |
| | | if (!Cools.isEmpty(wrkMast)) { |
| | |
| | | } |
| | | Short loctype1 = 1; |
| | | if (site == 101) { |
| | | loctype1 = 2; |
| | | loctype1 = 1; |
| | | } |
| | | LocTypeDto locTypeDto = new LocTypeDto(loctype1, (short) 1, (short) 1); |
| | | locTypeDto.setSiteId(site); |
| | |
| | | } |
| | | } |
| | | |
| | | public synchronized void crnMove() { |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { |
| | | continue; |
| | | } |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp == null) { |
| | | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { |
| | | if (crnProtocol.getBay()==1 && crnProtocol.getLevel() == 1 && crnProtocol.getCrnNo() == 1) { |
| | | continue; |
| | | } |
| | | if (crnProtocol.getCrnNo() == 2 && crnProtocol.getLevel() == 1 && (crnProtocol.getBay() == 0 || crnProtocol.getBay() == 1)){ |
| | | continue; |
| | | } |
| | | Page<BasCrnOpt> basCrnOptPage = crnOptService.selectPage(new Page<>(1, 1), new EntityWrapper<BasCrnOpt>().eq("crn_no", crn.getId()).orderBy("send_time", false)); |
| | | if (basCrnOptPage != null && basCrnOptPage.getRecords() != null && basCrnOptPage.getRecords().size() > 0) { |
| | | if (System.currentTimeMillis() - basCrnOptPage.getRecords().get(0).getSendTime().getTime() < 1000 * 60 * 3) { |
| | | continue; |
| | | } |
| | | } else { |
| | | if (System.currentTimeMillis() - crnProtocol.getLastCommandTime() < 1000 * 60 * 2) { |
| | | continue; |
| | | } |
| | | } |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .eq("crn_no", crn.getId()) |
| | | .notIn("wrk_sts", 5, 14, 15) |
| | | ); |
| | | if (!wrkMasts.isEmpty()) { |
| | | continue; |
| | | } |
| | | |
| | | CrnSlave.CrnStn crnStn = crn.getCrnInStn().get(0); |
| | | |
| | | News.info("堆垛机无任务自动回入库口待机==>>" + crnProtocol.getCrnNo() + "号堆垛机"); |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | // if (crnProtocol.getCrnNo()==3 || crnProtocol.getCrnNo()==4){ |
| | | // crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 |
| | | // crnCommand.setTaskNo((short) 9999); // 工作号 |
| | | // crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | // crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 堆垛机移动 |
| | | // crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | // crnCommand.setSourcePosY((short) 0); // 源库位列 |
| | | // crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | // crnCommand.setDestinationPosX((short) 0); // 目标库位排 |
| | | // crnCommand.setDestinationPosY((short) 0); // 目标库位列 |
| | | // crnCommand.setDestinationPosZ((short) 0); // 目标库位层 |
| | | // crnCommand.setCommand((short) 1); |
| | | // }else { |
| | | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 |
| | | crnCommand.setTaskNo((short) 9999); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | // crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 堆垛机移动 |
| | | crnCommand.setTaskMode(CrnTaskModeType.X_MOVE);//余姚锐麒回原点任务模式: 站位转移 |
| | | crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 1); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) 0); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 0); // 目标库位列 |
| | | crnCommand.setDestinationPosZ((short) 0); // 目标库位层 |
| | | crnCommand.setCommand((short) 1);//任务确认位 |
| | | // } |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) { |
| | | News.error("堆垛机移动命令下发失败,堆垛机号={},任务数据={}", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | } |
| | | crnThread.setBackHpFlag(true); |
| | | try { |
| | | Thread.sleep(500); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |