| | |
| | | namespace SERVO { |
| | | CLoadPort::CLoadPort() : CEquipment() |
| | | { |
| | | |
| | | m_nType = 0; |
| | | m_nMode = 0; |
| | | m_nCassetteType = 0; |
| | | m_nTransferMode = 4; |
| | | m_bEnable = FALSE; |
| | | m_bAutoChangeEnable = FALSE; |
| | | } |
| | | |
| | | CLoadPort::~CLoadPort() |
| | |
| | | void CLoadPort::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | __super::getAttributeVector(attrubutes); |
| | | |
| | | for (auto item : m_inputPins) { |
| | | attrubutes.addAttribute(new CAttribute(item->getName().c_str(), |
| | | std::to_string((int)item->getType()).c_str(), "")); |
| | | } |
| | | |
| | | for (auto item : m_outputPins) { |
| | | attrubutes.addAttribute(new CAttribute(item->getName().c_str(), |
| | | std::to_string((int)item->getType()).c_str(), "")); |
| | | } |
| | | |
| | | for (auto item : m_panelList) { |
| | | attrubutes.addAttribute(new CAttribute("Panel", |
| | | item->getID().c_str(), "")); |
| | | } |
| | | } |
| | | |
| | | void CLoadPort::outputPanel() |
| | | int CLoadPort::recvIntent(CPin* pPin, CIntent* pIntent) |
| | | { |
| | | CPin* pOutPin = getPin("Out"); |
| | | return __super::recvIntent(pPin, pIntent); |
| | | } |
| | | |
| | | |
| | | int CLoadPort::outputGlass(int port) |
| | | { |
| | | // 如果列表中没有Panel,模拟生成10张 |
| | | if (m_panelList.empty()) { |
| | | if (m_glassList.empty()) { |
| | | static int ii = 0; |
| | | char szBuffer[64]; |
| | | LOGI("<CLoadPort>模拟生成10张PANEL"); |
| | | for (int i = 0; i < 10; i++) { |
| | | sprintf_s(szBuffer, "P20250320A1A%d", ++ii); |
| | | CPanel* pPanel = new CPanel(); |
| | | pPanel->setID(szBuffer); |
| | | addPanelToList(pPanel); |
| | | CGlass* pGlass = new CGlass(); |
| | | pGlass->setID(szBuffer); |
| | | addGlassToList(pGlass); |
| | | } |
| | | } |
| | | |
| | | return __super::outputGlass(port); |
| | | } |
| | | |
| | | // 模拟取出第一张Panel,传送到下一环节 |
| | | BOOL CLoadPort::glassWillArrive(CGlass* pGlass) |
| | | { |
| | | BOOL bRet = __super::glassWillArrive(pGlass); |
| | | if (!bRet) { |
| | | return FALSE; |
| | | } |
| | | |
| | | return (m_glassList.size() < 8); |
| | | } |
| | | |
| | | int CLoadPort::sendCassetteCtrlCmd(short cmd, |
| | | short* jobExistence, |
| | | int jobExistenceSize, |
| | | short slotProcess, |
| | | short jopCount, |
| | | CJobDataA* pJobDataA) |
| | | { |
| | | int id = getID(); |
| | | if ( !(id == EQ_ID_LOADPORT1 || id == EQ_ID_LOADPORT2) ) { |
| | | return -1; |
| | | } |
| | | |
| | | |
| | | SERVO::CEqCassetteCtrlCmdStep* pStep = (SERVO::CEqCassetteCtrlCmdStep*)getCassetteCtrlCmdStep(); |
| | | ASSERT(pStep); |
| | | return pStep->sendCtrlCmd(cmd, jobExistence, jobExistenceSize, slotProcess, jopCount, pJobDataA); |
| | | } |
| | | |
| | | CStep* CLoadPort::getCassetteCtrlCmdStep() |
| | | { |
| | | CStep* pStep = nullptr; |
| | | Lock(); |
| | | CPanel* pContext = m_panelList.front(); |
| | | pContext->addRef(); |
| | | |
| | | CIntent intent(FLOW_MOVE_MATERIAL, "", pContext); |
| | | int nRet = pOutPin->sendIntent(&intent); |
| | | if (nRet == FLOW_REJECT) { |
| | | AfxMessageBox("对方拒绝接受"); |
| | | for (auto item : m_mapStep) { |
| | | if (item.second->getName().find(STEP_EQ_P1_CASSETTE_CTRL_CMD) == 0 |
| | | || item.second->getName().find(STEP_EQ_P2_CASSETTE_CTRL_CMD) == 0 |
| | | || item.second->getName().find(STEP_EQ_P3_CASSETTE_CTRL_CMD) == 0 |
| | | || item.second->getName().find(STEP_EQ_P4_CASSETTE_CTRL_CMD) == 0) { |
| | | pStep = item.second; |
| | | } |
| | | } |
| | | else if (nRet == FLOW_ACCEPT) { |
| | | m_panelList.pop_front(); |
| | | pContext->release(); // 添加到列队时addRef, 取出时release |
| | | } |
| | | |
| | | pContext->release(); |
| | | Unlock(); |
| | | |
| | | return pStep; |
| | | } |
| | | |
| | | BOOL CLoadPort::isEnable() |
| | | { |
| | | return m_bEnable; |
| | | } |
| | | |
| | | int CLoadPort::getPortType() |
| | | { |
| | | return m_nType; |
| | | } |
| | | |
| | | int CLoadPort::getPortMode() |
| | | { |
| | | return m_nMode; |
| | | } |
| | | |
| | | int CLoadPort::getCessetteType() |
| | | { |
| | | return m_nCassetteType; |
| | | } |
| | | |
| | | int CLoadPort::getTransferMode() |
| | | { |
| | | return m_nTransferMode; |
| | | } |
| | | |
| | | BOOL CLoadPort::isAutoChange() |
| | | { |
| | | return m_bAutoChangeEnable; |
| | | } |
| | | |
| | | /* |
| | | 1: Loading Port |
| | | 2: Unloading Port |
| | | 3: Both Port |
| | | 4: Buffer Port-Buffer Type |
| | | 5: Buffer Port-Loader in Buffer Type |
| | | 6: Buffer Port-Un-loader in Buffer Type |
| | | 7: Unloading Partial Port |
| | | */ |
| | | std::string& CLoadPort::getPortTypeDescription(int portType, std::string& strDescription) |
| | | { |
| | | switch (portType) { |
| | | case 1: |
| | | strDescription = _T("Loading Port"); |
| | | break; |
| | | case 2: |
| | | strDescription = _T("Unloading Port"); |
| | | break; |
| | | case 3: |
| | | strDescription = _T("Both Port"); |
| | | break; |
| | | case 4: |
| | | strDescription = _T("Buffer Port - Buffer Type"); |
| | | break; |
| | | case 5: |
| | | strDescription = _T("Buffer Port - Loader in Buffer Type"); |
| | | break; |
| | | case 6: |
| | | strDescription = _T("Buffer Port - Un-loader in Buffer Type"); |
| | | break; |
| | | case 7: |
| | | strDescription = _T("Unloading Partial Port"); |
| | | break; |
| | | default: |
| | | strDescription = _T(""); |
| | | break; |
| | | } |
| | | |
| | | return strDescription; |
| | | } |
| | | |
| | | /* |
| | | 0: OutOfService |
| | | 1: TransferBlocked |
| | | 2: ReadyToLoad |
| | | 3: ReadyToUnload |
| | | 4: InService |
| | | 5: TransferReady |
| | | */ |
| | | std::string& CLoadPort::getPortModeDescription(int portMode, std::string& strDescription) |
| | | { |
| | | switch (portMode) { |
| | | case 0: |
| | | strDescription = _T("OutOfService"); |
| | | break; |
| | | case 1: |
| | | strDescription = _T("TransferBlocked"); |
| | | break; |
| | | case 2: |
| | | strDescription = _T("ReadyToLoad"); |
| | | break; |
| | | case 3: |
| | | strDescription = _T("ReadyToUnload"); |
| | | break; |
| | | case 4: |
| | | strDescription = _T("InService"); |
| | | break; |
| | | case 5: |
| | | strDescription = _T("TransferReady"); |
| | | break; |
| | | default: |
| | | strDescription = _T(""); |
| | | break; |
| | | } |
| | | |
| | | return strDescription; |
| | | } |
| | | |
| | | /* |
| | | 1: G1 |
| | | 2: G2 |
| | | 3: G1&G2 |
| | | */ |
| | | std::string& CLoadPort::getPortCassetteTypeDescription(int casseteType, std::string& strDescription) |
| | | { |
| | | switch (casseteType) { |
| | | case 1: |
| | | strDescription = _T("G1"); |
| | | break; |
| | | case 2: |
| | | strDescription = _T("G2"); |
| | | break; |
| | | case 3: |
| | | strDescription = _T("G1&G2"); |
| | | break; |
| | | default: |
| | | strDescription = _T(""); |
| | | break; |
| | | } |
| | | |
| | | return strDescription; |
| | | } |
| | | |
| | | /* |
| | | 1: MGV Mode |
| | | 2: AGV Mode |
| | | 3: Stocker Inline Mode |
| | | */ |
| | | std::string& CLoadPort::getPortTransferModeDescription(int mode, std::string& strDescription) |
| | | { |
| | | switch (mode) { |
| | | case 1: |
| | | strDescription = _T("MGV Mode"); |
| | | break; |
| | | case 2: |
| | | strDescription = _T("AGV Mode"); |
| | | break; |
| | | case 3: |
| | | strDescription = _T("Stocker Inline Mode"); |
| | | break; |
| | | default: |
| | | strDescription = _T(""); |
| | | break; |
| | | } |
| | | |
| | | return strDescription; |
| | | } |
| | | |
| | | |
| | | /* |
| | | 1 : Enable |
| | | 2 : Disable |
| | | */ |
| | | std::string& CLoadPort::getEnableModeDescription(int mode, std::string& strDescription) |
| | | { |
| | | switch (mode) { |
| | | case 1: |
| | | strDescription = _T("Enable"); |
| | | break; |
| | | case 2: |
| | | strDescription = _T("Disable"); |
| | | break; |
| | | default: |
| | | strDescription = _T(""); |
| | | break; |
| | | } |
| | | |
| | | return strDescription; |
| | | } |
| | | } |