LAPTOP-SNT8I5JK\Boounion
2025-09-01 63686244746925d43248ceaf8d9e31f50df68a72
Merge branch 'clh'
已添加1个文件
已修改20个文件
515 ■■■■ 文件已修改
Document/CEID.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/Panel Bonder八零联合 SecsTest CheckList_v3.0.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.cpp 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 227 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.h 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PortConfigurationDlg.cpp 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoCommo.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/CollectionEventList.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/ReportList.txt 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/VariableList.txt 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/CEID.xlsx
Binary files differ
Document/Panel Bonder°ËÁãÁªºÏ SecsTest CheckList_v3.0.xlsx
Binary files differ
SourceCode/Bond/Servo/CBonder.cpp
@@ -460,7 +460,7 @@
        return m_nIndex;
    }
    BOOL CBonder::hasBondClass()
    BOOL CBonder::hasBondGlass()
    {
        CGlass* pGlass = (CGlass*)m_slot[1].getContext();
        if (pGlass == nullptr) return FALSE;
@@ -468,7 +468,7 @@
        return pBuddy != nullptr;
    }
    BOOL CBonder::hasG2Class()
    BOOL CBonder::hasG2Glass()
    {
        CGlass* pGlass = (CGlass*)m_slot[0].getContext();
        return (pGlass != nullptr);
SourceCode/Bond/Servo/CBonder.h
@@ -28,8 +28,8 @@
    public:
        void setIndex(unsigned int index);
        unsigned int getIndex();
        BOOL hasBondClass();
        BOOL hasG2Class();
        BOOL hasBondGlass();
        BOOL hasG2Glass();
    private:
        unsigned int m_nIndex;
SourceCode/Bond/Servo/CEFEM.cpp
@@ -892,7 +892,7 @@
    {
        LOGI("<CEFEM>Robot status:%d, ARM1:%s, ARM2:%s",
            m_robotData.status,
            m_robotData.armState[1] ? _T("ON") : _T("OFF"),
            m_robotData.armState[2] ? _T("ON") : _T("OFF"));
            m_robotData.armState[0] ? _T("ON") : _T("OFF"),
            m_robotData.armState[1] ? _T("ON") : _T("OFF"));
    }
}
SourceCode/Bond/Servo/CEquipment.cpp
@@ -27,6 +27,7 @@
        m_pArm = nullptr;
        m_processState = PROCESS_STATE::Ready;
        m_blockReadBit = { 0 };
        m_nTestFlag = 0;
        InitializeCriticalSection(&m_criticalSection);
    }
@@ -1328,24 +1329,32 @@
    CSlot* CEquipment::getProcessedSlot(MaterialsType putSlotType, BOOL bJobMode/* = FALSE*/)
    {
        for (int i = 0; i < SLOT_MAX; i++) {
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 001");
            if (!m_slot[i].isEnable()) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 002");
            if (m_slot[i].isLock()) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 003");
            CGlass* pGlass = (CGlass*)m_slot[i].getContext();
            if (!isSlotProcessed(i)) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 004");
            if (pGlass == nullptr) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 005");
            if (!pGlass->isScheduledForProcessing()) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 006");
            if (bJobMode && pGlass->getProcessJob() == nullptr) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 007");
            if(pGlass->getInspResult(m_nID, 0) == InspResult::Fail) continue;
            int lsPath = m_slot[i].getLinkSignalPath();
            if(!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE]
                || m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
                || !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK]
                || !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE] ) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 008");
            MaterialsType glassType = pGlass->getType();
            if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 009");
            if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
            if (m_nTestFlag == 1) LOGI("getProcessedSlot 00a");
            return &m_slot[i];
        }
@@ -1445,6 +1454,13 @@
        return TRUE;
    }
    BOOL CEquipment::slotHasGlass(int slotIndex/* = 0*/)
    {
        ASSERT(slotIndex < 8);
        CGlass* pGlass = (CGlass*)m_slot[slotIndex].getContext();
        return (pGlass != nullptr);
    }
    int CEquipment::removeGlass(int slotNo)
    {
        CSlot* pSlot = nullptr;
SourceCode/Bond/Servo/CEquipment.h
@@ -202,6 +202,7 @@
        // æ˜¯å¦æœ‰çŽ»ç’ƒ
        BOOL hasGlass();
        BOOL slotHasGlass(int slotIndex = 0);
        // æŒ‡å®šæ§½ä½æ˜¯å¦å¯ä»¥æ”¾ç½®çŽ»ç’ƒ
        BOOL canPlaceGlassInSlot(const short slotIndex);
@@ -290,6 +291,9 @@
    private:
        CEquipment* m_pArm;
    public:
        int m_nTestFlag;
    };
}
SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -180,7 +180,17 @@
            SERVO::CGlass* pGlass = (SERVO::CGlass*)pSlot->getContext();
            if (pGlass != nullptr) {
                m_listCtrl.SetItemText(index, 3, pGlass->getID().c_str());
                CString strText;
                if (pGlass->getType() == SERVO::MaterialsType::G1) {
                    strText.Format(_T("(G1)%s"), pGlass->getID().c_str());
                }
                else if (pGlass->getType() == SERVO::MaterialsType::G2) {
                    strText.Format(_T("(G2)%s"), pGlass->getID().c_str());
                }
                else {
                    strText.Format(_T("(%s"), pGlass->getID().c_str());
                }
                m_listCtrl.SetItemText(index, 3, strText);
                SERVO::CGlass* pBuddy = pGlass->getBuddy();
                if (pBuddy != nullptr) {
                    m_listCtrl.SetItemText(index, 4, pBuddy->getID().c_str());
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -363,14 +363,15 @@
        // æ¨¡æ‹Ÿæµ‹è¯•
        /*
        if (m_nIndex == 0) {
            static int ii = 0;
            ii++;
            if (ii == 50) {
                char szBuffer[64] = {0};
                CStep* pStep = getStepWithName(STEP_EQ_PORT1_INUSE);
                CStep* pStep = getStepWithName(STEP_EQ_PORT1_BLOCKED);
                CPortStatusReport portStatusReport;
                portStatusReport.setPortStatus(PORT_INUSE);
                portStatusReport.setPortStatus(PORT_BLOCKED);
                portStatusReport.setJobExistenceSlot(0xf);
                portStatusReport.setCassetteId("CID1001");
                int nRet = portStatusReport.serialize(szBuffer, 64);
@@ -382,15 +383,16 @@
            ii++;
            if (ii == 55) {
                char szBuffer[64] = { 0 };
                CStep* pStep = getStepWithName(STEP_EQ_PORT2_INUSE);
                CStep* pStep = getStepWithName(STEP_EQ_PORT2_BLOCKED);
                CPortStatusReport portStatusReport;
                portStatusReport.setPortStatus(PORT_INUSE);
                portStatusReport.setPortStatus(PORT_BLOCKED);
                portStatusReport.setJobExistenceSlot(0xff );
                portStatusReport.setCassetteId("CID1004");
                int nRet = portStatusReport.serialize(szBuffer, 64);
                decodePortStatusReport(pStep, szBuffer, 64);
            }
        }
        */
    }
    void CLoadPort::serialize(CArchive& ar)
SourceCode/Bond/Servo/CMaster.cpp
@@ -63,6 +63,7 @@
        m_nContinuousTransferCount = 0;
        m_nContinuousTransferStep = CTStep_Unknow;
        m_pControlJob = nullptr;
        m_nTestFlag = 0;
        InitializeCriticalSection(&m_criticalSection);
    }
@@ -505,13 +506,11 @@
                }
                
                // æ£€æŸ¥çœ‹æ˜¯å¦éƒ½å·²ç»åˆ‡æ¢åˆ°START状态
                /*
                if (!bIomcOk[6]) {
                    unlock();
                    setState(MASTERSTATE::MSERROR);
                    continue;
                }
                */
                unlock();
                if(m_bContinuousTransfer)
@@ -596,37 +595,62 @@
                }
                // æ­¤å¤„检测优先类型和次要类型(G1或G2)
                // å¦‚果其中一Bonder有单个玻璃,优先取它的配对类型,否则无所谓了
                primaryType = MaterialsType::G1;
                secondaryType = MaterialsType::G2;
                if ((!pBonder1->canPlaceGlassInSlot(0) && !pBonder1->canPlaceGlassInSlot(1))
                    && (!pBonder2->canPlaceGlassInSlot(0) && !pBonder2->canPlaceGlassInSlot(1))) {
                    // å¦‚æžœG1和G2都满了,那就看Aligner, å¦‚æžœAligner有玻璃为G1, åˆ™å–G2
                    CGlass* pGlass = pAligner->getGlassFromSlot(1);
                    if (pGlass != nullptr && pGlass->getType() == MaterialsType::G1) {
                        primaryType = MaterialsType::G2;
                        secondaryType = MaterialsType::G1;
                    }
                // Bonder1、Bonder2、Fliper、VacuumBake、Aligner,统计G2和G1的数量, é…å¯¹ç»„æ•°, å¤šå‡ºçš„类型
                int nG2Count = 0, nG1Count = 0, nGlassGroup, nExtraType;
                if (pBonder1->slotHasGlass(0)) {
                    nG2Count++;
                }
                else if ((pBonder1->canPlaceGlassInSlot(0) && !pBonder1->canPlaceGlassInSlot(1))
                    || (pBonder2->canPlaceGlassInSlot(0) && !pBonder2->canPlaceGlassInSlot(1))) {
                    primaryType = MaterialsType::G2;
                    secondaryType = MaterialsType::G1;
                if (pBonder1->slotHasGlass(1)) {
                    nG1Count++;
                }
                if (pBonder2->slotHasGlass(0)) {
                    nG2Count++;
                }
                if (pBonder2->slotHasGlass(1)) {
                    nG1Count++;
                }
                if (pFliper->slotHasGlass(0)) {
                    nG2Count++;
                }
                if (pVacuumBake->slotHasGlass(0)) {
                    nG1Count++;
                }
                if (pVacuumBake->slotHasGlass(1)) {
                    nG1Count++;
                }
                CGlass* pTempGlass = pAligner->getGlassFromSlot(0);
                if (pTempGlass != nullptr) {
                    MaterialsType type = pTempGlass->getType();
                    if(type == MaterialsType::G1)
                        nG1Count++;
                    else if (type == MaterialsType::G2)
                        nG2Count++;
                }
                nGlassGroup = min(nG1Count, nG2Count);
                if (nG1Count == nG2Count) {
                    nExtraType = 0;
                }
                else if (nG1Count > nG2Count) {
                    nExtraType = 1;
                }
                else {
                    nExtraType = 2;
                }
                secondaryType = MaterialsType::G0;
                // Measurement -> LoadPort
                if (rmd.armState[0] || rmd.armState[1]) {
                    LOGI("Arm1 %s, Arm2 %s.", rmd.armState[0] ? _T("不可用") : _T("可用"),
                        rmd.armState[1] ? _T("不可用") : _T("可用"));
                }
                for (int s = 0; s < 4; s++) {
                    PortType pt = pLoadPorts[s]->getPortType();
                    if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
                        && (pt == PortType::Unloading || pt == PortType::Both)
                        && pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
                        m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], primaryType, secondaryType);
                        m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
                        if (m_pActiveRobotTask != nullptr) {
                            goto PORT_PUT;
                        }
@@ -673,25 +697,30 @@
                // Fliper(G2) -> Bonder
                auto pSrcSlot = pVacuumBake->getProcessedSlot(primaryType);
                if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondClass()) {
                    m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
                //m_nTestFlag = 1;
                //pVacuumBake->m_nTestFlag = 1;
                auto pSrcSlot = pVacuumBake->getProcessedSlot(MaterialsType::G1);
                //LOGI("<Master>pSrcSlot = %x", pSrcSlot,);
                if (pSrcSlot != nullptr && !rmd.armState[1]
                    && pBonder1->canPlaceGlassInSlot(0)) {
                    m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, MaterialsType::G2, MaterialsType::G0, 2);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondClass()) {
                    m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
                if (pSrcSlot != nullptr && !rmd.armState[1]
                    && pBonder2->canPlaceGlassInSlot(0)) {
                    m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, MaterialsType::G2, MaterialsType::G0, 2);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                //m_nTestFlag = 0
                    ;
                // VacuumBake(G1) -> Bonder
                if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
                    m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
                if (!rmd.armState[0] && pBonder1->slotHasGlass(0) && !pBonder1->slotHasGlass(1)) {
                    m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, MaterialsType::G1, MaterialsType::G0);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
                    m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
                if (!rmd.armState[0] && pBonder2->slotHasGlass(0) && !pBonder2->slotHasGlass(1)) {
                    m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, MaterialsType::G1, MaterialsType::G0);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
@@ -699,13 +728,16 @@
                // Aligner -> Fliper(G2)
                // Aligner -> VacuumBake(G1)
                if (!rmd.armState[1]) {
                    m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType);
                    m_pActiveRobotTask = createTransferTask(pAligner, pFliper, MaterialsType::G2, secondaryType);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                if (!rmd.armState[0]) {
                    m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
                    // m_nTestFlag = 1;
                    if (m_nTestFlag == 1) LOGI("createTransferTask 004df %d, %d", MaterialsType::G1, secondaryType);
                    m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, MaterialsType::G1, secondaryType);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                    m_nTestFlag = 0;
                }
