LAPTOP-SNT8I5JK\Boounion
2025-06-13 f6e82f09bb6fb4727da61366c195cb99f3474e49
SourceCode/Bond/Servo/CMaster.cpp
@@ -284,7 +284,6 @@
      // Bonder1和Bonder2需要的G2就过不来了
      // 最基本的实现,可以G2和G2轮流搬送,但最好根据Bonder的需求来决定
      MaterialsType primaryType, secondaryType;
      int armNo = 1;         // 默认使用手臂2
      // 各种机器
@@ -387,7 +386,7 @@
               if (pEqLoadPort[s]->isEnable()
                  && pEqLoadPort[s]->getPortType() == PortType::Unloading
                  && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToUnload) {
                  m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType, armNo);
                  m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType);
                  if (m_pActiveRobotTask != nullptr) {
                     goto PORT_PUT;
                  }
@@ -396,7 +395,7 @@
         PORT_PUT:
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -410,7 +409,7 @@
            // BakeCooling ->Measurement
            m_pActiveRobotTask = createTransferTask_bakecooling_to_measurement(pBakeCooling, pMeasurement);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -425,7 +424,7 @@
            // Bake -> Cooling
            m_pActiveRobotTask = createTransferTask_bake_to_cooling(pBakeCooling);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -439,7 +438,7 @@
            // Bonder -> BakeCooling
            m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -451,7 +450,7 @@
            m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -463,9 +462,9 @@
            // Fliper(G2) -> Bonder
            // VacuumBake(G1) -> Bonder
            m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, armNo);
            m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -475,9 +474,9 @@
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, armNo);
            m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -487,9 +486,9 @@
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType, armNo);
            m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -499,9 +498,9 @@
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType, armNo);
            m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -513,9 +512,9 @@
            // Aligner -> Fliper(G2)
            // Aligner -> VacuumBake(G1)
            m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, armNo);
            m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, 2);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -525,9 +524,9 @@
               continue;
            }
            m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType, armNo);
            m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -543,7 +542,7 @@
               if (pEqLoadPort[s]->isEnable()
                  && pEqLoadPort[s]->getPortType() == PortType::Loading
                  && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
                  m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType, armNo);
                  m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType);
                  if (m_pActiveRobotTask != nullptr) {
                     goto PORT_GET;
                  }
@@ -552,7 +551,7 @@
PORT_GET:
            if (m_pActiveRobotTask != nullptr) {
               m_pActiveRobotTask->run();
               m_pActiveRobotTask->pick();
               std::string strDescription = m_pActiveRobotTask->getDescription();
               unlock();
               if (m_listener.onRobotTaskEvent != nullptr) {
@@ -678,17 +677,24 @@
         BOOL bOk = FALSE;
         lock();
         if (m_pActiveRobotTask != nullptr) {
            if (m_pActiveRobotTask->getTarPosition() == p->getID()) {
            // 是否已经进入手臂(即取片完成),进入下一步,放片
            if (m_pActiveRobotTask->isPicking() &&
               ((m_pActiveRobotTask->getArmNo() == 1 && p->getID() == EQ_ID_ARM_TRAY1)
               || (m_pActiveRobotTask->getArmNo() == 2 && p->getID() == EQ_ID_ARM_TRAY2))
               ) {
               slot = 1;
               bOk = TRUE;
            }
            // 是否放片完成
            else if (m_pActiveRobotTask->isPlacing() &&
               m_pActiveRobotTask->getTarPosition() == p->getID()) {
               CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getTarSlot());
               if (pGlass == nullptr) {
                  bOk = TRUE;
                  slot = m_pActiveRobotTask->getTarSlot();
                  LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
               }
            }
            else if (p->getID() == EQ_ID_ARM_TRAY1 || p->getID() == EQ_ID_ARM_TRAY2) {
               slot = 1;
               bOk = TRUE;
            }
         }
         unlock();
@@ -711,21 +717,30 @@
         if (code == EDCC_FETCHOUT_JOB) {
            lock();
            if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) {
               m_pActiveRobotTask->fetchOut();
               LOGI("开始取片...");
            }
            unlock();
         }
         else if (code == EDCC_STORED_JOB) {
            lock();
            if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getTarPosition() == p->getID()) {
            if (m_pActiveRobotTask != nullptr
               && m_pActiveRobotTask->isPicking()
               && ((m_pActiveRobotTask->getArmNo() == 1 && p->getID() == EQ_ID_ARM_TRAY1)
                  || (m_pActiveRobotTask->getArmNo() == 2 && p->getID() == EQ_ID_ARM_TRAY2))
               ) {
               LOGI("取片完成.");
               m_pActiveRobotTask->fetchOut();
               m_pActiveRobotTask->place();
            }
            else if (m_pActiveRobotTask != nullptr
               && m_pActiveRobotTask->isPlacing()
               && m_pActiveRobotTask->getTarPosition() == p->getID()) {
               m_pActiveRobotTask->stored();
               m_pActiveRobotTask->completed();
               LOGI("放片完成...");
               // 完成此条搬送任务,但要把数据和消息上抛应用层
               unlock();
               lock();
@@ -1162,11 +1177,14 @@
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, armNo, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, armNo, srcPos,
            tarPos, srcSlot, tarSlot);
      }
@@ -1183,11 +1201,14 @@
      pSrcSlot = pSrcEq->getProcessedSlot(MaterialsType::G1);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
            tarPos, srcSlot, tarSlot);
      }
