| | |
| | | && pLoadPorts[s]->getPortStatus() == PORT_INUSE) { |
| | | m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType, m_bJobMode); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | pEFEM->setContext(m_pActiveRobotTask->getContext()); |
| | | bool bMoved = glassFromQueueToInPorcess((CGlass*)m_pActiveRobotTask->getContext()); |
| | | CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext(); |
| | | pEFEM->setContext(pGlass); |
| | | pGlass->start(); |
| | | bool bMoved = glassFromQueueToInPorcess(pGlass); |
| | | if (bMoved) { |
| | | LOGI("<Master>Glass(%s)从等待列队到工艺列队转移成功.", |
| | | ((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str()); |
| | | pGlass->getID().c_str()); |
| | | } |
| | | else { |
| | | LOGE("<Master>Glass(%s)从等待列队到工艺列队转移失败.", |
| | | ((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str()); |
| | | pGlass->getID().c_str()); |
| | | } |
| | | |
| | | goto BATCH_PORT_GET; |
| | |
| | | bOk = TRUE; |
| | | LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性."); |
| | | } |
| | | LOGI("<CMaster>onPreFethedOutJob 0004."); |
| | | if (pJobDataS != nullptr) { |
| | | LOGI("<CMaster>onPreFethedOutJob 0005. %d,%d,%d,%d", |
| | | pJobDataS->getCassetteSequenceNo(), |
| | | pJobDataB->getCassetteSequenceNo(), |
| | | pJobDataS->getJobSequenceNo(), |
| | | pJobDataB->getJobSequenceNo() |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | else if (p->getID() == EQ_ID_ARM_TRAY1 || p->getID() == EQ_ID_ARM_TRAY2) { |
| | |
| | | |
| | | // 如果是搬送回从AOI搬送回Port, 则glass工艺完成 |
| | | if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) { |
| | | bool bMoved = glassFromInPorcessToComplete((CGlass*)m_pActiveRobotTask->getContext()); |
| | | CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext(); |
| | | pGlass->complete(); |
| | | bool bMoved = glassFromInPorcessToComplete(pGlass); |
| | | if (bMoved) { |
| | | LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.", |
| | | ((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str()); |
| | | pGlass->getID().c_str()); |
| | | } |
| | | else { |
| | | LOGE("<Master>Glass(%s)从工艺列队到完成列队转移失败.", |
| | | ((CGlass*)m_pActiveRobotTask->getContext())->getID().c_str()); |
| | | pGlass->getID().c_str()); |
| | | } |
| | | |
| | | // 检查PJ是否已经完成 |
| | | CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext()); |
| | | if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) { |
| | | LOGE("<Master>ProcessJob(%s)完成.", |
| | | pJob->id().c_str()); |
| | | if (m_listener.onPjEnd != nullptr) { |
| | | m_listener.onPjEnd(this, pJob); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | unlock(); |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // 模拟测试 |
| | | /* |
| | | static int aaa = 0; |
| | | aaa++; |
| | | if (aaa % 30 == 0) { |
| | | if (!m_queueGlasses.empty()) { |
| | | CGlass* pGlass = m_queueGlasses.front(); |
| | | pGlass->start(); |
| | | glassFromQueueToInPorcess(pGlass); |
| | | } |
| | | } |
| | | |
| | | if (aaa % 45 == 0) { |
| | | if (!m_inProcesGlasses.empty()) { |
| | | CGlass* pGlass = m_inProcesGlasses.front(); |
| | | pGlass->complete(); |
| | | glassFromInPorcessToComplete(pGlass); |
| | | |
| | | |
| | | CProcessJob* pJob = getGlassProcessJob(pGlass); |
| | | if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) { |
| | | LOGE("<Master>ProcessJob(%s)完成.", |
| | | pJob->id().c_str()); |
| | | if (m_listener.onPjEnd != nullptr) { |
| | | m_listener.onPjEnd(this, pJob); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | */ |
| | | } |
| | | |
| | | void CMaster::connectEquipments() |
| | |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob) |
| | | { |
| | | ASSERT(pJob); |
| | | auto state = pJob->state(); |
| | | if (state != PJState::InProcess && state != PJState::Paused) return false; |
| | | |
| | | for (auto c : pJob->carriers()) { |
| | | for (auto g : c.contexts) { |
| | | CGlass* pGlass = (CGlass*)g; |
| | | if (pGlass->state() != GlsState::Aborted |
| | | && pGlass->state() != GlsState::Completed |
| | | && pGlass->state() != GlsState::Failed) return false; |
| | | } |
| | | } |
| | | |
| | | return pJob->complete(); |
| | | } |
| | | |
| | | CProcessJob* CMaster::getGlassProcessJob(CGlass* pGlass) |
| | | { |
| | | if (m_pControlJob == nullptr) return nullptr; |
| | | for (auto pj : m_pControlJob->getPjs()) { |
| | | for (auto c : pj->carriers()) { |
| | | for (auto g : c.contexts) { |
| | | if (g == pGlass) return pj; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | } |