| | |
| | | Document/å
±äº«æä»¶å¤¹.rar |
| | | SourceCode/Bond/x64/Debug/Master.dat |
| | | SourceCode/Bond/x64/Debug/Config/signals.csv |
| | | SourceCode/Bond/x64/Debug/Config/robot_offset.ini |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | æ¶é´,CEID,äºä»¶åç§°,Port,Glass ID,éå ä¿¡æ¯ |
| | | 14:12:24.903,3000,Lot 䏿¥,3,C12M0001A,馿¬¡è¿ç |
| | | 14:12:47.008,3030,Slot Map,3,C12M0001A,Slot ç¶æ U1x8 |
| | | 14:12:47.849,S3F17,ProceedWithCarrier,3,C12M0001A,åå¤è½½å
·ä¿¡æ¯ |
| | | 14:12:47.865,4022,VIDéè¯¯ä¸æ¥,-,C12M0001A.1,ERR[UndefinedVID] |
| | | 14:13:06.204,S16F15,ProcessProgramä¸è½½,-,C12M0001A,ä¸è½½ PJ_C12M0001A_012F |
| | | 14:13:07.782,S14F9,ControlJobå®ä¹,-,C12M0001A,CJ_C12M0001A_012E |
| | | 14:13:08.204,3040,Job Start,3,C12M0001A,- |
| | | 14:13:08.282,4011,å¼å¸¸ä¸æ¥,-,C12M0001A.1,ERR[UndefinedVID] |
| | | 14:13:08.454,10005,æ¥è¦,-,A1F8A00412.1,EFEM + UndefinedVID |
| | | 14:54:14.072,3041,Job Finish,3,C12M0001A,å 工宿鶿®µ |
| | | 14:54:14.072,4012,æ¥è¦/é误,-,C12M0001A.4,ERR[UndefinedVID] |
| | | 14:54:14.072,2004,Program宿,-,PJ_C12M0001A_012F,Step=4 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | æ¶é´,CEID,äºä»¶,Port,Lot/Glass ID,夿³¨ |
| | | 13:50:52.461,3000,Lot 䏿¥,3,C12M0001A,åå§è¿ç |
| | | 14:12:24.903,3000,Lot 䏿¥,3,C12M0001A,忬¡ä¸æ¥ |
| | | 14:12:46.992,3140,Port Mapping,3,LP3,Port3 æ å° LP3 |
| | | 14:12:46.992,3102,Load Request,3,-,å è½½è¯·æ± |
| | | 14:12:46.992,3150,Unload Request,3,-,å¸è½½è¯·æ± |
| | | 14:13:08.266,3040,Job Start,3,C12M0001A,å·¥èºå¼å§ |
| | | 14:54:14.072,3041,Job Finish,3,C12M0001A,å·¥èºå®æ |
| | | 14:54:14.072,4012,æ¥è¦ä¸æ¥,-,C12M0001A,æ¥è¦ |
| | | 14:54:14.072,2004,ç¨åºå®æ,-,PJ_C12M0001A_012F,Step=4 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | CEID,äºä»¶åç§°,æ°æ®ç»æè¯´æ |
| | | 3000,Lot 䏿¥,"1:æ¶é´æ³, 4:Portå·, 5:Lot ID" |
| | | 3401,Job å¼å§,"1:æ¶é´æ³, 4:Portå·, 15:Step" |
| | | 3402,Job 宿鶿®µ1,"1:æ¶é´æ³, 4:Portå·, 15:Step" |
| | | 3403,Job 宿鶿®µ2,"1:æ¶é´æ³, 4:Portå·, 15:Step" |
| | | 3404,Job 宿鶿®µ3,"1:æ¶é´æ³, 4:Portå·, 15:Step, 5:Lot ID" |
| | | 3030,Slot Map,6:<U1æ°ç»> 表示å ä½ç¶æ |
| | | 3140,Port Mapping,"50005:<A""LPx"">" |
| | | 3102,Load 请æ±,æ å
容 |
| | | 3150,Unload 请æ±,æ å
容 |
| | | 3151,Unload 宿,æ å
容 |
| | | 3517,Carrier ç§»å¨ä¸(1),50004:<U1> |
| | | 3518,Carrier ç§»å¨ä¸(2),50004:<U1> |
| | | 3519,Carrier ç§»å¨å®æ,æ å
容 |
| | | 3522,Process Done?,æ å
容 |
| | | 4022/4023,æ¥è¦/å¼å¸¸,"11:模å, 12:é误代ç " |
| | | 10004,æ¥è¦ä¸æ¥,"11:é误ID, 18:模åæä»£ç " |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | æ¥éª¤ç¼å·,äºä»¶åç§°,åè®®æ¶æ¯,è¡¥å
说æ,æ¯å¦è®¾å¤ä¾§ï¼Y/Nï¼ |
| | | 1,Material Arrived (TransferBlock),E87_06,ç©æå°è¾¾ Port,Y |
| | | 2,CarrierID Readed,E87_03,CarrierID 读åï¼æ ¼å¼ä¸é¿åº¦éå¶,Y |
| | | 3,Query CJ Space,S1F3/S1F4,Host æ¥è¯¢æ¯å¦æç©ºé² CJ,N |
| | | 4,Query PJ Space,S16F21/S16F22,Host æ¥è¯¢æ¯å¦æç©ºé² PJ,N |
| | | 5,Query PPID List,S7F19/S7F20,æ£æ¥æ¯å¦æ PPID 设置ãè·¯å¾ãæ ¼å¼éå¶,N |
| | | 6,ProceedWithCarrier,S3F17,å
许æ¬å
¥ Carrier,N |
| | | 7,Check SlotMap,E87_14,æ£æ¥ Slot å ä½ç¶æ,Y |
| | | 8,ProceedWithSlotMap,S3F17,ä¼ å
¥ SlotMapãLotIDãPanelID,N |
| | | 9,SlotMap Verify OK,E87_15,SlotMap éªè¯éè¿,Y |
| | | 10,Create PJ,S16F15,å建 Process Jobï¼å¯è½å«èªå®ä¹ PanelID,N |
| | | 11,PJ Queued,E40_01,PJ å·²æé,Y |
| | | 12,Create CJ,S14F9/S14F10,å建 Control Job,N |
| | | 13,CJ Start,E94_07,CJ å¯å¨,Y |
| | | 14,PJ Start,E40_04,PJ å¼å§,Y |
| | | 15,OCR,OCR_PanelID_Read_OK,读åç©æ ID,Y |
| | | 16,Panel Start,E90_11,å¼å§å å·¥ Panel,Y |
| | | 17,Panel End,E90_12,å 工宿ï¼å¼å¸¸éæ¥ WaferEnd,Y |
| | | 18,PJ End,E40_06,PJ å¤çç»æ,Y |
| | | 19,CJ End,E94_10,CJ å®ç»,Y |
| | | 20,Ready to Release,E87_19,å¯éæ¾ Carrier,Y |
| | | 21,Carrier Release,S3F17,Host 䏿å¨ä½,N |
| | | 22,Ready to Unload,E87_09,å¯å¸è½½,Y |
| | | 23,Material Removed,E87_08,ç©æå·²åèµ°,Y |
| | |
| | | m_slot[0].setName("Slot 1"); |
| | | } |
| | | |
| | | void CAligner::initSteps() |
| | | { |
| | | CEquipment::initSteps(); |
| | | |
| | | { |
| | | // Panel Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0x617f, 386 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodePanelDataReport((CStep*)pFrom, pszData, size); |
| | | } |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_PANEL_DATA_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x15e); |
| | | if (addStep(STEP_ID_PANEL_DATA_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | } |
| | | |
| | | void CAligner::onReceiveLBData(const char* pszData, size_t size) |
| | | { |
| | | __super::onReceiveLBData(pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PANEL_DATA_REPORT, pszData, size); |
| | | } |
| | | |
| | | void CAligner::onTimer(UINT nTimerid) |
| | | { |
| | | CEquipment::onTimer(nTimerid); |
| | |
| | | virtual void term(); |
| | | virtual void initPins(); |
| | | virtual void initSlots(); |
| | | virtual void initSteps(); |
| | | virtual void onReceiveLBData(const char* pszData, size_t size); |
| | | virtual void onTimer(UINT nTimerid); |
| | | virtual void serialize(CArchive& ar); |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CArm::glassUpdateJobDataS(CJobDataS* pJobDataS) |
| | | { |
| | | ASSERT(pJobDataS); |
| | | |
| | | Lock(); |
| | | CGlass* pGlass = (CGlass*)m_slot[0].getContext(); |
| | | if (pGlass == nullptr) { |
| | | Unlock(); |
| | | LOGE("<CArm>glassUpdateJobDataSå¤±è´¥ï¼æ¾ä¸å°å¯¹åºçGlass"); |
| | | return -1; |
| | | } |
| | | |
| | | CJobDataS* pSrcJs = pGlass->getJobDataS(); |
| | | if (pSrcJs->getCassetteSequenceNo() != pJobDataS->getCassetteSequenceNo() |
| | | || pSrcJs->getJobSequenceNo() != pJobDataS->getJobSequenceNo()) { |
| | | Unlock(); |
| | | LOGE("<CArm>glassUpdateJobDataS失败ï¼CassetteNoä¸å¹é
([%d,%d] != [%d,%d])", |
| | | pSrcJs->getCassetteSequenceNo(), |
| | | pJobDataS->getCassetteSequenceNo(), |
| | | pSrcJs->getJobSequenceNo(), |
| | | pJobDataS->getJobSequenceNo()); |
| | | return -2; |
| | | } |
| | | |
| | | pGlass->updateJobDataS(pJobDataS); |
| | | Unlock(); |
| | | return 0; |
| | | } |
| | | } |
| | |
| | | |
| | | // è°ç¨tempFetchOutåï¼pGlasså¿
é¡»release䏿¬¡ |
| | | int tempFetchOut(OUT CGlass*& pGlass); |
| | | |
| | | // æ´æ°JobDataS |
| | | // Equipmentå¨onReceivedJobäºä»¶æ¶è°ç¨ |
| | | int glassUpdateJobDataS(CJobDataS* pJobDataS); |
| | | }; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | { |
| | | // Panel Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0xA17f, 386 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodePanelDataReport((CStep*)pFrom, pszData, size); |
| | | } |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_PANEL_DATA_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x45e); |
| | | if (addStep(STEP_ID_PANEL_DATA_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | { |
| | | // FAC Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0xA60E, 108 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | |
| | | pStep->setName(STEP_EQ_VCR1_EVENT_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x4a); |
| | | pStep->setReturnDev(0x91e); |
| | | if (addStep(STEP_ID_VCR1_EVENT_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | |
| | | } |
| | | |
| | | { |
| | | // Panel Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0x617f, 386 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodePanelDataReport((CStep*)pFrom, pszData, size); |
| | | } |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_PANEL_DATA_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x15e); |
| | | if (addStep(STEP_ID_PANEL_DATA_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | { |
| | | // FAC Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0x6301, 108 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | |
| | | m_pPort[i]->onReceiveLBData(pszData, size); |
| | | } |
| | | } |
| | | m_pAligner->onReceiveLBData(pszData, size); |
| | | |
| | | |
| | | // æ´æ°ä¿¡å·å°LoadPort, Robot, Aligner, Fliper |
| | | m_pPort[0]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[0][0]); |
| | |
| | | #include "Servo.h" |
| | | |
| | | |
| | | #define CHECK_READ_STEP_SIGNAL(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CReadStep*)pStep)->onReadSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | #define CHECK_WRITE_STEP_SIGNAL(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CWriteStep*)pStep)->onRecvSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | namespace SERVO { |
| | | |
| | | CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255) |
| | |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_IN_OP_CMD_REPLY, pszData, size); |
| | | |
| | | // Panel Data Report |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_PANEL_DATA_REPORT, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_PANEL_DATA_REPORT, pszData, size); |
| | | |
| | | // Panel Data Request |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_PANEL_DATA_REQUEST, pszData, size); |
| | |
| | | // job process start/end report |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_JOB_PROCESS_START_REPORT, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_JOB_PROCESS_END_REPORT, pszData, size); |
| | | |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_PROT1_CASSETTE_CTR_CMD_REPLY, pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_PROT2_CASSETTE_CTR_CMD_REPLY, pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_PROT3_CASSETTE_CTR_CMD_REPLY, pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_PROT4_CASSETTE_CTR_CMD_REPLY, pszData, size); |
| | | } |
| | | |
| | | BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index) |
| | |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (!isSlotProcessed(i)) continue; |
| | | if (pGlass == nullptr) continue; |
| | | 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] |
| | |
| | | return &m_slot[i]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | CSlot* CEquipment::getInspFailSlot() |
| | | { |
| | | 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; |
| | | 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; |
| | | |
| | | return &m_slot[i]; |
| | | } |
| | | |
| | | return nullptr; |
| | |
| | | { |
| | | LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str()); |
| | | |
| | | // å¯ä»¥å¨æ¤æ´æ°JobDataSæ°æ®äº |
| | | CGlass* pGlass = getGlassFromSlot(port); |
| | | 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; |
| | | } |
| | | pGlass->updateJobDataS(pJobDataS); |
| | | |
| | | return 0; |
| | | // å¯ä»¥å¨æ¤æ´æ°JobDataSæ°æ®äº |
| | | int nRet = ((CArm*)m_pArm)->glassUpdateJobDataS(pJobDataS); |
| | | if (nRet < 0) { |
| | | LOGE("<CEquipment-%s>onReceivedJob,æ´æ°JobDataS失败ï¼glassUpdateJobDataSè¿å%d", |
| | | m_strName.c_str(), nRet); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | int CEquipment::decodeSentOutJobReport(CStep* pStep, int port, const char* pszData, size_t size) |
| | |
| | | index += sizeof(short); |
| | | CToolUnits::convertString(&pszData[index], 128 * 2, strPanelJudgeData); |
| | | index += 128 * 2; |
| | | CToolUnits::convertString(&pszData[index], 256 * 2, strPanelJudgeData); |
| | | CToolUnits::convertString(&pszData[index], 256 * 2, strPanelGradeData); |
| | | index += 256 * 2; |
| | | |
| | | |
| | |
| | | pStep->addAttribute(new CAttribute("PanelGradeData", |
| | | strPanelGradeData.c_str(), "", weight++)); |
| | | |
| | | |
| | | // æ´æ°æ£æµç»æ |
| | | CGlass* pGlass = getGlassWithCassette(cassetteNo, jobSequenceNo); |
| | | if (pGlass == nullptr) { |
| | | LOGE("<CEquipment-%s>æ´æ°Panel Dataå¤±è´¥ï¼æ¾ä¸å°å¯¹åºçGlass.cassetteNo=%d, jobSequenceNo=%d", |
| | | getName().c_str(), cassetteNo, jobSequenceNo); |
| | | return -1; |
| | | } |
| | | pGlass->setInspResult(m_nID, 0, judgeStringToInspResult(strPanelJudgeData)); |
| | | |
| | | return 0; |
| | | } |
| | |
| | | ); |
| | | } |
| | | } |
| | | |
| | | InspResult CEquipment::judgeStringToInspResult(std::string& strJudge) |
| | | { |
| | | if (strJudge.compare("N") == 0) { |
| | | return InspResult::Fail; |
| | | } |
| | | if (strJudge.compare("G") == 0) { |
| | | return InspResult::Pass; |
| | | } |
| | | |
| | | return InspResult::NotInspected; |
| | | } |
| | | } |
| | |
| | | typedef std::function<BOOL(void* pEiuipment, int port, CJobDataB* pJobDataB)> ONPREFETCHEDOUTJOB; |
| | | typedef std::function<BOOL(void* pEiuipment, int port, CJobDataB* pJobDataB, short& putSlot)> ONPRESTOREDJOB; |
| | | typedef std::function<void(void* pEiuipment, PROCESS_STATE state)> ONPROCESSSTATE; |
| | | typedef std::function<void(void* pEiuipment, short scanMap, short downMap)> ONMAPMISMATCH; |
| | | typedef struct _EquipmentListener |
| | | { |
| | | ONALIVE onAlive; |
| | |
| | | ONPREFETCHEDOUTJOB onPreFethedOutJob; |
| | | ONPRESTOREDJOB onPreStoredJob; |
| | | ONPROCESSSTATE onProcessStateChanged; |
| | | ONMAPMISMATCH onMapMismatch; |
| | | } EquipmentListener; |
| | | |
| | | |
| | |
| | | // è·åä¸ä¸ªæå®ç©æç±»å(G1,G2,G1&G2)çä¸å·²ç»å å·¥å¤ççæ§½ä½ |
| | | CSlot* getProcessedSlot(MaterialsType putSlotType); |
| | | CSlot* getProcessedSlot2(MaterialsType putSlotType, const std::vector<int>& candidates); |
| | | CSlot* getInspFailSlot(); |
| | | |
| | | // è·åç»çç©æ |
| | | CGlass* getGlassFromSlot(int slotNo); |
| | |
| | | // æå¨ç§»é¤ç©æ |
| | | int removeGlass(int slotNo); |
| | | |
| | | // åç¬¦ä¸²æ£æµç»æè½¬æ¢ |
| | | InspResult judgeStringToInspResult(std::string& strJudge); |
| | | |
| | | |
| | | |
| | | |
| | | // 以ä¸ä¸ºä»CC-Link读åå°çBitæ å¿ä½æ£æµå½æ° |
| | | public: |
| | | BOOL isAlive(); |
| | |
| | | m_pPath = nullptr; |
| | | m_type = MaterialsType::G1; |
| | | m_pBuddy = nullptr; |
| | | m_nOriginPort = 0; |
| | | m_nOriginSlot = 0; |
| | | } |
| | | |
| | | CGlass::~CGlass() |
| | |
| | | return m_strID; |
| | | } |
| | | |
| | | void CGlass::setOriginPort(int port, int slot) |
| | | { |
| | | m_nOriginPort = port; |
| | | m_nOriginSlot = slot; |
| | | } |
| | | |
| | | void CGlass::getOrginPort(int& port, int& slot) |
| | | { |
| | | port = m_nOriginPort; |
| | | slot = m_nOriginSlot; |
| | | } |
| | | |
| | | CPath* CGlass::getPath() |
| | | { |
| | | return m_pPath; |
| | |
| | | Lock(); |
| | | ar << (int)m_type; |
| | | WriteString(ar, m_strID); |
| | | ar << m_nOriginPort; |
| | | ar << m_nOriginSlot; |
| | | ar << (ULONGLONG)m_pPath; |
| | | if (m_pPath != nullptr) { |
| | | m_pPath->serialize(ar); |
| | |
| | | ar >> type; |
| | | m_type = (MaterialsType)type; |
| | | ReadString(ar, m_strID); |
| | | ar >> m_nOriginPort; |
| | | ar >> m_nOriginSlot; |
| | | ar >> ullPath; |
| | | if (ullPath != 0) { |
| | | m_pPath = new CPath(); |
| | |
| | | return m_strBuddyId; |
| | | } |
| | | |
| | | void CGlass::processEnd(unsigned int nEqId, unsigned int nUnit) |
| | | int CGlass::processEnd(unsigned int nEqId, unsigned int nUnit) |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath != nullptr) { |
| | | pPath->processEnd(); |
| | | } |
| | | if (pPath == nullptr) return -1; |
| | | |
| | | pPath->processEnd(); |
| | | return 0; |
| | | } |
| | | |
| | | BOOL CGlass::isProcessed(unsigned int nEqId, unsigned int nUnit) |
| | |
| | | |
| | | return pPath->isProcessEnd(); |
| | | } |
| | | |
| | | int CGlass::setInspResult(unsigned int nEqId, unsigned int nUnit, InspResult result) |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath == nullptr) return -1; |
| | | |
| | | pPath->setInspResult(result); |
| | | return 0; |
| | | } |
| | | |
| | | InspResult CGlass::getInspResult(unsigned int nEqId, unsigned int nUnit) |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath == nullptr) return InspResult::NotInspected; |
| | | |
| | | return pPath->getInspResult(); |
| | | } |
| | | } |
| | |
| | | void setType(MaterialsType type); |
| | | void setID(const char* pszID); |
| | | std::string& getID(); |
| | | void setOriginPort(int port, int slot); |
| | | void getOrginPort(int& port, int& slot); |
| | | CPath* getPathWithEq(unsigned int nEqId, unsigned int nUnit); |
| | | CPath* getPath(); |
| | | void addPath(unsigned int nEqId, unsigned int nUnit); |
| | |
| | | BOOL forceSetBuddy(CGlass* pGlass); |
| | | CGlass* getBuddy(); |
| | | std::string& getBuddyId(); |
| | | void processEnd(unsigned int nEqId, unsigned int nUnit); |
| | | int processEnd(unsigned int nEqId, unsigned int nUnit); |
| | | BOOL isProcessed(unsigned int nEqId, unsigned int nUnit); |
| | | int setInspResult(unsigned int nEqId, unsigned int nUnit, InspResult result); |
| | | InspResult getInspResult(unsigned int nEqId, unsigned int nUnit); |
| | | |
| | | private: |
| | | MaterialsType m_type; |
| | |
| | | CJobDataS m_jobDataS; |
| | | CGlass* m_pBuddy; |
| | | std::string m_strBuddyId; |
| | | int m_nOriginPort; |
| | | int m_nOriginSlot; |
| | | }; |
| | | } |
| | | |
| | |
| | | #include "CLoadPort.h" |
| | | #include "CGlassPool.h" |
| | | #include "Servo.h" |
| | | #include "ServoCommo.h" |
| | | |
| | | |
| | | #define CHECK_READ_STEP_SIGNAL2(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CReadStep*)pStep)->onReadSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | #define CHECK_WRITE_STEP_SIGNAL2(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CWriteStep*)pStep)->onRecvSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | namespace SERVO { |
| | | CLoadPort::CLoadPort() : CEquipment() |
| | |
| | | |
| | | { |
| | | // Cassette Ctrl Cmd |
| | | static char* pszName[] = { STEP_EQ_P1_CASSETTE_CTRL_CMD, STEP_EQ_P2_CASSETTE_CTRL_CMD, STEP_EQ_P3_CASSETTE_CTRL_CMD, STEP_EQ_P4_CASSETTE_CTRL_CMD }; |
| | | static int writeSignalDev[] = { 0x120, 0x121, 0x122, 0x123 }; |
| | | static char* pszName[] = { STEP_EQ_P1_CASSETTE_CTRL_CMD, STEP_EQ_P2_CASSETTE_CTRL_CMD, STEP_EQ_P3_CASSETTE_CTRL_CMD, STEP_EQ_P4_CASSETTE_CTRL_CMD }; |
| | | static int writeSignalDev[] = { 0x130, 0x131, 0x132, 0x133 }; |
| | | static int dev[] = { 0x45, 0x1a5, 0x305, 0x465 }; |
| | | static int addr[] = { 0x480, 0x481, 0x482, 0x483 }; |
| | | static int addr[] = { STEP_ID_PROT1_CASSETTE_CTR_CMD_REPLY, STEP_ID_PROT2_CASSETTE_CTR_CMD_REPLY, STEP_ID_PROT3_CASSETTE_CTR_CMD_REPLY, STEP_ID_PROT4_CASSETTE_CTR_CMD_REPLY }; |
| | | |
| | | CEqCassetteCtrlCmdStep* pStep = new CEqCassetteCtrlCmdStep(); |
| | | CEqWriteStep* pStep = new CEqWriteStep(); |
| | | pStep->setName(pszName[m_nIndex]); |
| | | pStep->setWriteSignalDev(writeSignalDev[m_nIndex]); |
| | | pStep->setCtrlCmdDev(dev[m_nIndex]); |
| | | pStep->setDataDev(dev[m_nIndex]); |
| | | if (addStep(addr[m_nIndex], pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | |
| | | }; |
| | | static int dev[] = { 0x6050, 0x6070, 0x6090, 0x60b0 }; |
| | | static int writeSignalDev[6][4] = { |
| | | {0xc8, 0xc9, 0xca, 0xcb}, |
| | | {0xd0, 0xd1, 0xd2, 0xd3}, |
| | | {0xd8, 0xd9, 0xda, 0xdb}, |
| | | {0xe0, 0xe1, 0xe2, 0xe3}, |
| | | {0xe8, 0xe9, 0xea, 0xeb}, |
| | | {0xf0, 0xf1, 0xf2, 0xf3}, |
| | | {0xf8, 0xf9, 0xfa, 0xfb}, |
| | | {0x100, 0x101, 0x102, 0x103} |
| | | {0xf0, 0xf1, 0xf2, 0xf3} |
| | | }; |
| | | static int addr[6][4] = { |
| | | { STEP_ID_PORT1_EMPTY, STEP_ID_PORT2_EMPTY, STEP_ID_PORT3_EMPTY, STEP_ID_PORT4_EMPTY }, |
| | |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodePortStatusReport((CStep*)pFrom, pszData, size); |
| | | return 0; |
| | | } |
| | | return -1; |
| | | }); |
| | |
| | | int jobExistenceSize, |
| | | short slotProcess, |
| | | short jopCount, |
| | | CJobDataA* pJobDataA) |
| | | CJobDataA* pJobDataA, |
| | | ONWRITED onWritedBlock) |
| | | { |
| | | int id = getID(); |
| | | if ( !(id == EQ_ID_LOADPORT1 || id == EQ_ID_LOADPORT2) ) { |
| | | return -1; |
| | | SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getCassetteCtrlCmdStep(); |
| | | ASSERT(pStep); |
| | | |
| | | char szBuffer[1024] = { 0 }; |
| | | memcpy(&szBuffer[0], &cmd, sizeof(short)); |
| | | if (jobExistence != nullptr && jobExistenceSize == 12) { |
| | | memcpy(&szBuffer[2], jobExistence, sizeof(short) * jobExistenceSize); |
| | | } |
| | | |
| | | memcpy(&szBuffer[26], &slotProcess, sizeof(short)); |
| | | memcpy(&szBuffer[36], &jopCount, sizeof(short)); |
| | | if (pJobDataA != nullptr) { |
| | | pJobDataA->serialize(&szBuffer[38], 1024 - 38); |
| | | } |
| | | |
| | | SERVO::CEqCassetteCtrlCmdStep* pStep = (SERVO::CEqCassetteCtrlCmdStep*)getCassetteCtrlCmdStep(); |
| | | ASSERT(pStep); |
| | | return pStep->sendCtrlCmd(cmd, jobExistence, jobExistenceSize, slotProcess, jopCount, pJobDataA); |
| | | return pStep->writeDataEx(szBuffer, 352 * 2, onWritedBlock); |
| | | } |
| | | |
| | | CStep* CLoadPort::getCassetteCtrlCmdStep() |
| | |
| | | static int autoType[] = { STEP_ID_PORT1_TYPE_AUTO_CHANGE, STEP_ID_PORT2_TYPE_AUTO_CHANGE, |
| | | STEP_ID_PORT3_TYPE_AUTO_CHANGE, STEP_ID_PORT4_TYPE_AUTO_CHANGE }; |
| | | |
| | | CHECK_READ_STEP_SIGNAL2(type[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(mode[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(cassetteType[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(transferMode[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(enable[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(autoType[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(type[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(mode[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(cassetteType[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(transferMode[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(enable[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(autoType[m_nIndex], pszData, size); |
| | | |
| | | |
| | | static int typeReply[] = { STEP_ID_PROT1_TYPE_CHANGE_REPLY, STEP_ID_PROT2_TYPE_CHANGE_REPLY, |
| | |
| | | static int cassetteTypeReply[] = { STEP_ID_PROT1_CASSETTE_TYPE_CHANGE_REPLY, STEP_ID_PROT2_CASSETTE_TYPE_CHANGE_REPLY, |
| | | STEP_ID_PROT3_CASSETTE_TYPE_CHANGE_REPLY, STEP_ID_PROT4_CASSETTE_TYPE_CHANGE_REPLY }; |
| | | |
| | | CHECK_WRITE_STEP_SIGNAL2(typeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(modeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(transferModeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(enableModeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(typeAutoReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(cassetteTypeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(typeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(modeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(transferModeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(enableModeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(typeAutoReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL(cassetteTypeReply[m_nIndex], pszData, size); |
| | | } |
| | | |
| | | int CLoadPort::decodePortStatusReport(CStep* pStep, const char* pszData, size_t size) |
| | |
| | | m_portStatusReport.copyEx(portStatusReport); |
| | | |
| | | |
| | | // å½portç¶æä¸ºInUse, æ¯è¾map |
| | | if (m_portStatusReport.getPortStatus() == PORT_INUSE) { |
| | | short scanMap = m_portStatusReport.getJobExistenceSlot(); |
| | | short downMap = getCassetteMap(); |
| | | if (scanMap == downMap) { |
| | | this->sendCassetteCtrlCmd(5, nullptr, 0, 0, 0, nullptr, nullptr); |
| | | } |
| | | else { |
| | | this->sendCassetteCtrlCmd(10, nullptr, 0, 0, 0, nullptr, nullptr); |
| | | |
| | | // æåºå°åºç¨å±åæç¤º |
| | | if (m_listener.onMapMismatch != nullptr) { |
| | | m_listener.onMapMismatch(this, scanMap, downMap); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // ç¼åAttributeï¼ç¨äºè°è¯æ¶æ¾ç¤ºä¿¡æ¯ |
| | | unsigned int weight = 201; |
| | | CAttributeVector& attrubutes = pStep->attributeVector(); |
| | | m_portStatusReport.getAttributeVector(attrubutes, weight); |
| | | |
| | | LOGI("<CCassetteTranserStateStep>decodePortStatusReport<Status:%d, CassetteSequenceNo:%d>", |
| | | m_portStatusReport.getPortStatus(), m_portStatusReport.getCassetteSequenceNo()); |
| | | LOGI("<CCassetteTranserStateStep>decodePortStatusReport<Status:%d, CassetteSequenceNo:%d, CassetteId:%s>", |
| | | m_portStatusReport.getPortStatus(), m_portStatusReport.getCassetteSequenceNo(), |
| | | m_portStatusReport.getCassetteId().c_str()); |
| | | if (m_portStatusReport.getPortStatus() == 3) { |
| | | LOGI("<CCassetteTranserStateStep>InUse<JobExistenceSlot:%d>", |
| | | m_portStatusReport.getJobExistenceSlot()); |
| | | } |
| | | |
| | | |
| | | return nRet; |
| | |
| | | m_bAutoChangeEnable = bEnable; |
| | | } |
| | | |
| | | short CLoadPort::getCassetteMap() |
| | | { |
| | | short map = 0; |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | if (m_slot[i].getContext() == nullptr) continue; |
| | | map |= (1 << i); |
| | | } |
| | | |
| | | return map; |
| | | } |
| | | |
| | | /* |
| | | * çææµè¯ç¨çç»çå表 |
| | | */ |
| | |
| | | |
| | | |
| | | char szBuffer[64]; |
| | | for (int i = 0; i < 1; i++) { |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | | if (!m_slot[i].isEnable()) continue; |
| | | |
| | | CJobDataS js; |
| | | js.setCassetteSequenceNo(getNextCassetteSequenceNo()); |
| | | js.setJobSequenceNo(m_slot[i].getNo()); |
| | | sprintf_s(szBuffer, 64, "%05d%05d", js.getCassetteSequenceNo(), js.getJobSequenceNo()); |
| | | //js.setGlass1Id(szBuffer); |
| | | js.setJobType(1); |
| | | js.setMaterialsType((int)type); |
| | | |
| | | CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass(); |
| | | pGlass->setOriginPort(m_nIndex, i); |
| | | pGlass->addPath(m_nID, 0); |
| | | pGlass->processEnd(m_nID, 0); |
| | | pGlass->setID(szBuffer); |
| | |
| | | js.setGlass1Id(szBuffer); |
| | | |
| | | CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass(); |
| | | pGlass->setOriginPort(m_nIndex, nSlotIndex); |
| | | pGlass->addPath(m_nID, 0); |
| | | pGlass->processEnd(m_nID, 0); |
| | | pGlass->setID(szBuffer); |
| | |
| | | void localSetCessetteType(CassetteType type); |
| | | void localSetTransferMode(TransferMode mode); |
| | | void localAutoChangeEnable(BOOL bEnable); |
| | | short getCassetteMap(); |
| | | |
| | | public: |
| | | short getNextCassetteSequenceNo(); |
| | |
| | | int jobExistenceSize, |
| | | short slotProcess, |
| | | short jopCount, |
| | | CJobDataA* pJobDataA); |
| | | CJobDataA* pJobDataA, |
| | | ONWRITED onWritedBlock); |
| | | CStep* getCassetteCtrlCmdStep(); |
| | | |
| | | private: |
| | |
| | | |
| | | |
| | | // åç§æºå¨ |
| | | CLoadPort* pLoadPorts[4]; |
| | | CEFEM* pEFEM = (CEFEM*)getEquipment(EQ_ID_EFEM); |
| | | CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1); |
| | | CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2); |
| | | CLoadPort* pLoadPort3 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3); |
| | | CLoadPort* pLoadPort4 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4); |
| | | pLoadPorts[0] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1); |
| | | pLoadPorts[1] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2); |
| | | pLoadPorts[2] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT3); |
| | | pLoadPorts[3] = (CLoadPort*)getEquipment(EQ_ID_LOADPORT4); |
| | | CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER); |
| | | CVacuumBake* pVacuumBake = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE); |
| | | CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER); |
| | |
| | | CMeasurement* pMeasurement = (CMeasurement*)getEquipment(EQ_ID_MEASUREMENT); |
| | | |
| | | ASSERT(pEFEM); |
| | | ASSERT(pLoadPort1); |
| | | ASSERT(pLoadPort2); |
| | | ASSERT(pLoadPort3); |
| | | ASSERT(pLoadPort4); |
| | | ASSERT(pLoadPorts[0]); |
| | | ASSERT(pLoadPorts[1]); |
| | | ASSERT(pLoadPorts[2]); |
| | | ASSERT(pLoadPorts[3]); |
| | | ASSERT(pFliper); |
| | | ASSERT(pVacuumBake); |
| | | ASSERT(pAligner); |
| | |
| | | LOGI("Arm1 %s, Arm2 %s.", rmd.armState[0] ? _T("ä¸å¯ç¨") : _T("å¯ç¨"), |
| | | rmd.armState[1] ? _T("ä¸å¯ç¨") : _T("å¯ç¨")); |
| | | } |
| | | CLoadPort* pEqLoadPort[] = { pLoadPort1, pLoadPort2, pLoadPort3, pLoadPort4 }; |
| | | CEquipment* pEqTar[] = { pVacuumBake, pFliper }; |
| | | if (primaryType == MaterialsType::G2) { |
| | | pEqTar[0] = pFliper; |
| | | pEqTar[1] = pVacuumBake; |
| | | } |
| | | for (int s = 0; s < 4; s++) { |
| | | if (!rmd.armState[0] && pEqLoadPort[s]->isEnable() |
| | | && pEqLoadPort[s]->getPortType() == PortType::Unloading |
| | | && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToUnload) { |
| | | m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType); |
| | | if (!rmd.armState[0] && pLoadPorts[s]->isEnable() |
| | | && pLoadPorts[s]->getPortType() == PortType::Unloading |
| | | && pLoadPorts[s]->getPortMode() == PortMode::ReadyToUnload) { |
| | | m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], primaryType, secondaryType); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | goto PORT_PUT; |
| | | } |
| | |
| | | LOGI("å建æ°ä»»å¡<%s>...", strDescription.c_str()); |
| | | continue; |
| | | } |
| | | |
| | | |
| | | // Measurement NG -> LoadPort |
| | | // NGååä½ |
| | | if (!rmd.armState[1]) { |
| | | m_pActiveRobotTask = createTransferTask_restore(pMeasurement, pLoadPorts); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | m_pActiveRobotTask->pick(); |
| | | std::string strDescription = m_pActiveRobotTask->getDescription(); |
| | | unlock(); |
| | | if (m_listener.onRobotTaskEvent != nullptr) { |
| | | m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE); |
| | | } |
| | | LOGI("å建Measurementåéä»»å¡<%s>...", strDescription.c_str()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | // BakeCooling ->Measurement |
| | |
| | | } |
| | | } |
| | | |
| | | // Aligner -> LoadPort |
| | | if (!rmd.armState[1]) { |
| | | m_pActiveRobotTask = createTransferTask_restore(pAligner, pLoadPorts); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | m_pActiveRobotTask->pick(); |
| | | std::string strDescription = m_pActiveRobotTask->getDescription(); |
| | | unlock(); |
| | | if (m_listener.onRobotTaskEvent != nullptr) { |
| | | m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE); |
| | | } |
| | | LOGI("å建Aligneråéä»»å¡<%s>...", strDescription.c_str()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | // LoadPort -> Aligner |
| | | for (int s = 0; s < 4; s++) { |
| | | if (!rmd.armState[0] && pEqLoadPort[s]->isEnable() |
| | | && pEqLoadPort[s]->getPortType() == PortType::Loading |
| | | && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) { |
| | | m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType); |
| | | if (!rmd.armState[0] && pLoadPorts[s]->isEnable() |
| | | && pLoadPorts[s]->getPortType() == PortType::Loading |
| | | && pLoadPorts[s]->getPortMode() == PortMode::ReadyToLoad) { |
| | | m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | pEFEM->setContext(m_pActiveRobotTask->getContext()); |
| | | goto PORT_GET; |
| | |
| | | }; |
| | | listener.onProcessStateChanged = [&](void* pEquipment, PROCESS_STATE state) -> void { |
| | | LOGI("<Master>onProcessStateChanged<%d>", (int)state); |
| | | }; |
| | | listener.onMapMismatch = [&](void* pEquipment, short scanMap, short downMap) { |
| | | LOGE("<Master-%s>Port InUse, map(%d!=%d)ä¸ä¸è´ï¼è¯·æ£æ¥ã", |
| | | ((CEquipment*)pEquipment)->getName().c_str(), scanMap, downMap); |
| | | }; |
| | | pEquipment->setListener(listener); |
| | | pEquipment->setCcLink(&m_cclink); |
| | |
| | | return pTask; |
| | | } |
| | | |
| | | CRobotTask* CMaster::createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts) |
| | | { |
| | | CRobotTask* pTask = nullptr; |
| | | CSlot* pSrcSlot, * pTarSlot = nullptr, * pTempSlot; |
| | | pSrcSlot = pEqSrc->getInspFailSlot(); |
| | | if (pSrcSlot != nullptr) { |
| | | CGlass* pGlass = (CGlass*)pSrcSlot->getContext(); |
| | | ASSERT(pGlass); |
| | | int port, slot; |
| | | pGlass->getOrginPort(port, slot); |
| | | pGlass->setInspResult(pPorts[port]->getID(), 0, InspResult::Fail); |
| | | ASSERT(0 <= port && port < 4); |
| | | ASSERT(0 <= slot && slot < 8); |
| | | pTempSlot = pPorts[port]->getSlot(slot); |
| | | if (pTempSlot->getContext() == nullptr) { |
| | | pTarSlot = pTempSlot; |
| | | } |
| | | } |
| | | |
| | | |
| | | if (pSrcSlot != nullptr && nullptr != pTarSlot) { |
| | | pTask = new CRobotTask(); |
| | | pTask->setContext(pSrcSlot->getContext()); |
| | | pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM)); |
| | | taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(), |
| | | pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo()); |
| | | } |
| | | |
| | | |
| | | return pTask; |
| | | } |
| | | |
| | | int CMaster::abortCurrentTask() |
| | | { |
| | | lock(); |
| | |
| | | CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq); |
| | | CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq); |
| | | CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq); |
| | | |
| | | CRobotTask* createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts); |
| | | |
| | | private: |
| | | CRITICAL_SECTION m_criticalSection; |
| | | MasterListener m_listener; |
| | |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | { |
| | | // Panel Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0x1A17f, 386 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodePanelDataReport((CStep*)pFrom, pszData, size); |
| | | } |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_PANEL_DATA_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x105e); |
| | | if (addStep(STEP_ID_PANEL_DATA_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // å¿
é¡»è¦å®ç°çè彿°ï¼å¨æ¤åå§åSlotä¿¡æ¯ |
| | |
| | | { |
| | | ASSERT(m_pEquipment != nullptr); |
| | | ASSERT(m_pEquipment->getID() == EQ_ID_LOADPORT1 |
| | | || m_pEquipment->getID() == EQ_ID_LOADPORT2); |
| | | || m_pEquipment->getID() == EQ_ID_LOADPORT2 |
| | | || m_pEquipment->getID() == EQ_ID_LOADPORT3 |
| | | || m_pEquipment->getID() == EQ_ID_LOADPORT4); |
| | | SERVO::CLoadPort* pLoadPort = (SERVO::CLoadPort*)m_pEquipment; |
| | | |
| | | short cmd = 0; |
| | |
| | | |
| | | |
| | | pLoadPort->sendCassetteCtrlCmd(cmd, &jobExistence[0], jobExistenceSize, slotProcess, |
| | | jobCount, pJobDataA); |
| | | jobCount, pJobDataA, [&](int code) -> int { |
| | | if (code == WOK) { |
| | | LOGI("sendCassetteCtrlCmd æå."); |
| | | } |
| | | else { |
| | | LOGI("sendCassetteCtrlCmd 失败."); |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | } |
| | |
| | | } |
| | | |
| | | if (pEquipment->getID() == EQ_ID_LOADPORT1 |
| | | || pEquipment->getID() == EQ_ID_LOADPORT2) { |
| | | || pEquipment->getID() == EQ_ID_LOADPORT2 |
| | | || pEquipment->getID() == EQ_ID_LOADPORT3 |
| | | || pEquipment->getID() == EQ_ID_LOADPORT4) { |
| | | CPageCassetteCtrlCmd* pPage = new CPageCassetteCtrlCmd(); |
| | | pPage->setEquipment(pEquipment); |
| | | pPage->Create(IDD_PAGE_CASSETTE_CTRL_CMD); |
| | |
| | | m_timeOut = 0; |
| | | m_timeIn = CToolUnits::getTimestamp(); |
| | | m_bProcessed = FALSE; |
| | | m_inspResult = InspResult::NotInspected; |
| | | m_pPrev = nullptr; |
| | | m_pNext = nullptr; |
| | | } |
| | |
| | | m_nUnit = nUnit; |
| | | m_timeOut = 0; |
| | | m_timeIn = CToolUnits::getTimestamp(); |
| | | m_bProcessed = FALSE; |
| | | m_inspResult = InspResult::NotInspected; |
| | | m_pPrev = nullptr; |
| | | m_pNext = nullptr; |
| | | m_bProcessed = FALSE; |
| | | } |
| | | |
| | | CPath::~CPath() |
| | |
| | | ar << m_timeIn; |
| | | ar << m_timeOut; |
| | | ar << m_bProcessed; |
| | | ar << (int)m_inspResult; |
| | | ar << (ULONGLONG)m_pNext; |
| | | if (m_pNext != nullptr) { |
| | | m_pNext->serialize(ar); |
| | | } |
| | | } |
| | | else { |
| | | int temp; |
| | | |
| | | ar >> m_nEqID; |
| | | ar >> m_nUnit; |
| | | ar >> m_timeIn; |
| | | ar >> m_timeOut; |
| | | ar >> m_bProcessed; |
| | | ar >> temp; m_inspResult = (InspResult)temp; |
| | | ULONGLONG ulNext; |
| | | ar >> ulNext; |
| | | if ((CPath*)ulNext != nullptr) { |
| | |
| | | return m_bProcessed; |
| | | } |
| | | |
| | | void CPath::setInspResult(InspResult result) |
| | | { |
| | | m_inspResult = result; |
| | | } |
| | | |
| | | InspResult CPath::getInspResult() |
| | | { |
| | | return m_inspResult; |
| | | } |
| | | |
| | | CPath* CPath::getPrev() |
| | | { |
| | | return m_pPrev; |
| | |
| | | #pragma once |
| | | #include "ServoCommo.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | |
| | | ULONGLONG getOutTime(); |
| | | void processEnd(); |
| | | BOOL isProcessEnd(); |
| | | void setInspResult(InspResult result); |
| | | InspResult getInspResult(); |
| | | |
| | | private: |
| | | unsigned int m_nEqID; |
| | |
| | | ULONGLONG m_timeIn; |
| | | ULONGLONG m_timeOut; |
| | | BOOL m_bProcessed; |
| | | InspResult m_inspResult; |
| | | CPath* m_pPrev; |
| | | CPath* m_pNext; |
| | | }; |
| | |
| | | return false; |
| | | } |
| | | |
| | | short CPortStatusReport::getJobExistenceSlot() |
| | | { |
| | | return m_nJobExistenceSlot[0]; |
| | | } |
| | | |
| | | void CPortStatusReport::WriteString(CArchive& ar, std::string& string) |
| | | { |
| | | CString strTemp = string.c_str(); |
| | |
| | | public: |
| | | bool canPickFromPort(); |
| | | bool isJobExistenceSlot(); |
| | | short getJobExistenceSlot(); |
| | | |
| | | private: |
| | | void WriteString(CArchive& ar, std::string& string); |
| | |
| | | short m_nJobExistenceSlot[12]; // 12 * 16 = 192 个slotæ¯å¦åå¨glass |
| | | short m_nLoadingCassetteType; // 1: Actual Cassette 2 : Empty Cassette |
| | | short m_nQTimeFlag; |
| | | short m_nCassetteMappingState; // 1: mapping use 2: mapping not use |
| | | short m_nCassetteMappingState; // 1: mapping use, 2: mapping not use |
| | | short m_nCassetteStatus; |
| | | }; |
| | | } |
| | |
| | | |
| | | int CVcrEventReport::serialize(char* pszBuffer, int nBufferSize) |
| | | { |
| | | if (nBufferSize < 640) return -1; |
| | | if (nBufferSize < 30) return -1; |
| | | |
| | | int index = 0; |
| | | int strLen = min(20, m_strGlassId.size()); |
| | |
| | | |
| | | int CVcrEventReport::unserialize(const char* pszBuffer, int nBufferSize) |
| | | { |
| | | if (nBufferSize < 640) return -1; |
| | | if (nBufferSize < 30) return -1; |
| | | |
| | | int index = 0; |
| | | CToolUnits::convertString(&pszBuffer[index], 20, m_strGlassId); |
| | |
| | | #define PAGE_GRPAH2_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define EQ_BOX_OFFLINE RGB(222, 222, 222) |
| | | #define EQ_BOX_ONLINE RGB(0, 176, 80) |
| | | #define EQ_BOX_OCCUPIED RGB(0, 204, 102) |
| | | #define EQ_BOX_OCCUPIED RGB(255, 127, 39) |
| | | #define EQ_BOX_FRAME1 RGB(22, 22, 22) |
| | | #define EQ_BOX_FRAME2 RGB(255, 127, 39) |
| | | #define CR_MSGBOX_BKGND RGB(7, 71, 166) |
| | |
| | | #define STEP_ID_PROT2_CASSETTE_TYPE_CHANGE_REPLY 0x699 |
| | | #define STEP_ID_PROT3_CASSETTE_TYPE_CHANGE_REPLY 0x69A |
| | | #define STEP_ID_PROT4_CASSETTE_TYPE_CHANGE_REPLY 0x69B |
| | | #define STEP_ID_PROT1_CASSETTE_CTR_CMD_REPLY 0x6A0 |
| | | #define STEP_ID_PROT2_CASSETTE_CTR_CMD_REPLY 0x6A1 |
| | | #define STEP_ID_PROT3_CASSETTE_CTR_CMD_REPLY 0x6A2 |
| | | #define STEP_ID_PROT4_CASSETTE_CTR_CMD_REPLY 0x6A3 |
| | | #define STEP_ID_ROBOT_CMD_REPLY 0x6b0 |
| | | |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | int nItem = m_listCtrl.InsertItem(0, _T("")); |
| | | int nIndex = m_listCtrl.GetItemCount(); |
| | | if (nIndex < 0) { |
| | | return; |
| | | } |
| | | |
| | | int nItem = m_listCtrl.InsertItem(nIndex, _T("")); |
| | | CString str; |
| | | str.Format(_T("%d"), data.nRecordId); |
| | | m_listCtrl.SetItemText(nItem, 1, str); |
| | |
| | | </ResourceCompile> |
| | | <PostBuildEvent> |
| | | <Command>if exist "\\DESKTOP-IODBVIQ\Servo\Debug\" ( |
| | | xcopy /Y /D "$(OutDir)*.exe" "\\DESKTOP-IODBVIQ\Servo\Debug\" |
| | | xcopy /Y /D "$(OutDir)*.pdb" "\\DESKTOP-IODBVIQ\Servo\Debug\" |
| | | xcopy /Y /D "$(OutDir)Servo.exe" "\\DESKTOP-IODBVIQ\Servo\Debug\" |
| | | xcopy /Y /D "$(OutDir)Servo.pdb" "\\DESKTOP-IODBVIQ\Servo\Debug\" |
| | | )</Command> |
| | | </PostBuildEvent> |
| | | </ItemDefinitionGroup> |
| | |
| | | #include <string> |
| | | #include <vector> |
| | | |
| | | |
| | | #define CHECK_READ_STEP_SIGNAL(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CReadStep*)pStep)->onReadSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | #define CHECK_WRITE_STEP_SIGNAL(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CWriteStep*)pStep)->onRecvSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | namespace SERVO { |
| | | #define BLOCK_BUFFER_MAX 1024 |
| | | #define ALIVE_TIMEOUT 15 |
| | |
| | | OK = 1, |
| | | NG, |
| | | }; |
| | | typedef RET JobDataRequestAck; |
| | | using JobDataRequestAck = RET; |
| | | |
| | | enum class InspResult |
| | | { |
| | | NotInspected = 0, // åå§åç¶æï¼å°æªæ£æµ |
| | | Pass, // æ£æµåæ ¼ |
| | | Fail // æ£æµä¸åæ ¼ |
| | | }; |
| | | |
| | | enum class PortType { |
| | | Loading = 1, |