@@ -717,6 +749,17 @@
                // LoadPort -> Aligner
                if (nGlassGroup >= 2) {
                    unlock();
                    continue;
                }
                if(nExtraType == 0)
                    primaryType = MaterialsType::G2;
                else {
                    primaryType = MaterialsType::G1;
                }
                for (int s = 0; s < 4; s++) {
                    PortType pt = pLoadPorts[s]->getPortType();
                    if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
@@ -761,6 +804,10 @@
                if (m_pControlJob->state() == CJState::Queued) {
                    LOGI("<Master>ControlJob已经启动");
                    m_pControlJob->start();
                    if (m_listener.onCjStart != nullptr) {
                        m_listener.onCjStart(this, m_pControlJob);
                    }
                }
                if (m_pControlJob->state() == CJState::Paused) {
                    LOGI("<Master>ControlJob已经恢复运行");
@@ -889,23 +936,23 @@
                // Fliper(G2) -> Bonder
                auto pSrcSlot = pVacuumBake->getProcessedSlot(primaryType);
                if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondClass()) {
                if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondGlass()) {
                    m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondClass()) {
                if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondGlass()) {
                    m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                // VacuumBake(G1) -> Bonder
                if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
                if (!rmd.armState[0] && !pBonder1->hasBondGlass()) {
                    m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
                if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
                if (!rmd.armState[0] && !pBonder2->hasBondGlass()) {
                    m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
                    CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                }
@@ -950,6 +997,11 @@
                            else {
                                LOGE("<Master>Glass(%s)从等待列队到工艺列队转移失败.",
                                    pGlass->getID().c_str());
                            }
                            // è¿™é‡Œä¸ŠæŠ¥Panel Start事件
                            if (m_listener.onPanelStart != nullptr) {
                                m_listener.onPanelStart(this, pGlass);
                            }
                            goto BATCH_PORT_GET;
@@ -1090,7 +1142,7 @@
                
                // Bonder1 -> Bonder2
                if ((m_nContinuousTransferStep == CTStep_Unknow || m_nContinuousTransferStep == CTStep_Fliper_Bonder1)
                    && !rmd.armState[0] && !pBonder2->hasBondClass()) {
                    && !rmd.armState[0] && !pBonder2->hasBondGlass()) {
                    m_pActiveRobotTask = createTransferTask_continuous_transfer(pBonder1,
                        1, pBonder2, 1);
                    if (m_pActiveRobotTask != nullptr) {
@@ -1102,7 +1154,7 @@
                // Fliper(G2) -> Bonder1
                if ((m_nContinuousTransferStep == CTStep_Unknow || m_nContinuousTransferStep == CTStep_Aligner_Fliper)
                    &&!rmd.armState[0] && !pBonder1->hasBondClass()) {
                    &&!rmd.armState[0] && !pBonder1->hasBondGlass()) {
                    m_pActiveRobotTask = createTransferTask_continuous_transfer(pFliper,
                        0, pBonder1, 1);
                    if (m_pActiveRobotTask != nullptr) {
@@ -1310,7 +1362,7 @@
                    if (pGlass == nullptr) {
                        bOk = TRUE;
                        slot = m_pActiveRobotTask->getTarSlot();
                        LOGI("<CMaster>onPreFethedOutJob, å·²æ ¡éªŒæ•°æ®ä¸€è‡´æ€§.");
                        LOGI("<CMaster>onPreStoredJob, å·²æ ¡éªŒæ•°æ®ä¸€è‡´æ€§.");
                    }
                }
@@ -1321,7 +1373,7 @@
                    if (pGlass == nullptr && m_pActiveRobotTask->getSrcSlot() == port) {
                        bOk = TRUE;
                        slot = m_pActiveRobotTask->getSrcSlot();
                        LOGI("<CMaster>onPreFethedOutJob, å·²æ ¡éªŒæ•°æ®ä¸€è‡´æ€§.");
                        LOGI("<CMaster>onPreStoredJob, å·²æ ¡éªŒæ•°æ®ä¸€è‡´æ€§.");
                    }
                }
            }
@@ -1384,6 +1436,7 @@
                    if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
                        CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
                        pGlass->complete();
                        this->saveState();
                        bool bMoved = glassFromInPorcessToComplete(pGlass);
                        if (bMoved) {
                            LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.",
@@ -1393,14 +1446,29 @@
                            LOGE("<Master>Glass(%s)从工艺列队到完成列队转移失败.",
                                pGlass->getID().c_str());
                        }
                        if (m_listener.onPanelEnd != nullptr) {
                            m_listener.onPanelEnd(this, pGlass);
                        }
                        // æ£€æŸ¥PJ是否已经完成
                        CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext());
                        if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
                            this->saveState();
                            LOGE("<Master>ProcessJob(%s)完成.",
                                pJob->id().c_str());
                            if (m_listener.onPjEnd != nullptr) {
                                m_listener.onPjEnd(this, pJob);
                            }
                            // æ£€æŸ¥CJ是否已经完成
                            ASSERT(m_pControlJob);
                            if (checkAndUpdateCjComplete(m_pControlJob)) {
                                this->saveState();
                                LOGE("<Master>ControlJob(%s)完成.",
                                    m_pControlJob->id().c_str());
                                if (m_listener.onCjEnd != nullptr) {
                                    m_listener.onCjEnd(this, pJob);
                                }
                            }
                        }
                    }
@@ -1711,7 +1779,6 @@
        // æ¨¡æ‹Ÿæµ‹è¯•
        /*
        static int aaa = 0;
        aaa++;
        if (aaa % 30 == 0) {
@@ -1719,6 +1786,12 @@
                CGlass* pGlass = m_queueGlasses.front();
                pGlass->start();
                glassFromQueueToInPorcess(pGlass);
                this->saveState();
                // è¿™é‡Œä¸ŠæŠ¥Panel Start事件
                if (m_listener.onPanelStart != nullptr) {
                    m_listener.onPanelStart(this, pGlass);
                }
            }
        }
@@ -1727,19 +1800,37 @@
                CGlass* pGlass = m_inProcesGlasses.front();
                pGlass->complete();
                glassFromInPorcessToComplete(pGlass);
                this->saveState();
                // è¿™é‡Œä¸ŠæŠ¥Panel End事件
                if (m_listener.onPanelEnd != nullptr) {
                    m_listener.onPanelEnd(this, pGlass);
                }
                CProcessJob* pJob = getGlassProcessJob(pGlass);
                if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
                    processJobFromInPorcessToComplete(pJob);
                    this->saveState();
                    LOGE("<Master>ProcessJob(%s)完成.",
                        pJob->id().c_str());
                    if (m_listener.onPjEnd != nullptr) {
                        m_listener.onPjEnd(this, pJob);
                    }
                    // æ£€æŸ¥CJ是否已经完成
                    ASSERT(m_pControlJob);
                    if (checkAndUpdateCjComplete(m_pControlJob)) {
                        this->saveState();
                        LOGE("<Master>ControlJob(%s)完成.",
                            m_pControlJob->id().c_str());
                        if (m_listener.onCjEnd != nullptr) {
                            m_listener.onCjEnd(this, pJob);
                        }
                    }
                }
            }
        }
        */
    }
    void CMaster::connectEquipments()
