mrDarker
2025-07-24 2c7d546ddcd43669a433a99e1901339e491542d9
SourceCode/Bond/Servo/CMaster.cpp
@@ -51,6 +51,7 @@
      m_state = MASTERSTATE::READY;
      m_pActiveRobotTask = nullptr;
      m_nLastError = 0;
      m_isCompareMapsBeforeProceeding = FALSE;
      InitializeCriticalSection(&m_criticalSection);
   }
@@ -297,11 +298,12 @@
      // 各种机器
      CLoadPort* pLoadPorts[4];
      CEFEM* pEFEM = (CEFEM*)getEquipment(EQ_ID_EFEM);
      CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
      CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
      CLoadPort* pLoadPort3 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3);
      CLoadPort* pLoadPort4 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4);
      pLoadPorts[0] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
      pLoadPorts[1] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
      pLoadPorts[2] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3);
      pLoadPorts[3] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4);
      CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
      CVacuumBake* pVacuumBake = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
      CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
@@ -311,10 +313,10 @@
      CMeasurement* pMeasurement = (CMeasurement*)getEquipment(EQ_ID_MEASUREMENT);
      ASSERT(pEFEM);
      ASSERT(pLoadPort1);
      ASSERT(pLoadPort2);
      ASSERT(pLoadPort3);
      ASSERT(pLoadPort4);
      ASSERT(pLoadPorts[0]);
      ASSERT(pLoadPorts[1]);
      ASSERT(pLoadPorts[2]);
      ASSERT(pLoadPorts[3]);
      ASSERT(pFliper);
      ASSERT(pVacuumBake);
      ASSERT(pAligner);
@@ -544,17 +546,16 @@
               LOGI("Arm1 %s, Arm2 %s.", rmd.armState[0] ? _T("不可用") : _T("可用"),
                  rmd.armState[1] ? _T("不可用") : _T("可用"));
            }
            CLoadPort* pEqLoadPort[] = { pLoadPort1, pLoadPort2, pLoadPort3, pLoadPort4 };
            CEquipment* pEqTar[] = { pVacuumBake, pFliper };
            if (primaryType == MaterialsType::G2) {
               pEqTar[0] = pFliper;
               pEqTar[1] = pVacuumBake;
            }
            for (int s = 0; s < 4; s++) {
               if (!rmd.armState[0] && pEqLoadPort[s]->isEnable()
                  && pEqLoadPort[s]->getPortType() == PortType::Unloading
                  && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToUnload) {
                  m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType);
               if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
                  && pLoadPorts[s]->getPortType() == PortType::Unloading
                  && pLoadPorts[s]->getPortMode() == PortMode::ReadyToUnload) {
                  m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], primaryType, secondaryType);
                  if (m_pActiveRobotTask != nullptr) {
                     goto PORT_PUT;
                  }
@@ -572,6 +573,25 @@
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            // Measurement NG -> LoadPort
            // NG回原位
            if (!rmd.armState[1]) {
               m_pActiveRobotTask = createTransferTask_restore(pMeasurement, pLoadPorts);
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
                  unlock();
                  if (m_listener.onRobotTaskEvent != nullptr) {
                     m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                  }
                  LOGI("创建Measurement回退任务<%s>...", strDescription.c_str());
                  continue;
               }
            }
            // BakeCooling ->Measurement
