| Document/BONDER流程信息表.xls | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.6(5).xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CEquipment.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CEquipment.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CLoadPort.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMaster.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMaster.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CPageGraph2.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CRobotTask.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CRobotTask.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CSlot.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoCommo.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Document/BONDERÁ÷³ÌÐÅÏ¢±í.xlsBinary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.6(5).xlsxBinary files differ
SourceCode/Bond/Servo/CEquipment.cpp
@@ -27,7 +27,7 @@ CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255) { m_listener = { nullptr, nullptr, nullptr, nullptr, nullptr }; m_listener = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; m_alive = { FALSE, 0, FALSE }; m_bCimState = FALSE; m_bUpstreamInline = FALSE; @@ -76,6 +76,7 @@ m_listener.onAlarm = listener.onAlarm; m_listener.onDataChanged = listener.onDataChanged; m_listener.onVcrEventReport = listener.onVcrEventReport; m_listener.onPreFethedOutJob = listener.onPreFethedOutJob; } void CEquipment::setCcLink(CCCLinkIEControl* pCcLink) @@ -754,7 +755,7 @@ Unlock(); if (m_listener.onDataChanged != nullptr) { m_listener.onDataChanged(this, 0); m_listener.onDataChanged(this, EDCC_FETCHOUT_JOB); } return 0; @@ -794,7 +795,7 @@ if (m_listener.onDataChanged != nullptr) { m_listener.onDataChanged(this, 0); m_listener.onDataChanged(this, EDCC_STORED_JOB); } */ return 0; @@ -1233,10 +1234,14 @@ return index; } int CEquipment::onPreFetchedOutJob(int port, CJobDataB* pJobDataB) BOOL CEquipment::onPreFetchedOutJob(int port, CJobDataB* pJobDataB) { LOGI("<CEquipment-%s>onPreFetchedOutJob:port:%d|GlassId:%s", m_strName.c_str(), port, pJobDataB->getGlassId().c_str()); if (m_listener.onPreFethedOutJob != nullptr) { return m_listener.onPreFethedOutJob(this, pJobDataB); } return TRUE; } SourceCode/Bond/Servo/CEquipment.h
@@ -44,6 +44,7 @@ typedef std::function<void(void* pEiuipment, int code)> ONDATACHANGED; typedef std::function<void(void* pEiuipment, int state, int alarmId, int unitId, int level)> ONALARM; typedef std::function<void(void* pEiuipment, void* pReport)> ONVCREVENTREPORT; typedef std::function<BOOL(void* pEiuipment, CJobDataB* pJobDataB)> ONPREFETCHEDOUTJOB; typedef struct _EquipmentListener { ONALIVE onAlive; @@ -51,6 +52,7 @@ ONALARM onAlarm; ONDATACHANGED onDataChanged; ONVCREVENTREPORT onVcrEventReport; ONPREFETCHEDOUTJOB onPreFethedOutJob; } EquipmentListener; SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1060,6 +1060,11 @@ */ int CLoadPort::testGenerateGlassList(MaterialsType type, const char* pszPrefix, int startSuffix) { static unsigned short nJobSequenceNo = 0; static unsigned short nCassetteSequenceNo = 0; nCassetteSequenceNo++; // 妿é空就ä¸çæäº Lock(); if (hasGlass()) { @@ -1079,7 +1084,11 @@ sprintf_s(szBuffer, "%s%d", pszPrefix, suffix++); jb.setGlassId(szBuffer); jb.setCassetteSequenceNo(nCassetteSequenceNo); jb.setJobSequenceNo(++nJobSequenceNo); js.setMaterialsType((int)type); js.setCassetteSequenceNo(nCassetteSequenceNo); js.setJobSequenceNo(nJobSequenceNo); if (type == MaterialsType::G1) { js.setGlass1Id(szBuffer); } SourceCode/Bond/Servo/CMaster.cpp
@@ -228,6 +228,12 @@ } saveCache(); lock(); if (m_pActiveRobotTask != nullptr) { delete m_pActiveRobotTask; m_pActiveRobotTask = nullptr; } unlock(); for (auto item : m_listEquipment) { delete item; @@ -310,13 +316,60 @@ else if (m_state == MASTERSTATE::RUNNING) { unlock(); LOGI("è°åº¦å¤çä¸..."); Sleep(1000); lock(); if (m_pActiveRobotTask != nullptr) { unlock(); // æ£æµå°å½åææ£å¨ä¸åçä»»å¡ï¼ç¡®ä¿å½åä»»å¡å®ææä¸æ¢åç»§ç» LOGI("æ£æµå°å½åææ£å¨ä¸åçä»»å¡ï¼ç¡®ä¿å½åä»»å¡å®ææä¸æ¢åç»§ç»..."); continue; } // LoadPort -> Fliper(G2) CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1); CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2); CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER); CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE); ASSERT(pLoadPort1); ASSERT(pLoadPort2); ASSERT(pFliper); ASSERT(pVacuumBack); m_pActiveRobotTask = createTransferTask(pLoadPort1, pFliper); if (m_pActiveRobotTask != nullptr) { std::string strDescription = m_pActiveRobotTask->getDescription(); unlock(); LOGI("å建æ°ä»»å¡<%s>...", strDescription.c_str()); continue; } m_pActiveRobotTask = createTransferTask(pLoadPort2, pFliper); if (m_pActiveRobotTask != nullptr) { std::string strDescription = m_pActiveRobotTask->getDescription(); unlock(); LOGI("å建æ°ä»»å¡<%s>...", strDescription.c_str()); continue; } // LoadPort -> VacuumBake(G1) m_pActiveRobotTask = createTransferTask(pLoadPort1, pVacuumBack); if (m_pActiveRobotTask != nullptr) { std::string strDescription = m_pActiveRobotTask->getDescription(); unlock(); LOGI("å建æ°ä»»å¡1<%s>...", strDescription.c_str()); continue; } m_pActiveRobotTask = createTransferTask(pLoadPort2, pVacuumBack); if (m_pActiveRobotTask != nullptr) { std::string strDescription = m_pActiveRobotTask->getDescription(); unlock(); LOGI("å建æ°ä»»å¡2<%s>...", strDescription.c_str()); continue; } // Fliper(G2) -> Aligner @@ -338,7 +391,7 @@ unlock(); } unlock(); @@ -412,11 +465,57 @@ m_listener.onEqVcrEventReport(this, p, p2); } }; listener.onPreFethedOutJob = [&](void* pEquipment, CJobDataB* pJobDataB) -> BOOL { CEquipment* p = (CEquipment*)pEquipment; // åæ¾çï¼æ´æ°å½åæ¬éä»»å¡ BOOL bOk = FALSE; lock(); if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) { CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getSrcSlot()); if (pGlass != nullptr) { CJobDataB* pJobDataBSrc = pGlass->getJobDataB(); if (pJobDataBSrc != nullptr && pJobDataBSrc->getCassetteSequenceNo() == pJobDataB->getCassetteSequenceNo() && pJobDataBSrc->getJobSequenceNo() == pJobDataB->getJobSequenceNo()) { bOk = TRUE; LOGI("<CMaster>onPreFethedOutJob, å·²æ ¡éªæ°æ®ä¸è´æ§."); } } } unlock(); if (!bOk) { LOGE("<CMaster>onPreFethedOutJob, æ°æ®æ ¡éªå¤±è´¥."); } return bOk; }; listener.onDataChanged = [&](void* pEquipment, int code) -> void { m_bDataModify = TRUE; CEquipment* p = (CEquipment*)pEquipment; if (m_listener.onEqDataChanged != nullptr) { m_listener.onEqDataChanged(this, p, 0); } // åæ¾çï¼æ´æ°å½åæ¬éä»»å¡ if (code == EDCC_FETCHOUT_JOB) { lock(); if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) { m_pActiveRobotTask->fetchOut(); LOGI("å¼å§åç..."); } unlock(); } else if (code == EDCC_STORED_JOB) { lock(); if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getTarPosition() == p->getID()) { m_pActiveRobotTask->stored(); LOGI("æ¾ç宿..."); } unlock(); } }; @@ -828,4 +927,28 @@ m_listener.onMasterStateChanged(this, m_state); } } static int taskSeqNo = 0; CRobotTask* CMaster::createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq) { CRobotTask* pTask = nullptr; CSlot* pSrcSlot, * pTarSlot; pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G1); pSrcSlot = pSrcEq->getNonEmptySlot(MaterialsType::G1); if (pSrcSlot == nullptr || nullptr == pTarSlot) { pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G2); pSrcSlot = pSrcEq->getNonEmptySlot(MaterialsType::G2); } 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; } } SourceCode/Bond/Servo/CMaster.h
@@ -82,6 +82,7 @@ int readCache(); void serialize(CArchive& ar); void setState(MASTERSTATE state); CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq); private: CRITICAL_SECTION m_criticalSection; SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -204,26 +204,31 @@ // æµè¯ else if (nCmd == ID_EQSGRAPHITEM_TEST1) { BOOL bTestGenerate = FALSE; SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData; if (pEquipment->getID() == EQ_ID_LOADPORT1) { if (pEquipment->getID() == EQ_ID_LOADPORT1 && !pEquipment->hasGlass()) { ((SERVO::CLoadPort*)pEquipment)->testGenerateGlassList(SERVO::MaterialsType::G1, "P20250320G1X", 1); bTestGenerate = TRUE; } else if (pEquipment->getID() == EQ_ID_LOADPORT2) { else if (pEquipment->getID() == EQ_ID_LOADPORT2 && !pEquipment->hasGlass()) { ((SERVO::CLoadPort*)pEquipment)->testGenerateGlassList(SERVO::MaterialsType::G2, "P20250320G2X", 1); bTestGenerate = TRUE; } /* SERVO::CGlass* pGlass = pEquipment->getAnyGlass(); if (pGlass != nullptr) { if (!bTestGenerate) { SERVO::CRobotTask* pTask = theApp.m_model.getMaster().getActiveRobotTask(); if (pTask != nullptr) { SERVO::CGlass* pGlass = (SERVO::CGlass*)pTask->getContext(); SERVO::CJobDataB* pJobDataB = pGlass->getJobDataB(); SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS(); if (pJobDataB != nullptr && pJobDataS != nullptr) { pEquipment->fetchedOutJob(pJobDataB); pEquipment->onFetchedOutJob(0, pJobDataB); pEquipment->onSentOutJob(0, pJobDataS); } } */ } } else if (nCmd == ID_EQSGRAPHITEM_TEST2) { SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData; SourceCode/Bond/Servo/CRobotTask.cpp
@@ -7,12 +7,56 @@ CRobotTask::CRobotTask() { generateId(m_strId); m_state = ROBOT_TASK_STATE::Ready; m_timeCreate = CToolUnits::getTimestamp(); m_timeFetchOut = 0; m_timeStored = 0; m_timeFinish = 0; m_pContext = nullptr; } CRobotTask::~CRobotTask() { if (m_pContext != nullptr) { m_pContext->release(); m_pContext = nullptr; } } std::string CRobotTask::getDescription() const { std::string strOut = "CRobotTask<ID:"; strOut = strOut + std::to_string(m_robotCmdParam.sequenceNo); strOut = strOut + ",Arm:"; strOut = strOut + std::to_string(m_robotCmdParam.armNo); strOut = strOut + ",GetPossion:"; strOut = strOut + std::to_string(m_robotCmdParam.getPosition); strOut = strOut + ",GetSlot:"; strOut = strOut + std::to_string(m_robotCmdParam.getSlotNo); strOut = strOut + ",PutPossion:"; strOut = strOut + std::to_string(m_robotCmdParam.putPosition); strOut = strOut + ",PutSlot:"; strOut = strOut + std::to_string(m_robotCmdParam.putSlotNo); strOut = strOut + ">"; return strOut; } void CRobotTask::setContext(CContext* pContext) { if (pContext != nullptr) { pContext->release(); } m_pContext = pContext; if (m_pContext != nullptr) { m_pContext->addRef(); } } CContext* CRobotTask::getContext() { return m_pContext; } std::string& CRobotTask::generateId(std::string& out) @@ -56,8 +100,53 @@ return m_timeCreate; } time_t CRobotTask::getFetchoutTime() { return m_timeFetchOut; } time_t CRobotTask::getStoredTime() { return m_timeStored; } time_t CRobotTask::getFinishTime() { return m_timeFinish; } ROBOT_TASK_STATE CRobotTask::getState() { return m_state; } int CRobotTask::getSrcPosition() { return m_robotCmdParam.getPosition; } int CRobotTask::getTarPosition() { return m_robotCmdParam.putPosition; } int CRobotTask::getSrcSlot() { return m_robotCmdParam.getSlotNo; } int CRobotTask::getTarSlot() { return m_robotCmdParam.putSlotNo; } void CRobotTask::fetchOut() { m_timeFetchOut = CToolUnits::getTimestamp();; } void CRobotTask::stored() { m_timeStored = CToolUnits::getTimestamp();; } } SourceCode/Bond/Servo/CRobotTask.h
@@ -1,5 +1,6 @@ #pragma once #include "ServoCommo.h" #include "Context.h" namespace SERVO { @@ -11,18 +12,38 @@ public: std::string& getId(); std::string getDescription() const; void setContext(CContext* pContext); CContext* getContext(); void setRobotTransferParam(int seq, int armNo, int fromPos, int toPos, int fromSlot, int toSlot); ROBOT_CMD_PARAM& getRobotCmdParam(); time_t getCreateTime(); time_t getFetchoutTime(); time_t getStoredTime(); time_t getFinishTime(); ROBOT_TASK_STATE getState(); int getSrcPosition(); int getSrcSlot(); int getTarPosition(); int getTarSlot(); // 仿ºå°æç void fetchOut(); // å¨ç®çå°æ¾ç void stored(); private: static std::string& generateId(std::string& out); public: private: ROBOT_TASK_STATE m_state; /* ä»»å¡ç¶æ */ std::string m_strId; time_t m_timeCreate; /* å建æ¶é´ */ time_t m_timeFetchOut; /* åçæ¶é´*/ time_t m_timeStored; /* æ¾çæ¶é´ */ time_t m_timeFinish; /* ç»ææ¶é´ */ ROBOT_CMD_PARAM m_robotCmdParam; /* åæ° */ CContext* m_pContext; }; } SourceCode/Bond/Servo/CSlot.cpp
@@ -10,11 +10,15 @@ m_pContext = nullptr; m_bEnable = FALSE; m_bLock = FALSE; m_pContext = nullptr; } CSlot::~CSlot() { if (m_pContext != nullptr) { m_pContext->release(); m_pContext = nullptr; } } BOOL CSlot::isEnable() @@ -92,14 +96,21 @@ return m_pContext == nullptr; } void CSlot::setContext(CContext* pContext) { if (pContext != nullptr) { pContext->release(); } m_pContext = pContext; if (m_pContext != nullptr) { m_pContext->addRef(); } } CContext* CSlot::getContext() { return m_pContext; } void CSlot::setContext(CContext* pContext) { m_pContext = pContext; } void CSlot::serialize(CArchive& ar) SourceCode/Bond/Servo/ServoCommo.h
@@ -112,5 +112,9 @@ Abort, Completed }; /* EQ Data changed code */ #define EDCC_FETCHOUT_JOB 1000 /* ȡƬ */ #define EDCC_STORED_JOB 1001 /* æ¾ç */ }