@@ -1909,16 +2000,17 @@
        if (!pSrcEq->IsEnabled()) { 
            return nullptr;
        }
        CRobotTask* pTask = nullptr;
        CSlot* pSrcSlot, * pTarSlot;
        pSrcEq->m_nTestFlag = m_nTestFlag;
        pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
        pSrcSlot = pSrcEq->getProcessedSlot(primaryType, bJobMode);
        if (pSrcSlot == nullptr || nullptr == pTarSlot) {
        if (m_nTestFlag == 1) LOGI("createTransferTask 003 %x, %x", pTarSlot, pSrcSlot);
        if (pSrcSlot == nullptr || nullptr == pTarSlot && secondaryType != SERVO::MaterialsType::G0) {
            pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
            pSrcSlot = pSrcEq->getProcessedSlot(secondaryType, bJobMode);
        }
        if (m_nTestFlag == 1) LOGI("createTransferTask 004 %x, %x", pTarSlot, pSrcSlot);
        if (pSrcSlot != nullptr && nullptr != pTarSlot) {
            pTask = new CRobotTask();
@@ -2438,8 +2530,8 @@
        for (const auto pj : pjs) {
            if (pj->state() == PJState::Queued) {
                pj->start();
                return pj;
            }
            return pj;
        }
@@ -2513,6 +2605,17 @@
        return false;
    }
    bool CMaster::processJobFromInPorcessToComplete(CProcessJob* pProcessJob)
    {
        auto it = std::find(m_inProcesJobs.begin(), m_inProcesJobs.end(), pProcessJob);
        if (it != m_inProcesJobs.end()) {
            m_completeProcessJobs.push_back(*it);
            m_inProcesJobs.erase(it);
            return true;
        }
        return false;
    }
    bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob)
    {
        ASSERT(pJob);
@@ -2521,10 +2624,26 @@
        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;
                auto state = ((CGlass*)g)->state();
                if (state != GlsState::Aborted && state != GlsState::Completed
                    && state != GlsState::Failed) return false;
            }
        }
        return pJob->complete();
    }
    bool CMaster::checkAndUpdateCjComplete(CControlJob* pJob)
    {
        ASSERT(pJob);
        auto state = pJob->state();
        if (state != CJState::Executing && state != CJState::Paused) return false;
        for (auto pj : pJob->getPjs()) {
            auto state = pj->state();
            if (state != PJState::Aborted && state != PJState::Completed
                && state != PJState::Failed) {
                return false;
            }
        }
SourceCode/Bond/Servo/CMaster.h
@@ -65,8 +65,12 @@
        ONROBOTTASKEVENT        onRobotTaskEvent;
        ONLOADPORTSTATUSCHANGED    onLoadPortStatusChanged;
        ONCTROUNDEND            onCTRoundEnd;
        ONPJSTART               onCjStart;
        ONPJSTART               onCjEnd;
        ONPJSTART               onPjStart;
        ONPJSTART               onPjEnd;
        ONPJSTART               onPanelStart;
        ONPJSTART               onPanelEnd;
    } MasterListener;
    class CMaster : public IResourceView
@@ -167,7 +171,9 @@
        bool addGlassToQueue(CGlass* pGlass);
        bool glassFromQueueToInPorcess(CGlass* pGlass);
        bool glassFromInPorcessToComplete(CGlass* pGlass);
        bool processJobFromInPorcessToComplete(CProcessJob* pProcessJob);
        bool checkAndUpdatePjComplete(CProcessJob* pJob);
        bool checkAndUpdateCjComplete(CControlJob* pJob);
        CProcessJob* getGlassProcessJob(CGlass* pGlass);
@@ -217,6 +223,7 @@
        // æ–°å¢žå·²ç»å¼€å§‹å¤„理的ProcessJob列表
        std::vector<CProcessJob*> m_inProcesJobs;
        std::vector<CProcessJob*> m_completeProcessJobs;
        std::vector<CGlass*> m_queueGlasses;
        std::vector<CGlass*> m_inProcesGlasses;
        std::vector<CGlass*> m_completeGlasses;