@@ -1205,11 +1226,14 @@
      pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slotsSrc);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
            tarPos, srcSlot, tarSlot);
      }
@@ -1226,15 +1250,68 @@
      pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slots);
      if (pSrcSlot != nullptr && nullptr != pTarSlot) {
         int srcPos, srcSlot, tarPos, tarSlot;
         transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
         transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
         pTask = new CRobotTask();
         pTask->setContext(pSrcSlot->getContext());
         pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
         pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
         taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
            tarPos, srcSlot, tarSlot);
      }
      return pTask;
   }
   void CMaster::transformPosAndSlot(int srcPos, int srcSlot, int& tarPos, int& tarSlot)
   {
      switch (srcPos)
      {
      case EQ_ID_LOADPORT1:
      case EQ_ID_LOADPORT2:
      case EQ_ID_LOADPORT3:
      case EQ_ID_LOADPORT4:
      case EQ_ID_ARM_TRAY1:
      case EQ_ID_ARM_TRAY2:
      case EQ_ID_ALIGNER:
      case EQ_ID_FLIPER:
         tarPos = srcPos;
         tarSlot = 1;
         break;
      case EQ_ID_Bonder1:
         if (1 <= srcSlot && srcSlot <= 2) {
            tarPos = 9 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_Bonder2:
         if (1 <= srcSlot && srcSlot <= 2) {
            tarPos = 11 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_VACUUMBAKE:
         if (1 <= srcSlot && srcSlot <= 2) {
            tarPos = 13 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_BAKE_COOLING:
         if (1 <= srcSlot && srcSlot <= 4) {
            tarPos = 15 + srcSlot;
            tarSlot = 1;
         }
         break;
      case EQ_ID_MEASUREMENT:
         tarPos = 19;
         tarSlot = 1;
         break;
      default:
         tarPos = srcPos;
         tarSlot = srcSlot;
         break;
      }
   }
   int CMaster::abortCurrentTask()
@@ -1261,4 +1338,18 @@
      return 0;
   }
   void CMaster::setPortType(unsigned int index, BOOL enable, int type, int mode,
      int cassetteType, int transferMode, BOOL autoChangeEnable)
   {
      ASSERT(index < 4);
      int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4};
      CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[index]);
      pPort->localEanblePort(enable);
      pPort->localSetPortType((SERVO::PortType)type);
      pPort->localSetPortMode((SERVO::PortMode)mode);
      pPort->localSetCessetteType((SERVO::CassetteType)cassetteType);
      pPort->localSetTransferMode((SERVO::TransferMode)transferMode);
      pPort->localAutoChangeEnable(autoChangeEnable);
   }
}