| | |
| | | } |
| | | } |
| | | |
| | | // 使用CEqReadStep替换CEqJobEventStep |
| | | { |
| | | // 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"); |
| | |
| | | } |
| | | 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 |
| | |
| | | |
| | | 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; |
| | | } |
| | |
| | | int CEquipment::onReceivedJob(int port, CJobDataS* pJobDataS) |
| | | { |
| | | LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str()); |
| | | |
| | | addJobDataS(pJobDataS); |
| | | return 0; |
| | | } |
| | | |
| | |
| | | pStep->addAttributeVector(attrubutes); |
| | | |
| | | |
| | | onReceivedJob(port, &jobDataS); |
| | | onSentOutJob(port, &jobDataS); |
| | | |
| | | return nRet; |
| | | } |
| | |
| | | { |
| | | 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; |
| | | } |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | short putSlot = 0; |
| | | BOOL bCheck = onPreStoredJob(port, pJobDataB, putSlot); |
| | | if (bCheck) { |
| | | addJobDataB(pJobDataB); |
| | | return storedJob(pJobDataB, putSlot); |
| | | } |
| | | |
| | |
| | | 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) |
| | |
| | | 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); |
| | | |
| | |
| | | |
| | | private: |
| | | CEquipment* m_pArm; |
| | | std::list<CJobDataS> m_listJobDataS; |
| | | std::list<CJobDataB> m_listJobDataB; |
| | | }; |
| | | } |
| | | |
| | |
| | | m_jobDataS.copy(pJobDataS); |
| | | } |
| | | |
| | | void CGlass::updateJobDataS(CJobDataS* pJobDataS) |
| | | { |
| | | m_jobDataS.update(pJobDataS); |
| | | } |
| | | |
| | | CJobDataS* CGlass::getJobDataS() |
| | | { |
| | | return &m_jobDataS; |
| | |
| | | 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); |
| | |
| | | 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; |
| | |
| | | void* getOwner(); |
| | | void setOwner(void* pOwner); |
| | | void copy(CJobDataS* pScr); |
| | | void update(CJobDataS* pScr); |
| | | int getCassetteSequenceNo(); |
| | | void setCassetteSequenceNo(int no); |
| | | int getJobSequenceNo(); |