@@ -227,6 +234,8 @@
        SERVO::CControlJob* m_pControlJob;
        std::vector<SERVO::CProcessJob*> m_processJobs;
        std::string m_strStatePath;
        int m_nTestFlag;
    };
}
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -1874,6 +1874,21 @@
    return requestEventReportSend("CarrierID_Readed");
}
int CHsmsPassive::requestEventReportSend_Port_Unload_Ready()
{
    return requestEventReportSend("Port_Unload_Ready");
}
int CHsmsPassive::requestEventReportSend_Port_Load_Ready()
{
    return requestEventReportSend("Port_Load_Ready");
}
int CHsmsPassive::requestEventReportSend_Port_Blocked()
{
    return requestEventReportSend("Port_Blocked");
}
int CHsmsPassive::requestEventReportSend_PJ_Queued()
{
    return requestEventReportSend("PJ_Queued");
@@ -1889,6 +1904,25 @@
    return requestEventReportSend("PJ_End");
}
int CHsmsPassive::requestEventReportSend_CJ_Start()
{
    return requestEventReportSend("CJ_Start");
}
int CHsmsPassive::requestEventReportSend_CJ_End()
{
    return requestEventReportSend("CJ_End");
}
int CHsmsPassive::requestEventReportSend_Panel_Start()
{
    return requestEventReportSend("Panel_Start");
}
int CHsmsPassive::requestEventReportSend_Panel_End()
{
    return requestEventReportSend("Panel_End");
}
SourceCode/Bond/Servo/HsmsPassive.h
@@ -191,9 +191,16 @@
    int requestEventReportSend(unsigned int CEID);
    int requestEventReportSend(const char* pszEventName);
    int requestEventReportSend_CarrierID_Readed();
    int requestEventReportSend_Port_Unload_Ready();
    int requestEventReportSend_Port_Load_Ready();
    int requestEventReportSend_Port_Blocked();
    int requestEventReportSend_PJ_Queued();
    int requestEventReportSend_PJ_Start();
    int requestEventReportSend_PJ_End();
    int requestEventReportSend_CJ_Start();
    int requestEventReportSend_CJ_End();
    int requestEventReportSend_Panel_Start();
    int requestEventReportSend_Panel_End();
private:
    void replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName);
SourceCode/Bond/Servo/Model.cpp
@@ -382,10 +382,42 @@
            }
            m_hsmsPassive.requestEventReportSend_CarrierID_Readed();
        }
        else if (status == PORT_BLOCKED) {
            SERVO::CLoadPort* pLoadPort = dynamic_cast<SERVO::CLoadPort*>(pEquipment);
            if (pLoadPort != nullptr) {
                m_hsmsPassive.setVariableValue("BlockedPortId", pLoadPort->getID());
            }
            m_hsmsPassive.requestEventReportSend_Port_Blocked();
        }
        else if (status == PORT_LOAD_READY) {
            SERVO::CLoadPort* pLoadPort = dynamic_cast<SERVO::CLoadPort*>(pEquipment);
            if (pLoadPort != nullptr) {
                m_hsmsPassive.setVariableValue("LoadReadyPortId", pLoadPort->getID());
            }
            m_hsmsPassive.requestEventReportSend_Port_Load_Ready();
        }
        else if (status == PORT_UNLOAD_READY) {
            SERVO::CLoadPort* pLoadPort = dynamic_cast<SERVO::CLoadPort*>(pEquipment);
            if (pLoadPort != nullptr) {
                m_hsmsPassive.setVariableValue("UnloadReadyPortId", pLoadPort->getID());
            }
            m_hsmsPassive.requestEventReportSend_Port_Unload_Ready();
        }
        notifyPtr(RX_CODE_LOADPORT_STATUS_CHANGED, pEquipment);
    };
    masterListener.onCTRoundEnd = [&](void* pMaster, int round) {
        m_configuration.setContinuousTransferCount(round);
    };
    masterListener.onCjStart = [&](void* pMaster, void* pj) {
        m_hsmsPassive.setVariableValue("CJStartID", ((SERVO::CControlJob*)pj)->id().c_str());
        m_hsmsPassive.requestEventReportSend_CJ_Start();
    };
    masterListener.onCjEnd = [&](void* pMaster, void* pj) {
        m_hsmsPassive.setVariableValue("CJEndID", ((SERVO::CControlJob*)pj)->id().c_str());
        m_hsmsPassive.requestEventReportSend_CJ_End();
        // ç»“批,保存ControlJob
        //
    };
    masterListener.onPjStart = [&](void* pMaster, void* pj) {
        m_hsmsPassive.setVariableValue("PJStartID", ((SERVO::CProcessJob*)pj)->id().c_str());
@@ -395,6 +427,14 @@
        m_hsmsPassive.setVariableValue("PJEndID", ((SERVO::CProcessJob*)pj)->id().c_str());
        m_hsmsPassive.requestEventReportSend_PJ_End();
    };
    masterListener.onPanelStart = [&](void* pMaster, void* pj) {
        m_hsmsPassive.setVariableValue("PanelStartID", ((SERVO::CGlass*)pj)->getID().c_str());
        m_hsmsPassive.requestEventReportSend_Panel_Start();
    };
    masterListener.onPanelEnd = [&](void* pMaster, void* pj) {
        m_hsmsPassive.setVariableValue("PanelEndID", ((SERVO::CGlass*)pj)->getID().c_str());
        m_hsmsPassive.requestEventReportSend_Panel_End();
    };
    m_master.setListener(masterListener);
    m_master.setContinuousTransferCount(m_configuration.getContinuousTransferCount());
SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -317,6 +317,7 @@
    }
    // èŽ·å– Grid è¡¨æ ¼ä¸­ Slot çŠ¶æ€ï¼ˆç¬¬1~8行)
    /*
    for (int i = 1; i <= SLOT_MAX; ++i) {
        SERVO::CGlass* pGlass = (SERVO::CGlass*)m_wndGrid.GetItemData(i, 0);
        if (pGlass != nullptr) {
@@ -324,6 +325,7 @@
            ASSERT(pCheck);
            pGlass->setScheduledForProcessing(pCheck->GetCheck());
            pGlass->setType(static_cast<SERVO::MaterialsType>(config.nMaterialType));
            LOGI("i: %d, nMaterialType:%d", i, config.nMaterialType);
            SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
            pJobDataS->setLotId(config.strLotID.c_str());
@@ -359,6 +361,56 @@
            }
        }
    }
    */
    // æ‰“勾为更新类型,暂时测试使用,原打色为是否加工
    for (int i = 1; i <= SLOT_MAX; ++i) {
        SERVO::CGlass* pGlass = (SERVO::CGlass*)m_wndGrid.GetItemData(i, 0);
        if (pGlass != nullptr) {
            CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
            ASSERT(pCheck);
            pGlass->setScheduledForProcessing(TRUE);
            if (pCheck->GetCheck()) {
                pGlass->setType(static_cast<SERVO::MaterialsType>(config.nMaterialType));
                LOGI("i: %d, nMaterialType:%d", i, config.nMaterialType);
                SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
                pJobDataS->setLotId(config.strLotID.c_str());
                pJobDataS->setProductId(config.strProductID.c_str());
                pJobDataS->setOperationId(config.strOperationID.c_str());
                pJobDataS->setMaterialsType(config.nMaterialType);
                RecipeInfo stRecipeInfo = RecipeManager::getInstance().getRecipeByPPID(config.strRecipe);
                std::vector<DeviceRecipe> vecRecipeInfo = stRecipeInfo.vecDeviceList;
                for (const auto& info : vecRecipeInfo) {
                    const std::string& name = info.strDeviceName;
                    short nRecipeID = (short)info.nRecipeID;
                    if (name == EQ_NAME_EFEM) {
                        pJobDataS->setDeviceRecipeId(0, nRecipeID);
                    }
                    else if (name == EQ_NAME_BONDER1) {
                        pJobDataS->setDeviceRecipeId(1, nRecipeID);
                    }
                    else if (name == EQ_NAME_BONDER2) {
                        pJobDataS->setDeviceRecipeId(2, nRecipeID);
                    }
                    else if (name == EQ_NAME_BAKE_COOLING) {
                        pJobDataS->setDeviceRecipeId(3, nRecipeID);
                    }
                    else if (name == EQ_NAME_VACUUMBAKE) {
                        pJobDataS->setDeviceRecipeId(4, nRecipeID);
                    }
                    else if (name == EQ_NAME_MEASUREMENT) {
                        pJobDataS->setDeviceRecipeId(5, nRecipeID);
                    }
                }
            }
        }
    }
    GetDlgItem(IDC_BUTTON_PROCESS_START)->EnableWindow(TRUE);
    GetDlgItem(IDC_BUTTON_PROCESS_CANCEL)->EnableWindow(TRUE);
SourceCode/Bond/Servo/Servo.vcxproj.user
@@ -7,6 +7,6 @@
    <RemoteDebuggerCommand>\\DESKTOP-IODBVIQ\Servo\Debug\Servo.exe</RemoteDebuggerCommand>
    <RemoteDebuggerWorkingDirectory>\\DESKTOP-IODBVIQ\Servo\Debug\</RemoteDebuggerWorkingDirectory>
    <RemoteDebuggerServerName>DESKTOP-IODBVIQ</RemoteDebuggerServerName>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor>
  </PropertyGroup>
