| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.interceptor.TransactionAspectSupport; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private BasRgvMapService basRgvMapService; |
| | | |
| | | @Resource |
| | | private BasDevpErrLogService basDevpErrLogService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | |
| | | if (crnProtocol == null) { |
| | | continue; |
| | | } |
| | | if (crnProtocol.getModeType() != CrnModeType.STOP) { |
| | | // 有任务 |
| | | if (crnProtocol.getTaskNo() != 0) { |
| | | |
| | | BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue()); |
| | | // 有异常 |
| | | if (latest == null) { |
| | | News.warnNoLog(""+mark+" - 1"+" - 开始执行:堆垛机异常信息记录 : 有任务,有异常"); |
| | | News.warnNoLog("" + mark + " - 1" + " - 开始执行:堆垛机异常信息记录 : 有任务,有异常"); |
| | | if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { |
| | | WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); |
| | | if (wrkMast == null) { |
| | |
| | | "任务中异常" // 备注 |
| | | ); |
| | | if (!basErrLogService.insert(basErrLog)) { |
| | | News.error(""+mark+" - 2"+" - 堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); |
| | | News.error("" + mark + " - 2" + " - 堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); |
| | | } |
| | | } |
| | | } else { |
| | |
| | | latest.setUpdateTime(now); |
| | | latest.setStatus(2); |
| | | if (!basErrLogService.updateById(latest)) { |
| | | News.error(""+mark+" - 3"+" - 堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); |
| | | News.error("" + mark + " - 3" + " - 堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); |
| | | } |
| | | } |
| | | } |
| | |
| | | BasErrLog latest = basErrLogService.findLatest(crn.getId()); |
| | | // 有异常 |
| | | if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { |
| | | News.warnNoLog(""+mark+" - 4"+" - 开始执行:堆垛机异常信息记录 : 无任务,有异常"); |
| | | News.warnNoLog("" + mark + " - 4" + " - 开始执行:堆垛机异常信息记录 : 无任务,有异常"); |
| | | // 记录新异常 |
| | | if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { |
| | | BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); |
| | |
| | | "无任务异常" // 备注 |
| | | ); |
| | | if (!basErrLogService.insert(basErrLog)) { |
| | | News.error(""+mark+" - 5"+" - 堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); |
| | | News.error("" + mark + " - 5" + " - 堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); |
| | | } |
| | | } |
| | | // 无异常 |
| | |
| | | latest.setUpdateTime(now); |
| | | latest.setStatus(2); |
| | | if (!basErrLogService.updateById(latest)) { |
| | | News.error(""+mark+" - 6"+" - 堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); |
| | | News.error("" + mark + " - 6" + " - 堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 输送线异常 |
| | | */ |
| | | public synchronized void recDevpErr() { |
| | | Date now = new Date(); |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | Integer devpId = devp.getId(); |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpId); |
| | | Map<Integer, StaProtocol> station = devpThread.getStation(); |
| | | for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) { |
| | | Integer siteNo = entry.getKey(); |
| | | StaProtocol staProtocol = entry.getValue(); |
| | | Integer workNo = staProtocol.getWorkNo(); |
| | | // 输送线报警 |
| | | String plcErr = staPlcErr(staProtocol); |
| | | if (staProtocol.isAutoing()) { |
| | | // 有任务 |
| | | if (staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() <= 9000) { |
| | | |
| | | // 获取输送线报警信息 |
| | | BasDevpErrLog latestByTaskNo = basDevpErrLogService.findLatestByTaskNo(siteNo, workNo); |
| | | |
| | | // 有异常 |
| | | if (latestByTaskNo == null) { |
| | | if (!plcErr.equals("")) { |
| | | WrkMast wrkMast = wrkMastMapper.selectById(workNo); |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | | |
| | | BasDevpErrLog basErrLog = new BasDevpErrLog( |
| | | null, // 编号 |
| | | wrkMast.getWrkNo(), // 工作号 |
| | | now, // 发生时间 |
| | | null, // 结束时间 |
| | | wrkMast.getWrkSts(), // 工作状态 |
| | | wrkMast.getIoType(), // 入出库类型 |
| | | wrkMast.getCrnNo(), // 堆垛机 |
| | | devpId, // plc |
| | | wrkMast.getLocNo(), // 目标库位 |
| | | wrkMast.getStaNo(), // 目标站 |
| | | siteNo, // 源站 |
| | | wrkMast.getSourceLocNo(), // 源库位 |
| | | wrkMast.getBarcode(), // 条码 |
| | | 0, // 异常码 |
| | | plcErr, // 异常 |
| | | 1, // 异常情况 |
| | | now, // 添加时间 |
| | | null, // 添加人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | "任务中异常" // 备注 |
| | | ); |
| | | if (!basDevpErrLogService.insert(basErrLog)) { |
| | | log.error("输送线异常信息插入表asr_bas_devp_err_log异常:{}", basErrLog); |
| | | } |
| | | } |
| | | } else { |
| | | // 异常修复 |
| | | if (plcErr.equals("")) { |
| | | latestByTaskNo.setEndTime(now); |
| | | latestByTaskNo.setUpdateTime(now); |
| | | latestByTaskNo.setStatus(2); |
| | | if (!basDevpErrLogService.updateById(latestByTaskNo)) { |
| | | log.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latestByTaskNo); |
| | | } |
| | | } |
| | | } |
| | | // 无任务 |
| | | } else { |
| | | BasDevpErrLog latest = basDevpErrLogService.findLatest(siteNo); |
| | | // 有异常 |
| | | if (!plcErr.equals("")) { |
| | | // 记录新异常 |
| | | if (latest == null || !latest.getError().equals(plcErr) || latest.getStatus() == 2 ) { |
| | | BasDevpErrLog basErrLog = new BasDevpErrLog( |
| | | null, // 编号 |
| | | null, // 工作号 |
| | | now, // 发生时间 |
| | | null, // 结束时间 |
| | | null, // 工作状态 |
| | | null, // 入出库类型 |
| | | 0, // 堆垛机 |
| | | devpId, // plc |
| | | null, // 目标库位 |
| | | null, // 目标站 |
| | | siteNo, // 源站 |
| | | null, // 源库位 |
| | | null, // 条码 |
| | | 0, // 异常码 |
| | | plcErr, // 异常 |
| | | 1, // 异常情况 |
| | | now, // 添加时间 |
| | | null, // 添加人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | "无任务异常" // 备注 |
| | | ); |
| | | if (!basDevpErrLogService.insert(basErrLog)) { |
| | | log.error("输送线异常记录asr_bas_devp_err_log异常:{}", basErrLog); |
| | | } |
| | | } |
| | | // 无异常 |
| | | } else { |
| | | // 异常修复 |
| | | if (latest != null && latest.getStatus() == 1) { |
| | | latest.setEndTime(now); |
| | | latest.setUpdateTime(now); |
| | | latest.setStatus(2); |
| | | if (!basDevpErrLogService.updateById(latest)) { |
| | | log.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latest); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 获取输送线报警 |
| | | public String staPlcErr(StaProtocol staProtocol){ |
| | | Integer siteId = staProtocol.getSiteId(); |
| | | if (staProtocol.getBreakerErr()){ |
| | | return "断路器故障"; |
| | | } |
| | | if (staProtocol.getInfraredErr()){ |
| | | return "光电异常"; |
| | | } |
| | | if (staProtocol.getOutTimeErr()){ |
| | | return "运行超时"; |
| | | } |
| | | if (staProtocol.getSeizeSeatErr()){ |
| | | return "占位超时"; |
| | | } |
| | | if (staProtocol.getWrkYgoodsN()){ |
| | | return "有任务无货故障"; |
| | | } |
| | | if (staProtocol.getInverterErr()){ |
| | | return "变频器故障"; |
| | | } |
| | | if (staProtocol.getContactErr()){ |
| | | return "电机接触器故障"; |
| | | } |
| | | if (staProtocol.getUpcontactErr()){ |
| | | return "顶升电机接触器故障"; |
| | | } |
| | | if (staProtocol.isFrontErr()){ |
| | | return "前超限"; |
| | | } |
| | | if (staProtocol.isBackErr()){ |
| | | return "后超限"; |
| | | } |
| | | if (staProtocol.isHighErr()){ |
| | | return "高超限"; |
| | | } |
| | | if (staProtocol.isLeftErr()){ |
| | | return "左超限"; |
| | | } |
| | | if (staProtocol.isRightErr()){ |
| | | return "右超限"; |
| | | } |
| | | if (staProtocol.isBarcodeErr() && siteId != 1083 && siteId != 1086 && siteId != 1089 ){ |
| | | return "扫码失败"; |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | /** |
| | |
| | | // News.infoNoLog(""+mark+" - 0"+" - outOfDevp执行完成"); |
| | | } |
| | | |
| | | /** |
| | | * 堆垛机回原点 |
| | | */ |
| | | public synchronized void originGo() throws InterruptedException { |
| | | |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if(crnProtocol == null) { |
| | | continue; |
| | | } |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { |
| | | // 判断是不是已在原点 |
| | | if(crnProtocol.getBay() == 0 && crnProtocol.getLevel() == 1) { |
| | | continue; |
| | | } |
| | | // 判断是不是空闲三分钟 |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp.getWrkNo() != 0) { |
| | | continue; |
| | | } |
| | | Date now = new Date(); |
| | | Date modiTime = basCrnp.getModiTime(); |
| | | long diffInMillis = now.getTime()-modiTime.getTime(); |
| | | if(diffInMillis < 10 * 1000) { // 空闲小于10秒则跳过 |
| | | continue; |
| | | } else { // 有入库任务或大于2分钟,回原点 |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1).eq("crn_no", crn.getId()).in("wrk_sts", 2, 9, 10)); |
| | | if(count == 0 && diffInMillis < 2 * 60 * 1000) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | // 有吊车入库或吊车出库任务 |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnProtocol.getCrnNo()).in("wrk_sts", 3, 12)); |
| | | if(count != 0) { |
| | | continue; |
| | | } |
| | | |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(crn.getId()); // 堆垛机编号 |
| | | crnCommand.setTaskNo((short) 9999); // 工作号 |
| | | crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 回原点 |
| | | crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 4 : crn.getId() == 2 ? 6 : crn.getId() == 3 ? 7 : 11)); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 0); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) 0); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 0); // 目标库位列 |
| | | crnCommand.setDestinationPosZ((short) 0); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) { |
| | | News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | basCrnp.setModiTime(new Date()); |
| | | basCrnpService.updateById(basCrnp); // 设置更新时间,避免重复下发回原点 |
| | | log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand)); |
| | | } |
| | | Thread.sleep(3000); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |