LAPTOP-SNT8I5JK\Boounion
2025-06-19 be01318968aed5e55c511eedc6c1f72a961c3f13
1.重新梳理JobDataS的传递和更新;
已修改7个文件
292 ■■■■ 文件已修改
SourceCode/Bond/Servo/CEFEM.cpp 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CJobDataS.cpp 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CJobDataS.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp
@@ -531,11 +531,59 @@
            }
        }
        // 使用CEqReadStep替换CEqJobEventStep
        {
            // Received Job Report Upstream#1~9
            // Received Job Report Upstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 8; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x4c90 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
                            int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                            if (port > 0) {
                                decodeReceivedJobReport((CStep*)pFrom, port, pszData, size);
                            }
                        }
                        return -1;
                    });
                sprintf_s(szBuffer, "%s%d", STEP_EQ_RECEIVED_JOB_UPSn, i + 1);
                pStep->setName(szBuffer);
                pStep->setProp("Port", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x0 + i);
                if (addStep(STEP_ID_RECIVE_JOB_UPS1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Sent Out Job Report Downstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 8; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x4000 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
                            int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                            if (port > 0) {
                                decodeSentOutJobReport((CStep*)pFrom, port, pszData, size);
                            }
                        }
                        return -1;
                    });
                sprintf_s(szBuffer, "%s%d", STEP_EQ_SENT_OUT_JOB_DOWNSn, i + 1);
                pStep->setName(szBuffer);
                pStep->setProp("Port", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x00a + i);
                if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 8; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x5c31 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
                            int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
@@ -545,15 +593,40 @@
                        }
                        return -1;
                    });
                sprintf_s(szBuffer, "%s%d", STEP_EQ_RECEIVED_JOBn, i + 1);
                sprintf_s(szBuffer, "%s%d", STEP_EQ_FETCHED_OUT_JOBn, i + 1);
                pStep->setName(szBuffer);
                pStep->setProp("Upstream", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x0 + i);
                if (addStep(STEP_ID_RECIVE_JOB_UPS1 + i, pStep) != 0) {
                pStep->setProp("Port", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x023 + i);
                if (addStep(STEP_ID_FETCHED_OUT_JOB_REPORT1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Stored Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 8; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x5b23 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
                            int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                            if (port > 0) {
                                decodeStoredJobReport((CStep*)pFrom, port, pszData, size);
                            }
                        }
                        return -1;
                    });
                sprintf_s(szBuffer, "%s%d", STEP_EQ_STORED_JOBn, i + 1);
                pStep->setName(szBuffer);
                pStep->setProp("Port", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x014 + i);
                if (addStep(STEP_ID_STORE_JOB_REPORT1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Dispatching Mode Change Command
@@ -712,28 +785,26 @@
    int CEFEM::onReceivedJob(int port, CJobDataS* pJobDataS)
    {
        m_pPort[0]->onReceivedJob(port, pJobDataS);
        m_pPort[1]->onReceivedJob(port, pJobDataS);
        m_pPort[2]->onReceivedJob(port, pJobDataS);
        m_pPort[3]->onReceivedJob(port, pJobDataS);
        m_pArmTray[0]->onReceivedJob(port, pJobDataS);
        m_pArmTray[1]->onReceivedJob(port, pJobDataS);
        m_pAligner->onReceivedJob(port, pJobDataS);
        m_pFliper->onReceivedJob(port, pJobDataS);
        // 转发到子单元设备
        CEquipment* pEqs[] = { m_pPort[0], m_pPort[1], m_pPort[2], m_pPort[3], m_pArmTray[0], m_pArmTray[1],
            m_pAligner, m_pFliper };
        if (1 <= port && port <= 8) {
            pEqs[port - 1]->onReceivedJob(port, pJobDataS);
        }
        return 0;
    }
    int CEFEM::onSentOutJob(int port, CJobDataS* pJobDataS)
    {
        m_pPort[0]->onSentOutJob(port, pJobDataS);
        m_pPort[1]->onSentOutJob(port, pJobDataS);
        m_pPort[2]->onSentOutJob(port, pJobDataS);
        m_pPort[3]->onSentOutJob(port, pJobDataS);
        m_pArmTray[0]->onSentOutJob(port, pJobDataS);
        m_pArmTray[1]->onSentOutJob(port, pJobDataS);
        m_pAligner->onSentOutJob(port, pJobDataS);
        m_pFliper->onSentOutJob(port, pJobDataS);
        // 转发到子单元设备
        CEquipment* pEqs[] = { m_pPort[0], m_pPort[1], m_pPort[2], m_pPort[3], m_pArmTray[0], m_pArmTray[1],
            m_pAligner, m_pFliper };
        if (1 <= port && port <= 8) {
            pEqs[port - 1]->onSentOutJob(port, pJobDataS);
        }
        return 0;
    }
SourceCode/Bond/Servo/CEquipment.cpp
@@ -1322,8 +1322,6 @@
    int CEquipment::onReceivedJob(int port, CJobDataS* pJobDataS)
    {
        LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str());
        addJobDataS(pJobDataS);
        return 0;
    }
@@ -1340,7 +1338,7 @@
        pStep->addAttributeVector(attrubutes);
        onReceivedJob(port, &jobDataS);
        onSentOutJob(port, &jobDataS);
        return nRet;
    }