</Project>
SourceCode/Bond/Servo/ServoCommo.h
@@ -73,6 +73,7 @@
    };
    enum class MaterialsType {
        G0 = 0,
        G1 = 1,
        G2 = 2,
        G1G2 = 3
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -242,7 +242,7 @@
                        pEq2 = theApp.m_model.getMaster().getEquipment(pTask->getTarPosition());
                        if (pEq1 != nullptr && pEq2 != nullptr) {
                            CString strText;
                            if (theApp.m_model.getMaster().getContinuousTransferCount() > 0) {
                            if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) {
                                strText.Format(_T("[%d]%s --> %s"),
                                    theApp.m_model.getMaster().getContinuousTransferCount(),
                                    pEq1->getName().c_str(), pEq2->getName().c_str());
SourceCode/Bond/x64/Debug/CollectionEventList.txt
@@ -40,4 +40,12 @@
50000,CarrierID_Readed,,(50000)
50001,PJ_Queued,,(50001)
50002,PJ_Start,,(50002)
50002,PJ_End,,(50003)
50003,PJ_End,,(50003)
50004,Panel_Start,,(50004)
50005,Panel_End,,(50005)
50006,CJ_Start,,(50006)
50007,CJ_End,,(50007)
50008,Port_Unload_Ready,,(50008)
50009,Port_Load_Ready,,(50009)
50010,Port_Blocked,,(50010)
SourceCode/Bond/x64/Debug/ReportList.txt
@@ -18,4 +18,13 @@
50000,(5000)
50001,(5003)
50002,(5004)
50003,(5005)
50004,(5006)
50005,(5007)
50006,(5008)
50007,(5009)
50008,(5010)
50009,(5011)
50010,(5012)
SourceCode/Bond/x64/Debug/VariableList.txt
@@ -8,34 +8,42 @@
701,PreviousProcessState,U1,
800,EFEMPPExecName,A20,
801,EQPPExecName,A20,
2000,RbRAxisTorque,I2,机器人R轴扭矩
2001,RbLAxisTorque,l2,机器人L轴扭矩
2002,RbZAxisTorque,l2,机器人Z轴扭矩
2003,RbTHAxisTorque,l2,机器人TH轴扭矩
2004,RbXAxisTorque,l2,机器人X轴扭矩
2005,AxisX111,l2,X111相机前移栽电机扭矩
2006,AxisX112,l2,X112相机后移栽电机扭矩
2007,AxisU113,l2,U113产品旋转电机扭矩
2008,AxisX114,l2,X114产品左整列电机扭矩
2009,AxisY121,l2,Y121产品右整列电机扭矩
2010,AxisY122,l2,Y122产品前整列电机扭矩
2011,AxisY123,l2,Y123产品后阵列电机扭矩
2012,MainAir,U2,总进气压力值
2013,MainVacuum,l2,总真空压力值
2014,RbMainVacuum,l2,机器人真空值
2015,LPMainVacuum,l2,LP真空值#D265
2016,LPMainAir,U2,LP压空值
2017,ALVacuum,l2,Aligner真空值
2018,FFU1RPM,U2,FFU1转速
2019,FFU2RPM,U2,FFU2转速
2020,FFU3RPM,U2,FFU3转速
2021,FFU4RPM,U2,FFU4转速
2022,ESDValue,I2,静电检测值
2023,OCREnable,U2,"OCR使能:O:开启 1:屏蔽"
2024,CCDEnable,U2,"CCD使能:O:开启 1:屏蔽"
2025,FFUParameter,U2,FFU设定值
5000,CarrierID,A20,卡匣ID
2000,RbRAxisTorque,I2,机器人R轴扭矩
2001,RbLAxisTorque,l2,机器人L轴扭矩
2002,RbZAxisTorque,l2,机器人Z轴扭矩
2003,RbTHAxisTorque,l2,机器人TH轴扭矩
2004,RbXAxisTorque,l2,机器人X轴扭矩
2005,AxisX111,l2,X111相机前移栽电机扭矩
2006,AxisX112,l2,X112相机后移栽电机扭矩
2007,AxisU113,l2,U113产品旋转电机扭矩
2008,AxisX114,l2,X114产品左整列电机扭矩
2009,AxisY121,l2,Y121产品右整列电机扭矩
2010,AxisY122,l2,Y122产品前整列电机扭矩
2011,AxisY123,l2,Y123产品后阵列电机扭矩
2012,MainAir,U2,总进气压力值
2013,MainVacuum,l2,总真空压力值
2014,RbMainVacuum,l2,机器人真空值
2015,LPMainVacuum,l2,LP真空值#D265
2016,LPMainAir,U2,LP压空值
2017,ALVacuum,l2,Aligner真空值
2018,FFU1RPM,U2,FFU1转速
2019,FFU2RPM,U2,FFU2转速
2020,FFU3RPM,U2,FFU3转速
2021,FFU4RPM,U2,FFU4转速
2022,ESDValue,I2,静电检测值
2023,OCREnable,U2,"OCR使能:O:开启 1:屏蔽"
2024,CCDEnable,U2,"CCD使能:O:开启 1:屏蔽"
2025,FFUParameter,U2,FFU设定值
5000,CarrierID,A20,卡匣ID
5001,CJobSpace,U1,CJ Space
5002,PJobSpace,U1,PJ Space
5003,PJQueued,L,PJ Queued
5004,PJStartID,A20,PJStartID
5004,PJStartID,A20,PJStartID
5005,PJEndID,A20,PJEndID
5006,PanelStartID,A20,PanelStartID
5007,PanelEndID,A20,PanelEndID
5008,CJStartID,A20,CJStartID
5009,CJEndID,A20,CJEndID
5010,UnloadReadyPortId,U2,"Port ID"
5011,LoadReadyPortId,U2,"Port ID"
5012,BlockedPortId,U2,"Port ID"