| | |
| | | if (crn.getId() == 5){ |
| | | continue; |
| | | } |
| | | |
| | | this.crnStnToLoc(crn, crnProtocol); // 入库 |
| | | crnProtocol.setLastIo("O"); |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | //RGV搬运 |
| | | public synchronized void rgvIoExecute() { |
| | | for (RgvSlave slave : slaveProperties.getRgv()) { |
| | | ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId()); |
| | | if (rgvThread == null) { |
| | | return; |
| | | } |
| | | |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | return; |
| | | } |
| | | |
| | | // 判断RGV是否空闲 |
| | | if (rgvProtocol.getModeType() == RgvModeType.COMPUTER |
| | | && rgvProtocol.getStatusType() == RgvStatusType.IDLE) { |
| | | // 如果最近一次是入库模式,则优先扫描出库站点 |
| | | if (rgvProtocol.getLastIo().equals("I")) { |
| | | this.rgvOutExecute(rgvThread, rgvProtocol);//出库 |
| | | rgvProtocol.setLastIo("O"); |
| | | }else { |
| | | this.rgvInExecute(rgvThread, rgvProtocol);//入库 |
| | | rgvProtocol.setLastIo("I"); |
| | | } |
| | | |
| | | //检查是否存在工位1任务超时没下发 |
| | | if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskNo2() == 0) { |
| | | if (System.currentTimeMillis() - rgvProtocol.getTask1SendTime() > (1000*60)) { |
| | | //工位1下发时间超过60s |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号 |
| | | rgvCommand.setCommand((short) 1);//工位1确认 |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(4, rgvCommand))) { |
| | | log.error("RGV确认命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | return; |
| | | } |
| | | log.error("RGV确认命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //rgv入库 |
| | | public synchronized void rgvInExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) { |
| | | for (RgvSlave.Sta sta : rgvThread.getSlave().getInStn()) { |
| | | if (rgvProtocol.getTaskNo1() > 0) { |
| | | //检测rgv工位1是否为入库任务 |
| | | WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); |
| | | if (wrkMast1.getWrkSts() > 100) { |
| | | continue;//出库任务跳过 |
| | | } |
| | | } |
| | | |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo()); |
| | | //判断输送线是否自动、有物、可入、有工作号 |
| | | if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) { |
| | | continue; |
| | | } |
| | | |
| | | //搜索工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue()); |
| | | if (wrkMast == null) { |
| | | continue;//工作档不存在 |
| | | } |
| | | |
| | | //获取RGV放货站点 |
| | | Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), true); |
| | | if (staNo == null) { |
| | | continue;//RGV放货站点不存在 |
| | | } |
| | | |
| | | //判断目标站是否自动、可入、无物、无工作号 |
| | | StaProtocol staProtocol1 = devpThread.getStation().get(staNo); |
| | | if (!(staProtocol1.isAutoing() && staProtocol1.isInEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) { |
| | | continue; |
| | | } |
| | | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号 |
| | | rgvCommand.setAckFinish((short) 0); |
| | | |
| | | //判断rgv工位1是否可用 |
| | | if (rgvProtocol.getTaskNo1() == 0) { |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 0);//工位1暂不确认 |
| | | } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用 |
| | | rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 1);//工位2确认 |
| | | }else { |
| | | continue;//没有可用RGV工位 |
| | | } |
| | | |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | continue; |
| | | } |
| | | |
| | | log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | } |
| | | } |
| | | |
| | | //rgv出库 |
| | | public synchronized void rgvOutExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) { |
| | | for (RgvSlave.Sta sta : rgvThread.getSlave().getOutStn()) { |
| | | if (rgvProtocol.getTaskNo1() > 0) { |
| | | //检测rgv工位1是否为出库任务 |
| | | WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); |
| | | if (wrkMast1.getWrkSts() < 100) { |
| | | continue;//入库任务跳过 |
| | | } |
| | | } |
| | | |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo()); |
| | | //判断输送线是否自动、有物、可出、有工作号 |
| | | if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) { |
| | | continue; |
| | | } |
| | | |
| | | //搜索工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue()); |
| | | if (wrkMast == null) { |
| | | continue;//工作档不存在 |
| | | } |
| | | |
| | | //获取RGV放货站点 |
| | | Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), false); |
| | | if (staNo == null) { |
| | | continue;//RGV放货站点不存在 |
| | | } |
| | | |
| | | //判断目标站是否自动、可出、无物、无工作号 |
| | | StaProtocol staProtocol1 = devpThread.getStation().get(staNo); |
| | | if (!(staProtocol1.isAutoing() && staProtocol1.isOutEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) { |
| | | continue; |
| | | } |
| | | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号 |
| | | rgvCommand.setAckFinish((short) 0); |
| | | |
| | | //判断rgv工位1是否可用 |
| | | if (rgvProtocol.getTaskNo1() == 0) { |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 0);//工位1暂不确认 |
| | | } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用 |
| | | rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号 |
| | | rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货 |
| | | rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站 |
| | | rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站 |
| | | rgvCommand.setCommand((short) 1);//工位2确认 |
| | | }else { |
| | | continue;//没有可用RGV工位 |
| | | } |
| | | |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | continue; |
| | | } |
| | | |
| | | log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | } |
| | | } |
| | | |
| | | //RGV工作完成 |
| | | public synchronized void rgvFinished() { |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); |
| | | for (RgvSlave slave : slaveProperties.getRgv()) { |
| | | ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId()); |
| | | if (rgvThread == null) { |
| | | return; |
| | | } |
| | | |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | return; |
| | | } |
| | | |
| | | // 状态:等待确认 |
| | | if (rgvProtocol.getStatusType() == RgvStatusType.WAITING) { |
| | | if (rgvProtocol.getTaskNo1() == 9999) { |
| | | // RGV复位 |
| | | rgvThread.setResetFlag1(true); |
| | | }else { |
| | | // 获取待确认工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep3(rgvProtocol.getTaskNo1().intValue()); |
| | | if (wrkMast == null) { |
| | | log.error("RGV处于等待确认且任务完成状态,但未找到工作档。RGV号={},工作号={}", rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1()); |
| | | continue; |
| | | } |
| | | |
| | | if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskFinish1() == 1) { |
| | | //工位1任务完成 |
| | | // RGV复位 |
| | | rgvThread.setResetFlag1(true); |
| | | |
| | | //给目标站输送线写入数据 |
| | | Short destinationPos1 = rgvProtocol.getDestinationPos1();//获取工位1目标站 |
| | | StaProtocol staProtocol = devpThread.getStation().get(destinationPos1.intValue()).clone(); |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号 |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站 |
| | | if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) { |
| | | log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol)); |
| | | } |
| | | |
| | | //2号RGV和3号RGV工作完成后需要更新工作档状态 |
| | | if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) { |
| | | if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库 |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (rgvProtocol.getTaskNo2() > 0 && rgvProtocol.getTaskFinish2() == 1) { |
| | | //工位2任务完成 |
| | | // RGV复位 |
| | | rgvThread.setResetFlag2(true); |
| | | |
| | | //给目标站输送线写入数据 |
| | | Short destinationPos2 = rgvProtocol.getDestinationPos2();//获取工位2目标站 |
| | | StaProtocol staProtocol = devpThread.getStation().get(destinationPos2.intValue()).clone(); |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号 |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站 |
| | | if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) { |
| | | log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol)); |
| | | } |
| | | |
| | | //2号RGV和3号RGV工作完成后需要更新工作档状态 |
| | | if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) { |
| | | if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库 |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 扫描碟盘机自动入库空托盘 |