@@ -640,8 +660,10 @@
            // Fliper(G2) -> Bonder
            // VacuumBake(G1) -> Bonder
            SERVO::CRobotTask* tempTask[2] = {nullptr, nullptr};
            if (!rmd.armState[1] && !pBonder1->hasBondClass()) {
               m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
               tempTask[0] = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
               /*
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
@@ -652,24 +674,12 @@
                  LOGI("创建新任务<%s>...", strDescription.c_str());
                  continue;
               }
            }
            if (!rmd.armState[1] && !pBonder2->hasBondClass()) {
               m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
                  unlock();
                  if (m_listener.onRobotTaskEvent != nullptr) {
                     m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                  }
                  LOGI("创建新任务<%s>...", strDescription.c_str());
                  continue;
               }
               */
            }
            if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
               m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
               tempTask[1] = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
               /*
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
@@ -680,10 +690,51 @@
                  LOGI("创建新任务<%s>...", strDescription.c_str());
                  continue;
               }
               */
            }
            if (tempTask[1] != nullptr && pBonder1->hasG2Class()) {
               m_pActiveRobotTask = tempTask[1];
               if(tempTask[0] != nullptr) delete tempTask[0];
            }
            else if (tempTask[0] != nullptr && tempTask[1] != nullptr) {
               m_pActiveRobotTask = tempTask[0];
               delete tempTask[1];
            }
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            if (tempTask[0] != nullptr) delete tempTask[0];
            if (tempTask[1] != nullptr) delete tempTask[1];
            tempTask[0] = nullptr;
            tempTask[1] = nullptr;
            if (!rmd.armState[1] && !pBonder2->hasBondClass()) {
               tempTask[0] = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
               /*
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
                  unlock();
                  if (m_listener.onRobotTaskEvent != nullptr) {
                     m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                  }
                  LOGI("创建新任务<%s>...", strDescription.c_str());
                  continue;
               }
               */
            }
            if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
               m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
               tempTask[1] = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
               /*
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
@@ -694,8 +745,31 @@
                  LOGI("创建新任务<%s>...", strDescription.c_str());
                  continue;
               }
               */
            }
            if (tempTask[1] != nullptr && pBonder1->hasG2Class()) {
               m_pActiveRobotTask = tempTask[1];
               if (tempTask[0] != nullptr) delete tempTask[0];
            }
            else if (tempTask[0] != nullptr && tempTask[1] != nullptr) {
               m_pActiveRobotTask = tempTask[0];
               delete tempTask[1];
            }
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
                  m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
               }
               LOGI("创建新任务<%s>...", strDescription.c_str());
               continue;
            }
            if (tempTask[0] != nullptr) delete tempTask[0];
            if (tempTask[1] != nullptr) delete tempTask[1];
            tempTask[0] = nullptr;
            tempTask[1] = nullptr;
            // Aligner -> Fliper(G2)
            // Aligner -> VacuumBake(G1)
