| SourceCode/Bond/Servo/CBakeCooling.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CEquipment.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CEquipment.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CGlass.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CGlass.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CLoadPort.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMaster.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMaster.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CPath.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CPath.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CRobotTask.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/Servo/CBakeCooling.cpp
@@ -44,7 +44,19 @@ m_slot[0].enable(); m_slot[0].setPosition(m_nID); m_slot[0].setNo(1); m_slot[0].setName("Slot 1"); m_slot[0].setName("Bake 1"); m_slot[1].enable(); m_slot[1].setPosition(m_nID); m_slot[1].setNo(2); m_slot[1].setName("Bake 2"); m_slot[2].enable(); m_slot[2].setPosition(m_nID); m_slot[2].setNo(3); m_slot[2].setName("Cooling 1"); m_slot[3].enable(); m_slot[3].setPosition(m_nID); m_slot[3].setNo(4); m_slot[3].setName("Cooling 2"); } void CBakeCooling::onTimer(UINT nTimerid) SourceCode/Bond/Servo/CEquipment.cpp
@@ -722,6 +722,7 @@ CGlass* pGlass = (CGlass*)m_slot[i].getContext(); if (pGlass != nullptr && compareJobDataB(pJobDataB, pGlass->getJobDataB())) { pContext = pGlass; if (pGlass != nullptr) pGlass->addRef(); m_slot[i].setContext(nullptr); break; } @@ -737,7 +738,6 @@ for (int i = 0; i < SLOT_MAX; i++) { CGlass* pGlass = (CGlass*)m_slot[i].getContext(); if (pGlass != nullptr && compareJobDataB(pBuddy->getJobDataB(), pGlass->getJobDataB())) { pContext->release(); m_slot[i].setContext(nullptr); break; } @@ -804,6 +804,20 @@ } return FALSE; } CGlass* CEquipment::getGlass(const char* pszGlassId) { for (int i = 0; i < SLOT_MAX; i++) { if (!m_slot[i].isEnable()) continue; CGlass* pGlass = (CGlass*)m_slot[i].getContext(); if (pGlass == nullptr) continue; if (pGlass->getID().compare(pszGlassId) == 0) { return pGlass; } } return nullptr; } bool CEquipment::isAlarmStep(SERVO::CStep* pStep) @@ -1051,6 +1065,27 @@ return nullptr; } CSlot* CEquipment::getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates) { for (auto item : candidates) { for (int i = 0; i < SLOT_MAX; i++) { if (item == i + 1) { if (!m_slot[i].isEnable()) continue; if (m_slot[i].isLock()) continue; if (!m_slot[i].isEmpty()) continue; MaterialsType slotType = m_slot[i].getType(); if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue; if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue; return &m_slot[i]; } } } return nullptr; } CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType) { for (int i = 0; i < SLOT_MAX; i++) { @@ -1062,6 +1097,25 @@ MaterialsType glassType = pGlass->getType(); if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue; if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue; return &m_slot[i]; } return nullptr; } CSlot* CEquipment::getProcessedSlot(MaterialsType putSlotType) { for (int i = 0; i < SLOT_MAX; i++) { if (!m_slot[i].isEnable()) continue; if (m_slot[i].isLock()) continue; CGlass* pGlass = (CGlass*)m_slot[i].getContext(); if (pGlass == nullptr) continue; MaterialsType glassType = pGlass->getType(); if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue; if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue; if (!pGlass->isProcessed(m_nID)) continue; return &m_slot[i]; } @@ -1384,6 +1438,11 @@ int CEquipment::onProcessData(CProcessData* pProcessData) { LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str()); CGlass* pGlass = getGlass(pProcessData->getGlassId().c_str()); if (pGlass != nullptr) { pGlass->processEnd(m_nID); } return 0; } SourceCode/Bond/Servo/CEquipment.h
@@ -151,8 +151,14 @@ // 获取一个指定物料类型(G1,G2,G1&G2)的空槽位 CSlot* getAvailableSlotForGlass(MaterialsType type); // 在指定的槽列表中,获取一个指定物料类型(G1,G2,G1&G2)的空槽位 CSlot* getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates); // 获取一个指定物料类型(G1,G2,G1&G2)的非空槽位 CSlot* getNonEmptySlot(MaterialsType type); // 获取一个指定物料类型(G1,G2,G1&G2)的且已经加工处理的槽位 CSlot* getProcessedSlot(MaterialsType putSlotType); // 获取玻璃物料 CGlass* getGlassFromSlot(int slotNo); @@ -164,6 +170,9 @@ // 是否有玻璃 BOOL hasGlass(); // 获取指定ID的glass CGlass * getGlass(const char* pszGlassId); // 指定槽位是否可以放置玻璃 BOOL canPlaceGlassInSlot(const short slotIndex); SourceCode/Bond/Servo/CGlass.cpp
@@ -84,6 +84,20 @@ return m_pPath; } CPath* CGlass::getPathWithSiteId(unsigned int nSiteId) { CPath* pTemp = m_pPath; while (pTemp != nullptr) { if (pTemp->getSiteID() == nSiteId) { return pTemp; } pTemp = pTemp->getNext(); } return nullptr; } void CGlass::addPath(unsigned int nSiteId) { CPath* pPath = new CPath(nSiteId); @@ -182,4 +196,20 @@ { return m_strBuddyId; } void CGlass::processEnd(unsigned int nSiteId) { CPath* pPath = getPathWithSiteID(nSiteId); if (pPath != nullptr) { pPath->processEnd(); } } BOOL CGlass::isProcessed(unsigned int nSiteId) { CPath* pPath = getPathWithSiteID(nSiteId); if (pPath == nullptr) return FALSE; return pPath->isProcessEnd(); } } SourceCode/Bond/Servo/CGlass.h
@@ -26,6 +26,7 @@ std::string& getID(); CPath* getPathWithSiteID(unsigned int nSiteId); CPath* getPath(); CPath* getPathWithSiteId(unsigned int nSiteId); void addPath(unsigned int nSiteId); void serialize(CArchive& ar); void setJobDataB(CJobDataB* pJobDataB); @@ -35,6 +36,8 @@ BOOL setBuddy(CGlass* pGlass); CGlass* getBuddy(); std::string& getBuddyId(); void processEnd(unsigned int nSiteId); BOOL isProcessed(unsigned int nSiteId); private: MaterialsType m_type; SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1097,6 +1097,8 @@ } CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass(); pGlass->addPath(m_nID); pGlass->processEnd(m_nID); pGlass->setID(szBuffer); pGlass->setJobDataB(&jb); pGlass->setType(type); SourceCode/Bond/Servo/CMaster.cpp
@@ -294,6 +294,7 @@ CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER); CBonder* pBonder1 = (CBonder*)getEquipment(EQ_ID_Bonder1); CBonder* pBonder2 = (CBonder*)getEquipment(EQ_ID_Bonder2); CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING); ASSERT(pLoadPort1); ASSERT(pLoadPort2); @@ -302,6 +303,7 @@ ASSERT(pAligner); ASSERT(pBonder1); ASSERT(pBonder2); ASSERT(pBakeCooling); while (1) { // 待退出信号或时间到 @@ -365,6 +367,28 @@ } // Bonder -> BakeCooling m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling, primaryType, secondaryType); if (m_pActiveRobotTask != nullptr) { std::string strDescription = m_pActiveRobotTask->getDescription(); unlock(); if (m_listener.onRobotTaskEvent != nullptr) { m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0); } LOGI("创建新任务<%s>...", strDescription.c_str()); continue; } m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling, primaryType, secondaryType); if (m_pActiveRobotTask != nullptr) { std::string strDescription = m_pActiveRobotTask->getDescription(); unlock(); if (m_listener.onRobotTaskEvent != nullptr) { m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0); } LOGI("创建新任务<%s>...", strDescription.c_str()); continue; } // Aligner -> Bonder m_pActiveRobotTask = createTransferTask(pAligner, pBonder1, primaryType, secondaryType); @@ -469,9 +493,6 @@ LOGI("创建新任务<%s>...", strDescription.c_str()); continue; } // Bonder -> BakeCooling // BakeCooling ->Measurement @@ -647,12 +668,11 @@ lock(); delete m_pActiveRobotTask; m_pActiveRobotTask = nullptr; if (m_listener.onRobotTaskEvent != nullptr) { m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0); } delete m_pActiveRobotTask; m_pActiveRobotTask = nullptr; } unlock(); } @@ -1074,10 +1094,36 @@ CRobotTask* pTask = nullptr; CSlot* pSrcSlot, * pTarSlot; pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType); pSrcSlot = pSrcEq->getNonEmptySlot(primaryType); pSrcSlot = pSrcEq->getProcessedSlot(primaryType); if (pSrcSlot == nullptr || nullptr == pTarSlot) { pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType); pSrcSlot = pSrcEq->getNonEmptySlot(secondaryType); pSrcSlot = pSrcEq->getProcessedSlot(secondaryType); } if (pSrcSlot != nullptr && nullptr != pTarSlot) { pTask = new CRobotTask(); pTask->setContext(pSrcSlot->getContext()); pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(), pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo()); } return pTask; } CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq, MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/) { std::vector<int> slots = {1, 2}; CRobotTask* pTask = nullptr; CSlot* pSrcSlot, * pTarSlot; pTarSlot = pTarEq->getAvailableSlotForGlass2(primaryType, slots); pSrcSlot = pSrcEq->getProcessedSlot(primaryType); if (pSrcSlot == nullptr || nullptr == pTarSlot) { pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType); pSrcSlot = pSrcEq->getProcessedSlot(secondaryType); } SourceCode/Bond/Servo/CMaster.h
@@ -86,6 +86,8 @@ void setState(MASTERSTATE state); CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq, MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2); CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq, MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2); private: CRITICAL_SECTION m_criticalSection; SourceCode/Bond/Servo/CPath.cpp
@@ -9,6 +9,7 @@ m_nSiteID = 0; m_timeOut = 0; m_timeIn = CToolUnits::getTimestamp(); m_bProcessed = FALSE; m_pPrev = nullptr; m_pNext = nullptr; } @@ -20,6 +21,7 @@ m_timeIn = CToolUnits::getTimestamp(); m_pPrev = nullptr; m_pNext = nullptr; m_bProcessed = FALSE; } CPath::~CPath() @@ -45,6 +47,7 @@ ar << m_nSiteID; ar << m_timeIn; ar << m_timeOut; ar << m_bProcessed; ar << (ULONGLONG)m_pNext; if (m_pNext != nullptr) { m_pNext->serialize(ar); @@ -54,6 +57,7 @@ ar >> m_nSiteID; ar >> m_timeIn; ar >> m_timeOut; ar >> m_bProcessed; ULONGLONG ulNext; ar >> ulNext; if ((CPath*)ulNext != nullptr) { @@ -85,6 +89,16 @@ return m_timeOut; } void CPath::processEnd() { m_bProcessed = TRUE; } BOOL CPath::isProcessEnd() { return m_bProcessed; } CPath* CPath::getPrev() { return m_pPrev; SourceCode/Bond/Servo/CPath.h
@@ -21,11 +21,14 @@ ULONGLONG getInTime(); void setOutTime(ULONGLONG time); ULONGLONG getOutTime(); void processEnd(); BOOL isProcessEnd(); private: unsigned int m_nSiteID; ULONGLONG m_timeIn; ULONGLONG m_timeOut; BOOL m_bProcessed; CPath* m_pPrev; CPath* m_pNext; }; SourceCode/Bond/Servo/CRobotTask.cpp
@@ -63,8 +63,8 @@ void CRobotTask::setContext(CContext* pContext) { if (pContext != nullptr) { pContext->release(); if (m_pContext != nullptr) { m_pContext->release(); } m_pContext = pContext;