mrDarker
2025-06-05 8d437e955d1223ce622343ac7da90b1ad6fab954
Merge branch 'master' into liuyang
已修改13个文件
216 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CBakeCooling.cpp 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.cpp 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPath.cpp 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPath.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CSlot.cpp 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CSlot.h 2 ●●●●● 补丁 | 查看 | 原始文档 | 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
@@ -326,7 +326,7 @@
        else {
            for (int i = 0; i < SLOT_MAX; i++) {
                m_slot[i].serialize(ar);
                if (m_slot[i].getContext() != nullptr) {
                if (m_slot[i].getTempContext() != nullptr) {
                    CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
                    pGlass->serialize(ar);
                    m_slot[i].setContext(pGlass);
@@ -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,7 +668,6 @@
                    lock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 1);
                    }
@@ -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;
SourceCode/Bond/Servo/CSlot.cpp
@@ -11,6 +11,7 @@
        m_bEnable = FALSE;
        m_bLock = FALSE;
        m_pContext = nullptr;
        m_pTempContext = nullptr;
    }
    CSlot::~CSlot()
@@ -98,8 +99,8 @@
    void CSlot::setContext(CContext* pContext)
    {
        if (pContext != nullptr) {
            pContext->release();
        if (m_pContext != nullptr) {
            m_pContext->release();
        }
        m_pContext = pContext;
@@ -111,6 +112,11 @@
    CContext* CSlot::getContext()
    {
        return m_pContext;
    }
    CContext* CSlot::getTempContext()
    {
        return m_pTempContext;
    }
    void CSlot::serialize(CArchive& ar)
@@ -131,7 +137,7 @@
            ar >> m_nNo;
            ar >> i32; m_materialsType = (MaterialsType)i32;
            ReadString(ar, m_strName);
            ar >> i64; m_pContext = (CContext*)i64;
            ar >> i64; m_pTempContext = (CContext*)i64;
            ar >> m_bEnable;
            ar >> m_bLock;
        }
SourceCode/Bond/Servo/CSlot.h
@@ -27,6 +27,7 @@
        void setName(const char* pszName);
        BOOL isEmpty();
        CContext* getContext();
        CContext* getTempContext();
        void setContext(CContext* pContext);
        void serialize(CArchive& ar);
@@ -40,6 +41,7 @@
        MaterialsType m_materialsType;
        std::string m_strName;
        CContext* m_pContext;
        CContext* m_pTempContext;
        BOOL m_bEnable;
        BOOL m_bLock;
    };