@@ -1349,13 +1347,16 @@
    {
        LOGI("<CEquipment-%s>onSentOutJob.", m_strName.c_str());
        int count = removeJobDataS(pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
        if (count == 1) {
            LOGI("<CEquipment-%s>onSentOutJob,删除数据 %d 条", m_strName.c_str(), count);
        // 可以在此更新JobDataS数据了
        CGlass* pGlass = getGlass(pJobDataS->getGlass1Id().c_str());
        if (pGlass == nullptr) {
            LOGE("<CEquipment-%s>onSentOutJob,没有找到对应的Glass(CassetteSequenceNo:%d, JobSequenceNo:%d, ID=%s),请检查数据,注意风险。",
                m_strName.c_str(), pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo(),
                pJobDataS->getGlass1Id().c_str());
            return -1;
        }
        else {
            LOGE("<CEquipment-%s>onSentOutJob,删除数据 %d 条,注意排查风险", m_strName.c_str(), count);
        }
        pGlass->updateJobDataS(pJobDataS);
        return 0;
    }
@@ -1577,10 +1578,20 @@
        LOGI("<CEquipment-%s>onPreStoredJob:port:%d|GlassId:%s",
            m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
        CJobDataS* pJobDataS = getJobDataS(pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
        if (pJobDataS == nullptr) {
            LOGE("<CFliper-%s>onPreFetchedOutJob,找不到对应的JobDataS(CassetteSequenceNo:%d, JobSequenceNo:%d), 注意排查风险!", m_strName.c_str(),
        // 当前要存片,之前肯定有拔片,因此片子在Arm那里
        CGlass* pGlass = ((CArm*)m_pArm)->getGlassFromSlot(1);
        if (pGlass == nullptr) {
            LOGE("<CFliper-%s>onPreStoredJob,缓存中没有找到对应的Glass(CassetteSequenceNo:%d, JobSequenceNo:%d),请检查数据,注意风险。", m_strName.c_str(),
                pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
            return FALSE;
        }
        CJobDataS* pJobDataS = pGlass->getJobDataS();
        ASSERT(pJobDataS);
        if (!compareJobData(pJobDataB, pJobDataS)) {
            LOGE("<CFliper-%s>onPreFetchedOutJob,JobData数据不匹配(JobDataB(%d, %d),JobDataS(%d, %d)), 注意排查风险!", m_strName.c_str(),
                pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo(),
                pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
            return FALSE;
        }
@@ -1616,7 +1627,6 @@
        short putSlot = 0;
        BOOL bCheck = onPreStoredJob(port, pJobDataB, putSlot);
        if (bCheck) {
            addJobDataB(pJobDataB);
            return storedJob(pJobDataB, putSlot);
        }
@@ -1656,96 +1666,6 @@
    int CEquipment::getIndexerOperationModeBaseValue()
    {
        return 0;
    }
    int CEquipment::addJobDataB(CJobDataB* pJobDataB)
    {
        // 添加之前先删除旧的,以免数据重复
        Lock();
        int count = removeJobDataB(pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
        if (count > 0) {
            LOGE("<CEquipment-%s>addJobDataB,删除重复数据 %d 条,注意排查风险", m_strName.c_str(), count);
        }
        m_listJobDataB.push_back(std::move(*pJobDataB));
        Unlock();
        return (int)m_listJobDataB.size();
    }
    int CEquipment::removeJobDataB(int nCassetteSequenceNo, int nJobSequenceNo)
    {
        int count = 0;
        for (auto it = m_listJobDataB.begin(); it != m_listJobDataB.end(); ) {
            if ((*it).getCassetteSequenceNo() == nCassetteSequenceNo
                && (*it).getJobSequenceNo() == nJobSequenceNo) {
                it = m_listJobDataB.erase(it);
                count++;
            }
            else {
                ++it;
            }
        }
        return count;
    }
    CJobDataB* CEquipment::getJobDataB(int nCassetteSequenceNo, int nJobSequenceNo)
    {
        for (auto& item : m_listJobDataB) {
            if (item.getCassetteSequenceNo() == nCassetteSequenceNo
                && item.getJobSequenceNo() == nJobSequenceNo) {
                return &item;
            }
        }
        return nullptr;
    }
    int CEquipment::addJobDataS(CJobDataS* pJobDataS)
    {
        // 添加之前先删除旧的,以免数据重复
        Lock();
        int count = removeJobDataS(pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
        if (count > 0) {
            LOGE("<CEquipment-%s>addJobDataS,删除重复数据 %d 条,注意排查风险", m_strName.c_str(), count);
        }
        m_listJobDataS.push_back(std::move(*pJobDataS));
        Unlock();
        return (int)m_listJobDataB.size();
    }
    int CEquipment::removeJobDataS(int nCassetteSequenceNo, int nJobSequenceNo)
    {
        int count = 0;
        Lock();
        for (auto it = m_listJobDataS.begin(); it != m_listJobDataS.end(); ) {
            if ((*it).getCassetteSequenceNo() == nCassetteSequenceNo
                && (*it).getJobSequenceNo() == nJobSequenceNo) {
                it = m_listJobDataS.erase(it);
                count++;
            }
            else {
                ++it;
            }
        }
        Unlock();
        return count;
    }
    CJobDataS* CEquipment::getJobDataS(int nCassetteSequenceNo, int nJobSequenceNo)
    {
        for (auto& item : m_listJobDataS) {
            if (item.getCassetteSequenceNo() == nCassetteSequenceNo
                && item.getJobSequenceNo() == nJobSequenceNo) {
                return &item;
            }
        }
        return nullptr;
    }
    BOOL CEquipment::compareJobData(CJobDataB* pJobDataB, CJobDataS* pJobDataS)
SourceCode/Bond/Servo/CEquipment.h
@@ -224,12 +224,6 @@
        int decodePanelDataReport(CStep* pStep, const char* pszData, size_t size);
        int decodeFacDataReport(CStep* pStep, const char* pszData, size_t size);
        int decodePanelDataRequest(CStep* pStep, const char* pszData, size_t size);
        int addJobDataB(CJobDataB* pJobDataB);
        int removeJobDataB(int nCassetteSequenceNo, int nJobSequenceNo);
        CJobDataB* getJobDataB(int nCassetteSequenceNo, int nJobSequenceNo);
        int addJobDataS(CJobDataS* pJobDataS);
        int removeJobDataS(int nCassetteSequenceNo, int nJobSequenceNo);
        CJobDataS* getJobDataS(int nCassetteSequenceNo, int nJobSequenceNo);
        BOOL compareJobData(CJobDataB* pJobDataB, CJobDataS* pJobDataS);
        void setProcessState(PROCESS_STATE state);
@@ -267,8 +261,6 @@
    private:
        CEquipment* m_pArm;
        std::list<CJobDataS> m_listJobDataS;
        std::list<CJobDataB> m_listJobDataB;
    };
}
SourceCode/Bond/Servo/CGlass.cpp
@@ -142,6 +142,11 @@
        m_jobDataS.copy(pJobDataS);
    }
    void CGlass::updateJobDataS(CJobDataS* pJobDataS)
    {
        m_jobDataS.update(pJobDataS);
    }
    CJobDataS* CGlass::getJobDataS()
    {
        return &m_jobDataS;
SourceCode/Bond/Servo/CGlass.h
@@ -29,6 +29,7 @@
        void addPath(unsigned int nEqId, unsigned int nUnit);
        void serialize(CArchive& ar);
        void setJobDataS(CJobDataS* pJobDataS);
        void updateJobDataS(CJobDataS* pJobDataS);
        CJobDataS* getJobDataS();
        BOOL setBuddy(CGlass* pGlass);
        BOOL forceSetBuddy(CGlass* pGlass);
SourceCode/Bond/Servo/CJobDataS.cpp
@@ -88,6 +88,42 @@
        m_pOwner = pScr->m_pOwner;
    }
    void CJobDataS::update(CJobDataS* pScr)
    {
        // m_nCassetteSequenceNo = pScr->m_nCassetteSequenceNo;
        // m_nJobSequenceNo = pScr->m_nJobSequenceNo;
        m_strLotId = pScr->m_strLotId;
        m_strProductId = pScr->m_strProductId;
        m_strOperationId = pScr->m_strOperationId;
        // m_strGlass1Id = pScr->m_strGlass1Id;
        m_strGlass2Id = pScr->m_strGlass2Id;
        m_nJobType = pScr->m_nJobType;
        m_nMaterialsType = pScr->m_nMaterialsType;
        m_nProductType = pScr->m_nProductType;
        m_nDummyType = pScr->m_nDummyType;
        m_nSkipFlag = pScr->m_nSkipFlag;
        m_nProcessFlag = pScr->m_nProcessFlag;
        m_nProcessResonCode = pScr->m_nProcessResonCode;
        m_nLastGlassFlag = pScr->m_nLastGlassFlag;
        m_nFirstGlassFlag = pScr->m_nFirstGlassFlag;
        m_nQTime[0] = pScr->m_nQTime[0];
        m_nQTime[1] = pScr->m_nQTime[1];
        m_nQTime[2] = pScr->m_nQTime[2];
        m_nQTimeOverFlag = pScr->m_nQTimeOverFlag;
        m_nMasterRecipe = pScr->m_nMasterRecipe;
        m_strProductRecipeId = pScr->m_strProductRecipeId;
        m_strPCode = pScr->m_strPCode;
        m_strUseType = pScr->m_strUseType;
        m_strPanelMeasure = pScr->m_strPanelMeasure;
        m_nMode = pScr->m_nMode;
        m_nSlotUnitSelectFlag = pScr->m_nSlotUnitSelectFlag;
        m_nSourcePortNo = pScr->m_nSourcePortNo;
        m_nSourceSlotNo = pScr->m_nSourceSlotNo;
        m_nTargetPortNo = pScr->m_nTargetPortNo;
        m_nTargetSlotNo = pScr->m_nTargetSlotNo;
        m_pOwner = pScr->m_pOwner;
    }
    void* CJobDataS::getOwner()
    {
        return m_pOwner;
SourceCode/Bond/Servo/CJobDataS.h
@@ -15,6 +15,7 @@
        void* getOwner();
        void setOwner(void* pOwner);
        void copy(CJobDataS* pScr);
        void update(CJobDataS* pScr);
        int getCassetteSequenceNo();
        void setCassetteSequenceNo(int no);
        int getJobSequenceNo();