1.EFEM更新信号到LoadPort, Robot, Aligner, Fliper
2.搬送条件,增加Upstream Inline、Upstream Trouble、Interlock、Send Able信号的检测。
| | |
| | | m_pPort[i]->onReceiveLBData(pszData, size); |
| | | } |
| | | } |
| | | |
| | | // 更新信号到LoadPort, Robot, Aligner, Fliper |
| | | m_pPort[0]->setLinkSignalBlock(0, &m_bLinkSignal[0][0]); |
| | | m_pPort[1]->setLinkSignalBlock(0, &m_bLinkSignal[1][0]); |
| | | m_pPort[2]->setLinkSignalBlock(0, &m_bLinkSignal[2][0]); |
| | | m_pPort[3]->setLinkSignalBlock(0, &m_bLinkSignal[3][0]); |
| | | m_pArmTray[0]->setLinkSignalBlock(0, &m_bLinkSignal[4][0]); |
| | | m_pArmTray[1]->setLinkSignalBlock(0, &m_bLinkSignal[5][0]); |
| | | m_pAligner->setLinkSignalBlock(0, &m_bLinkSignal[6][0]); |
| | | m_pFliper->setLinkSignalBlock(0, &m_bLinkSignal[7][0]); |
| | | } |
| | | |
| | | int CEFEM::onReceivedJob(int port, CJobDataS* pJobDataS) |
| | |
| | | for (int i = 0; i < 8; i++) { |
| | | m_bLinkSignal[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0); |
| | | m_bLinkSignal[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1); |
| | | m_bLinkSignal[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2); |
| | | m_bLinkSignal[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3); |
| | | index += 0x40; |
| | | } |
| | |
| | | if (path >= PATH_MAX) return; |
| | | if (signal >= SIGNAL_MAX) return; |
| | | m_bLinkSignal[path][signal] = bOn; |
| | | } |
| | | |
| | | void CEquipment::setLinkSignalBlock(unsigned int path, BOOL* pSignal) |
| | | { |
| | | if (path >= PATH_MAX) return; |
| | | for (int i = 0; i < SIGNAL_MAX; i++) { |
| | | m_bLinkSignal[path][i] = pSignal[i]; |
| | | } |
| | | } |
| | | |
| | | int CEquipment::onStepEvent(CStep* pStep, int code) |
| | |
| | | if (m_slot[i].isLock()) continue; |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass == nullptr) continue; |
| | | if(!m_bLinkSignal[i][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignal[i][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignal[i][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignal[i][SIGNAL_SEND_ABLE] ) continue; |
| | | |
| | | MaterialsType glassType = pGlass->getType(); |
| | | if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue; |
| | |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define SLOT_MAX 12 |
| | | #define SLOT_MAX PATH_MAX |
| | | #define SIGNAL_UPSTREAM_INLINE 0 |
| | | #define SIGNAL_UPSTREAM_TROUBLE 1 |
| | | #define SIGNAL_SEND_ABLE 2 |
| | | #define SIGNAL_INTERLOCK 2 |
| | | #define SIGNAL_SEND_ABLE 3 |
| | | |
| | | typedef std::function<void(void* pEiuipment, BOOL bAlive)> ONALIVE; |
| | | typedef std::function<void(void* pEiuipment, int code)> ONDATACHANGED; |
| | |
| | | |
| | | // 只在模拟测试时使用的函数,用于模拟信号 |
| | | void setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn); |
| | | void setLinkSignalBlock(unsigned int path, BOOL* pSignal); |
| | | |
| | | protected: |
| | | inline void Lock() { EnterCriticalSection(&m_criticalSection); } |