@@ -727,12 +801,30 @@
               }
            }
            // Aligner -> LoadPort
            if (!rmd.armState[1]) {
               m_pActiveRobotTask = createTransferTask_restore(pAligner, pLoadPorts);
               if (m_pActiveRobotTask != nullptr) {
                  m_pActiveRobotTask->pick();
                  std::string strDescription = m_pActiveRobotTask->getDescription();
                  unlock();
                  if (m_listener.onRobotTaskEvent != nullptr) {
                     m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                  }
                  LOGI("创建Aligner回退任务<%s>...", strDescription.c_str());
                  continue;
               }
            }
            // LoadPort -> Aligner
            for (int s = 0; s < 4; s++) {
               if (!rmd.armState[0] && pEqLoadPort[s]->isEnable()
                  && pEqLoadPort[s]->getPortType() == PortType::Loading
                  && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
                  m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType);
               if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
                  && pLoadPorts[s]->getPortType() == PortType::Loading
                  && pLoadPorts[s]->getPortMode() == PortMode::ReadyToLoad) {
                  m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType);
                  if (m_pActiveRobotTask != nullptr) {
                     pEFEM->setContext(m_pActiveRobotTask->getContext());
                     goto PORT_GET;
@@ -835,7 +927,7 @@
         if (m_pActiveRobotTask != nullptr) {
            if (m_pActiveRobotTask->getSrcPosition() == p->getID()) {
               CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getSrcSlot());
               if (pGlass != nullptr && port == m_pActiveRobotTask->getSrcSlot()) {
               if (pGlass != nullptr) {
                  CJobDataS* pJobDataS = pGlass->getJobDataS();
                  if (pJobDataS != nullptr
                     && pJobDataS->getCassetteSequenceNo() == pJobDataB->getCassetteSequenceNo()
@@ -879,7 +971,7 @@
            else if (m_pActiveRobotTask->isPlacing() &&
               m_pActiveRobotTask->getTarPosition() == p->getID()) {
               CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getTarSlot());
               if (pGlass == nullptr && m_pActiveRobotTask->getTarSlot() == port) {
               if (pGlass == nullptr) {
                  bOk = TRUE;
                  slot = m_pActiveRobotTask->getTarSlot();
                  LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
@@ -975,6 +1067,16 @@
      listener.onProcessStateChanged = [&](void* pEquipment, PROCESS_STATE state) -> void {
         LOGI("<Master>onProcessStateChanged<%d>", (int)state);
      };
      listener.onMapMismatch = [&](void* pEquipment, short scanMap, short downMap) {
         LOGE("<Master-%s>Port InUse, map(%d!=%d)不一致,请检查。",
            ((CEquipment*)pEquipment)->getName().c_str(), scanMap, downMap);
      };
      listener.onPortInUse = [&](void* pEquipment, short scanMap) {
         LOGE("<Master-%s>Port InUse。scanMap=%d", ((CEquipment*)pEquipment)->getName().c_str(), scanMap);
         if (m_listener.onLoadPortInUse != nullptr) {
            m_listener.onLoadPortInUse(this, (CEquipment*)pEquipment, scanMap);
         }
      };
      pEquipment->setListener(listener);
      pEquipment->setCcLink(&m_cclink);
      m_listEquipment.push_back(pEquipment);
@@ -1012,6 +1114,7 @@
      pEquipment->setID(EQ_ID_LOADPORT1 + index);
      pEquipment->setName(szName);
      pEquipment->setDescription(szName);
      pEquipment->setCompareMapsBeforeProceeding(m_isCompareMapsBeforeProceeding);
      addToEquipmentList(pEquipment);
@@ -1368,6 +1471,10 @@
      MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/,
      int armNo/* = 1*/)
   {
      if (!pSrcEq->IsEnabled()) {
         return nullptr;
      }
      CRobotTask* pTask = nullptr;
      CSlot* pSrcSlot, * pTarSlot;
      pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
@@ -1392,6 +1499,10 @@
   CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq)
   {
      if (!pSrcEq->IsEnabled()) {
         return nullptr;
      }
      std::vector<int> slots = {1, 3};
      CRobotTask* pTask = nullptr;
@@ -1413,6 +1524,10 @@
   CRobotTask* CMaster::createTransferTask_bake_to_cooling(CEquipment* pSrcEq)
   {
      if (!pSrcEq->IsEnabled()) {
         return nullptr;
      }
      std::vector<int> slotsTar = { 2, 4 };
      std::vector<int> slotsSrc = { 1, 3 };
@@ -1435,12 +1550,52 @@
   CRobotTask* CMaster::createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq)
   {
      if (!pSrcEq->IsEnabled()) {
         return nullptr;
      }
      std::vector<int> slots = { 2, 4 };
      CRobotTask* pTask = nullptr;
      CSlot* pSrcSlot, * pTarSlot;
      pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G1);
      pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slots);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
      }
      return pTask;
   }
   CRobotTask* CMaster::createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts)
   {
      if (!pEqSrc->IsEnabled()) {
         return nullptr;
      }
      CRobotTask* pTask = nullptr;
      CSlot* pSrcSlot, * pTarSlot = nullptr, * pTempSlot;
      pSrcSlot = pEqSrc->getInspFailSlot();
      if (pSrcSlot != nullptr) {
         CGlass* pGlass = (CGlass*)pSrcSlot->getContext();
         ASSERT(pGlass);
         int port, slot;
         pGlass->getOrginPort(port, slot);
         pGlass->setInspResult(pPorts[port]->getID(), 0, InspResult::Fail);
         ASSERT(0 <= port && port < 4);
         ASSERT(0 <= slot && slot < 8);
         pTempSlot = pPorts[port]->getSlot(slot);
         if (pTempSlot->getContext() == nullptr) {
            pTarSlot = pTempSlot;
         }
      }
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         pTask = new CRobotTask();
@@ -1474,7 +1629,8 @@
      unlock();
      // 当前任务手动中止后,停止调度,需要操作员在解决问题后,重新启动
      stop();
      // 25年7月23日后修改为不停止任务
      // stop();
      return 0;
   }
@@ -1484,6 +1640,18 @@
      lock();
      if (m_pActiveRobotTask != nullptr) {
         m_pActiveRobotTask->restore();
      }
      unlock();
      return 0;
   }
   int CMaster::resendCurrentTask()
   {
      lock();
      if (m_pActiveRobotTask != nullptr) {
         m_pActiveRobotTask->resend();
      }
      unlock();
@@ -1504,4 +1672,17 @@
      pPort->localSetTransferMode((SERVO::TransferMode)transferMode);
      pPort->localAutoChangeEnable(autoChangeEnable);
   }
   void CMaster::setPortCassetteType(unsigned int index, SERVO::CassetteType type)
   {
      ASSERT(index < 4);
      int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4 };
      CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[index]);
      pPort->localSetCessetteType(type);
   }
   void CMaster::setCompareMapsBeforeProceeding(BOOL bCompare)
   {
      m_isCompareMapsBeforeProceeding = bCompare;
   }
}