mrDarker
2025-06-06 2f0684bf01209b9ddfdc53da44fb85f4db6db326
Merge branch 'clh' into liuyang
已添加2个文件
已修改24个文件
已删除1个文件
412 ■■■■ 文件已修改
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.7(1).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.7.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArm.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArmTray.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBakeCooling.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.cpp 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlass.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMeasurement.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph2.cpp 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPath.cpp 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPath.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CSlot.cpp 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoCommo.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/EqsGraph.ini 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Master.dat 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -52,3 +52,4 @@
SourceCode/Bond/x64/Debug/Backups/
Document/共享文件夹/
Document/共享文件夹.rar
SourceCode/Bond/x64/Debug/Master.dat
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.7(1).xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.7.xlsx
Binary files differ
SourceCode/Bond/Servo/CArm.cpp
@@ -106,6 +106,10 @@
        pGlass = pPreviousGlass;
        pGlass->addRef();
        m_slot[0].setContext(nullptr);
        CGlass* pBuddy = pGlass->getBuddy();
        if (pBuddy != nullptr) {
            m_slot[1].setContext(nullptr);
        }
        Unlock();
        if (m_listener.onDataChanged != nullptr) {
SourceCode/Bond/Servo/CArmTray.cpp
@@ -41,6 +41,10 @@
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1");
        m_slot[1].enable();
        m_slot[1].setPosition(m_nID);
        m_slot[1].setNo(2);
        m_slot[1].setName("Slot 2");
    }
    void CArmTray::onTimer(UINT nTimerid)
SourceCode/Bond/Servo/CBakeCooling.h
@@ -21,6 +21,7 @@
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int recvIntent(CPin* pPin, CIntent* pIntent);
        virtual int getIndexerOperationModeBaseValue();
        virtual short getSlotUnit(short slot) { return slot <= 2 ? 0 : 1; };
    };
}
SourceCode/Bond/Servo/CBonder.cpp
@@ -390,6 +390,11 @@
        Lock();
        CGlass* pGlass1 = getGlassFromSlot(1);
        CGlass* pGlass2 = getGlassFromSlot(2);
        if (pGlass1 == nullptr || pGlass2 == nullptr) {
            LOGE("<CBonder-%s>onProcessData,错误!不满足两片玻璃且分别为G1与G2的条件,请检查数据是否正确!", m_strName.c_str());
            Unlock();
            return -1;
        }
        if (pGlass1->getBuddy() != nullptr || pGlass2->getBuddy() != nullptr) {
            LOGE("<CBonder-%s>onProcessData,错误!玻璃较早前已被绑定,请检查数据是否正确!", m_strName.c_str());
            Unlock();
SourceCode/Bond/Servo/CEFEM.cpp
@@ -663,6 +663,16 @@
                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)
SourceCode/Bond/Servo/CEquipment.cpp
@@ -35,6 +35,7 @@
        m_bLocalAlarm = FALSE;
        m_bAutoRecipeChange = FALSE;
        m_bVCREnable[0] = FALSE;
        memset(m_bLinkSignal, 0, sizeof(m_bLinkSignal));
        m_pCclink = nullptr;
        m_nBaseAlarmId = 0;
        m_pArm = nullptr;
@@ -334,22 +335,23 @@
            }
            
            // 梳理各玻璃之间的绑定关系
            /*
            Lock();
            std::list<CGlass*> list = m_glassList;
            for (auto item : list) {
                std::string& strBuddyId = item->getBuddyId();
            for (int i = 0; i < SLOT_MAX; i++) {
                CGlass* pGlass = (CGlass*)m_slot[i].getContext();
                if (pGlass != nullptr) {
                    std::string& strBuddyId = pGlass->getBuddyId();
                if (!strBuddyId.empty()) {
                    for (auto item2 : m_glassList) {
                        if (strBuddyId.compare(item2->getID()) == 0) {
                            item->setBuddy(item2);
                            TRACE("绑定关系: %s <- %s\n", item->getID().c_str(), item2->getID().c_str());
                        for (int j = 0; j < SLOT_MAX; j++) {
                            CGlass* pBudy = (CGlass*)m_slot[j].getContext();
                            if (pBudy != nullptr && strBuddyId.compare(pBudy->getID()) == 0) {
                                pGlass->setBuddy(pBudy);
                                TRACE("绑定关系: %s <- %s\n", pGlass->getID().c_str(), pBudy->getID().c_str());
                            }
                        }
                    }
                }
            }
            Unlock();
            */
        }
    }
@@ -363,9 +365,20 @@
        }
        */
        // 以下解释和处理数据
        // 连接信号解释和保存
        BOOL bFlag;
        int index = 0x540;
        int index = 0;
        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;
        }
        // 其它信号及响应
        index = 0x540;
        // alive
@@ -582,6 +595,28 @@
        return m_bVCREnable[index];
    }
    BOOL CEquipment::isLinkSignalOn(unsigned int path, unsigned int signal)
    {
        if (path >= PATH_MAX) return FALSE;
        if (signal >= SIGNAL_MAX) return FALSE;
        return m_bLinkSignal[path][signal];
    }
    void CEquipment::setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn)
    {
        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 (code == STEP_EVENT_READDATA) {
@@ -756,7 +791,7 @@
        return 0;
    }
    int CEquipment::storedJob(CJobDataB* pJobDataB, short& putSlot)
    int CEquipment::storedJob(CJobDataB* pJobDataB, short putSlot)
    {
        if (m_pArm == nullptr) {
            return -1;
@@ -770,23 +805,26 @@
        ASSERT(pGlass);
        Lock();
        pGlass->addPath(m_nID);
        pGlass->addPath(m_nID, getSlotUnit(putSlot));
        m_slot[putSlot - 1].setContext(pGlass);
        pGlass->release();                // tempFetchOut需要调用一次release
        Unlock();
        // 如果此玻璃已经贴合,贴合的玻璃也要从加入到列表中
        /*
        CGlass* pBuddy = pGlass->getBuddy();
        if (pBuddy != nullptr) {
            Lock();
            pBuddy->addPath(m_nID);
            pBuddy->addRef();                    // 加入list,addRef
            m_glassList.push_back(pBuddy);
            pBuddy->addPath(m_nID, 0);
            if (putSlot % 2 == 0) {
                m_slot[putSlot - 2].setContext(pBuddy);
            }
            else {
                m_slot[putSlot].setContext(pBuddy);
            }
            Unlock();
        }
        */
        if (m_listener.onDataChanged != nullptr) {
            m_listener.onDataChanged(this, EDCC_STORED_JOB);
@@ -1111,13 +1149,42 @@
            if (m_slot[i].isLock()) continue;
            CGlass* pGlass = (CGlass*)m_slot[i].getContext();
            if (pGlass == nullptr) continue;
            if(!m_bLinkSignal[0][SIGNAL_UPSTREAM_INLINE]
                || m_bLinkSignal[0][SIGNAL_UPSTREAM_TROUBLE]
                || !m_bLinkSignal[0][SIGNAL_INTERLOCK]
                || !m_bLinkSignal[0][SIGNAL_SEND_ABLE] ) continue;
            MaterialsType glassType = pGlass->getType();
            if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
            if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
            if (!pGlass->isProcessed(m_nID)) continue;
            return &m_slot[i];
        }
        return nullptr;
    }
    CSlot* CEquipment::getProcessedSlot2(MaterialsType putSlotType, const std::vector<int>& candidates)
    {
        for (auto item : candidates) {
            for (int i = 0; i < SLOT_MAX; i++) {
                if (item == i + 1) {
                    if (!m_slot[i].isEnable()) continue;
                    if (m_slot[i].isLock()) continue;
                    CGlass* pGlass = (CGlass*)m_slot[i].getContext();
                    if (pGlass == nullptr) continue;
                    if (!m_bLinkSignal[0][SIGNAL_UPSTREAM_INLINE]
                        || m_bLinkSignal[0][SIGNAL_UPSTREAM_TROUBLE]
                        || !m_bLinkSignal[0][SIGNAL_INTERLOCK]
                        || !m_bLinkSignal[0][SIGNAL_SEND_ABLE]) continue;
                    MaterialsType glassType = pGlass->getType();
                    if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
                    if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
                    return &m_slot[i];
                }
            }
        }
        return nullptr;
@@ -1438,10 +1505,6 @@
    int CEquipment::onProcessData(CProcessData* pProcessData)
    {
        LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str());
        CGlass* pGlass = getGlass(pProcessData->getGlassId().c_str());
        if (pGlass != nullptr) {
            pGlass->processEnd(m_nID);
        }
        return 0;
    }
SourceCode/Bond/Servo/CEquipment.h
@@ -38,7 +38,11 @@
namespace SERVO {
#define SLOT_MAX        12
#define SLOT_MAX                PATH_MAX
#define SIGNAL_UPSTREAM_INLINE    0
#define SIGNAL_UPSTREAM_TROUBLE    1
#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;
@@ -101,12 +105,13 @@
        virtual void onReceiveLBData(const char* pszData, size_t size);
        virtual int onStepEvent(CStep* pStep, int code);
        virtual CPin* addPin(PinType type, char* pszName);
        virtual short getSlotUnit(short slot) { return 0; };
        CPin* getPin(char* pszName);
        std::vector<CPin*>& CEquipment::getInputPins();
        std::vector<CPin*>& CEquipment::getOutputPins();
        virtual int recvIntent(CPin* pPin, CIntent* pIntent);
        virtual int fetchedOutJob(CJobDataB* pJobDataB);
        virtual int storedJob(CJobDataB* pJobDataB, short& putSlot);
        virtual int storedJob(CJobDataB* pJobDataB, short putSlot);
        virtual int onReceivedJob(int port, CJobDataS* pJobDataS);
        virtual int onSentOutJob(int port, CJobDataS* pJobDataS);
        virtual BOOL onPreFetchedOutJob(int port, CJobDataB* pJobDataB);
@@ -159,6 +164,7 @@
        // 获取一个指定物料类型(G1,G2,G1&G2)的且已经加工处理的槽位
        CSlot* getProcessedSlot(MaterialsType putSlotType);
        CSlot* getProcessedSlot2(MaterialsType putSlotType, const std::vector<int>& candidates);
        // 获取玻璃物料
        CGlass* getGlassFromSlot(int slotNo);
@@ -186,6 +192,11 @@
        BOOL isLocalAlarm();
        BOOL isAutoRecipeChange();
        BOOL isVCREnable(unsigned int index);
        BOOL isLinkSignalOn(unsigned int path, unsigned int signal);
        // 只在模拟测试时使用的函数,用于模拟信号
        void setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn);
        void setLinkSignalBlock(unsigned int path, BOOL* pSignal);
    protected:
        inline void Lock() { EnterCriticalSection(&m_criticalSection); }
@@ -230,6 +241,7 @@
        BOOL m_bLocalAlarm;
        BOOL m_bAutoRecipeChange;
        BOOL m_bVCREnable[VCR_MAX];
        BOOL m_bLinkSignal[PATH_MAX][SIGNAL_MAX];
    protected:
        CCCLinkIEControl* m_pCclink;
SourceCode/Bond/Servo/CGlass.cpp
@@ -66,29 +66,16 @@
        return m_strID;
    }
    CPath* CGlass::getPathWithSiteID(unsigned int nSiteId)
    {
        CPath* pPath = m_pPath;
        while (pPath != nullptr) {
            if (nSiteId == pPath->getSiteID()) {
                return pPath;
            }
            pPath = pPath->getNext();
        }
        return nullptr;
    }
    CPath* CGlass::getPath()
    {
        return m_pPath;
    }
    CPath* CGlass::getPathWithSiteId(unsigned int nSiteId)
    CPath* CGlass::getPathWithEq(unsigned int nEqId, unsigned int nUnit)
    {
        CPath* pTemp = m_pPath;
        while (pTemp != nullptr) {
            if (pTemp->getSiteID() == nSiteId) {
            if (pTemp->getEqID() == nEqId && pTemp->getUnit() == nUnit) {
                return pTemp;
            }
@@ -98,9 +85,9 @@
        return nullptr;
    }
    void CGlass::addPath(unsigned int nSiteId)
    void CGlass::addPath(unsigned int nEqId, unsigned int nUnit)
    {
        CPath* pPath = new CPath(nSiteId);
        CPath* pPath = new CPath(nEqId, nUnit);
        if (m_pPath == nullptr) {
            m_pPath = pPath;
        }
@@ -197,17 +184,17 @@
        return m_strBuddyId;
    }
    void CGlass::processEnd(unsigned int nSiteId)
    void CGlass::processEnd(unsigned int nEqId, unsigned int nUnit)
    {
        CPath* pPath = getPathWithSiteID(nSiteId);
        CPath* pPath = getPathWithEq(nEqId, nUnit);
        if (pPath != nullptr) {
            pPath->processEnd();
        }
    }
    BOOL CGlass::isProcessed(unsigned int nSiteId)
    BOOL CGlass::isProcessed(unsigned int nEqId, unsigned int nUnit)
    {
        CPath* pPath = getPathWithSiteID(nSiteId);
        CPath* pPath = getPathWithEq(nEqId, nUnit);
        if (pPath == nullptr) return FALSE;
        return pPath->isProcessEnd();
SourceCode/Bond/Servo/CGlass.h
@@ -24,10 +24,9 @@
        void setType(MaterialsType type);
        void setID(const char* pszID);
        std::string& getID();
        CPath* getPathWithSiteID(unsigned int nSiteId);
        CPath* getPathWithEq(unsigned int nEqId, unsigned int nUnit);
        CPath* getPath();
        CPath* getPathWithSiteId(unsigned int nSiteId);
        void addPath(unsigned int nSiteId);
        void addPath(unsigned int nEqId, unsigned int nUnit);
        void serialize(CArchive& ar);
        void setJobDataB(CJobDataB* pJobDataB);
        CJobDataB* getJobDataB();
@@ -36,8 +35,8 @@
        BOOL setBuddy(CGlass* pGlass);
        CGlass* getBuddy();
        std::string& getBuddyId();
        void processEnd(unsigned int nSiteId);
        BOOL isProcessed(unsigned int nSiteId);
        void processEnd(unsigned int nEqId, unsigned int nUnit);
        BOOL isProcessed(unsigned int nEqId, unsigned int nUnit);
    private:
        MaterialsType m_type;
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1097,8 +1097,8 @@
            }
            CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
            pGlass->addPath(m_nID);
            pGlass->processEnd(m_nID);
            pGlass->addPath(m_nID, 0);
            pGlass->processEnd(m_nID, 0);
            pGlass->setID(szBuffer);
            pGlass->setJobDataB(&jb);
            pGlass->setType(type);
SourceCode/Bond/Servo/CMaster.cpp
@@ -295,6 +295,7 @@
        CBonder* pBonder1 = (CBonder*)getEquipment(EQ_ID_Bonder1);
        CBonder* pBonder2 = (CBonder*)getEquipment(EQ_ID_Bonder2);
        CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
        CMeasurement* pMeasurement = (CMeasurement*)getEquipment(EQ_ID_MEASUREMENT);
        ASSERT(pLoadPort1);
        ASSERT(pLoadPort2);
@@ -304,6 +305,7 @@
        ASSERT(pBonder1);
        ASSERT(pBonder2);
        ASSERT(pBakeCooling);
        ASSERT(pMeasurement);
        while (1) {
            // 待退出信号或时间到
@@ -367,24 +369,51 @@
                }
                // Bonder -> BakeCooling
                m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling, primaryType, secondaryType);
                // BakeCooling ->Measurement
                m_pActiveRobotTask = createTransferTask_bakecooling_to_measurement(pBakeCooling, pMeasurement);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling, primaryType, secondaryType);
                // BakeCooling内部
                // Bake -> Cooling
                m_pActiveRobotTask = createTransferTask_bake_to_cooling(pBakeCooling);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                // Bonder -> BakeCooling
                m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -396,7 +425,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -407,7 +436,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -421,7 +450,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -432,7 +461,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -452,7 +481,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -463,7 +492,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -477,7 +506,7 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
@@ -488,14 +517,11 @@
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                // BakeCooling ->Measurement
                // Measurement -> LoadPort
@@ -525,6 +551,7 @@
                break;
            }
            // 读标志位
            for (auto item : m_listEquipment) {
                if (item->getID() == EQ_ID_Bonder1 ||
                    item->getID() == EQ_ID_Bonder2) {
@@ -669,7 +696,7 @@
                    lock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 1);
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_FINISH);
                    }
                    delete m_pActiveRobotTask;
                    m_pActiveRobotTask = nullptr;
@@ -1112,20 +1139,14 @@
        return pTask;
    }
    CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq,
        MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/)
    CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq)
    {
        std::vector<int> slots = {1, 2};
        CRobotTask* pTask = nullptr;
        CSlot* pSrcSlot, * pTarSlot;
        pTarSlot = pTarEq->getAvailableSlotForGlass2(primaryType, slots);
        pSrcSlot = pSrcEq->getProcessedSlot(primaryType);
        if (pSrcSlot == nullptr || nullptr == pTarSlot) {
            pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
            pSrcSlot = pSrcEq->getProcessedSlot(secondaryType);
        }
        pTarSlot = pTarEq->getAvailableSlotForGlass2(MaterialsType::G1, slots);
        pSrcSlot = pSrcEq->getProcessedSlot(MaterialsType::G1);
        if (pSrcSlot != nullptr && nullptr != pTarSlot) {
            pTask = new CRobotTask();
@@ -1137,4 +1158,46 @@
        return pTask;
    }
    CRobotTask* CMaster::createTransferTask_bake_to_cooling(CEquipment* pSrcEq)
    {
        std::vector<int> slotsTar = { 3, 4 };
        std::vector<int> slotsSrc = { 1, 2 };
        CRobotTask* pTask = nullptr;
        CSlot* pSrcSlot, * pTarSlot;
        pTarSlot = pSrcEq->getAvailableSlotForGlass2(MaterialsType::G1, slotsTar);
        pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slotsSrc);
        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;
    }
    CRobotTask* CMaster::createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq)
    {
        std::vector<int> slots = { 3, 4 };
        CRobotTask* pTask = nullptr;
        CSlot* pSrcSlot, * pTarSlot;
        pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G1);
        pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slots);
        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
@@ -86,8 +86,9 @@
        void setState(MASTERSTATE state);
        CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq,
            MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2);
        CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq,
            MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2);
        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);
    private:
        CRITICAL_SECTION m_criticalSection;
SourceCode/Bond/Servo/CMeasurement.cpp
@@ -45,6 +45,10 @@
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1");
        m_slot[1].enable();
        m_slot[1].setPosition(m_nID);
        m_slot[1].setNo(2);
        m_slot[1].setName("Slot 2");
    }
    void CMeasurement::onTimer(UINT nTimerid)
SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -264,6 +264,34 @@
        }
        else if (nCmd == ID_EQSGRAPHITEM_TEST4) {
            SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData;
            if (pEquipment != nullptr) {
                pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_INLINE, TRUE);
                pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_TROUBLE, FALSE);
                pEquipment->setLinkSignal(0, SIGNAL_INTERLOCK, TRUE);
                pEquipment->setLinkSignal(0, SIGNAL_SEND_ABLE, TRUE);
            }
            if (pEquipment != nullptr && (pEquipment->getID() == EQ_ID_Bonder1
                || pEquipment->getID() == EQ_ID_Bonder2)) {
                SERVO::CGlass* pGlass = pEquipment->getAnyGlass();
                if (pGlass != nullptr) {
                    SERVO::CProcessData pd;
                    pd.setGlassId(pGlass->getID().c_str());
                    pEquipment->onProcessData(&pd);
                }
            }
        }
        else if (nCmd == ID_EQSGRAPHITEM_TEST5) {
            SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData;
            if (pEquipment != nullptr) {
                pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_INLINE, TRUE);
                pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_TROUBLE, TRUE);
                pEquipment->setLinkSignal(0, SIGNAL_INTERLOCK, TRUE);
                pEquipment->setLinkSignal(0, SIGNAL_SEND_ABLE, FALSE);
            }
        }
        else if (nCmd == ID_EQSGRAPHITEM_TEST6) {
            SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData;
            // 测试下发Cim Message
SourceCode/Bond/Servo/CPath.cpp
@@ -6,7 +6,7 @@
namespace SERVO {
    CPath::CPath()
    {
        m_nSiteID = 0;
        m_nEqID = 0;
        m_timeOut = 0;
        m_timeIn = CToolUnits::getTimestamp();
        m_bProcessed = FALSE;
@@ -14,9 +14,10 @@
        m_pNext = nullptr;
    }
    CPath::CPath(unsigned int nSiteId)
    CPath::CPath(unsigned int nEqId, unsigned int nUnit)
    {
        m_nSiteID = nSiteId;
        m_nEqID = nEqId;
        m_nUnit = nUnit;
        m_timeOut = 0;
        m_timeIn = CToolUnits::getTimestamp();
        m_pPrev = nullptr;
@@ -32,8 +33,10 @@
    void CPath::getDescription(std::string& strOut)
    {
        strOut.clear();
        strOut = "CPath<SiteID:";
        strOut = strOut + std::to_string(m_nSiteID);
        strOut = "CPath<EqID:";
        strOut = strOut + std::to_string(m_nEqID);
        strOut = strOut + ",Unit:";
        strOut = strOut + std::to_string(m_nUnit);
        strOut = strOut + ",InTime:";
        strOut = strOut + CToolUnits::timeToString2(m_timeIn);
        strOut = strOut + ",OutTime:";
@@ -44,7 +47,8 @@
    void CPath::serialize(CArchive& ar)
    {
        if (ar.IsStoring()) {
            ar << m_nSiteID;
            ar << m_nEqID;
            ar << m_nUnit;
            ar << m_timeIn;
            ar << m_timeOut;
            ar << m_bProcessed;
@@ -54,7 +58,8 @@
            }
        }
        else {
            ar >> m_nSiteID;
            ar >> m_nEqID;
            ar >> m_nUnit;
            ar >> m_timeIn;
            ar >> m_timeOut;
            ar >> m_bProcessed;
@@ -69,9 +74,14 @@
        }
    }
    unsigned int CPath::getSiteID()
    unsigned int CPath::getEqID()
    {
        return m_nSiteID;
        return m_nEqID;
    }
    unsigned int CPath::getUnit()
    {
        return m_nUnit;
    }
    ULONGLONG CPath::getInTime()
SourceCode/Bond/Servo/CPath.h
@@ -6,7 +6,7 @@
    {
    public:
        CPath();
        CPath(unsigned int nSiteId);
        CPath(unsigned int nEqId, unsigned int nUnit);
        virtual ~CPath();
    public:
@@ -17,7 +17,8 @@
        void addPath(CPath* pPath);
        CPath* getTailPath();
        CPath* getHeadPath();
        unsigned int getSiteID();
        unsigned int getEqID();
        unsigned int getUnit();
        ULONGLONG getInTime();
        void setOutTime(ULONGLONG time);
        ULONGLONG getOutTime();
@@ -25,7 +26,8 @@
        BOOL isProcessEnd();
    private:    
        unsigned int m_nSiteID;
        unsigned int m_nEqID;
        unsigned int m_nUnit;
        ULONGLONG m_timeIn;
        ULONGLONG m_timeOut;
        BOOL m_bProcessed;
SourceCode/Bond/Servo/CSlot.cpp
@@ -122,23 +122,12 @@
    void CSlot::serialize(CArchive& ar)
    {
        if (ar.IsStoring()) {
            ar << m_nPosition;
            ar << m_nNo;
            ar << (int)m_materialsType;
            WriteString(ar, m_strName);
            ar << (__int64)m_pContext;
            ar << m_bEnable;
            ar << m_bLock;
        }
        else {
            int i32;
            __int64 i64;
            ar >> m_nPosition;
            ar >> m_nNo;
            ar >> i32; m_materialsType = (MaterialsType)i32;
            ReadString(ar, m_strName);
            ar >> i64; m_pTempContext = (CContext*)i64;
            ar >> m_bEnable;
            ar >> m_bLock;
        }
    }
SourceCode/Bond/Servo/Model.cpp
@@ -248,7 +248,7 @@
        int nRecordId = 0;
        TransferManager::getInstance().addTransferRecord(data, nRecordId);
        notifyPtr(RX_CODE_EQ_ROBOT_TASK, pTask);
        notifyPtrAndInt(RX_CODE_EQ_ROBOT_TASK, pTask, nullptr, code);
        LOGI("<CModel>onRobotTaskEvent: 任务记录已保存,RecordID=%d", nRecordId);
    };
    m_master.setListener(masterListener);
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/ServoCommo.h
@@ -5,6 +5,8 @@
#define BLOCK_BUFFER_MAX            1024
#define ALIVE_TIMEOUT                15
#define VCR_MAX                        1
#define PATH_MAX                    8
#define SIGNAL_MAX                    8
#define ARM_ALL                        99
    enum class PortType {
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -188,14 +188,15 @@
                }
            }
            else if (RX_CODE_EQ_ROBOT_TASK == code) {
                int exCode;
                if (pAny->getIntValue("exCode", exCode)) {
                    if (exCode == ROBOT_EVENT_CREATE) {
                SERVO::CRobotTask* pTask = theApp.m_model.getMaster().getActiveRobotTask();
                if (m_pRobotTaskDlg != nullptr) {
                        ASSERT(pTask);
                        if (m_pRobotTaskDlg) {
                    m_pRobotTaskDlg->SetRobotTask(pTask);
                }
                if (pTask == nullptr) {
                    m_pMyStatusbar->setCurTaskBtnText("无");
                }
                else {
                    SERVO::CEquipment* pEq1, * pEq2;
                    pEq1 = theApp.m_model.getMaster().getEquipment(pTask->getSrcPosition());
                    pEq2 = theApp.m_model.getMaster().getEquipment(pTask->getTarPosition());
@@ -205,6 +206,10 @@
                        m_pMyStatusbar->setCurTaskBtnText((LPTSTR)(LPCTSTR)strText);
                    }
                }
                    else if (exCode == ROBOT_EVENT_FINISH) {
                        m_pMyStatusbar->setCurTaskBtnText("无");
                    }
                }
            }
            pAny->release();
SourceCode/Bond/Servo/resource.h
Binary files differ
SourceCode/Bond/x64/Debug/EqsGraph.ini
@@ -39,7 +39,7 @@
Top=63
[Arm Tray2]
Left=467
Top=166
Top=167
[Fliper(G2)]
Left=238
Top=251
SourceCode/Bond/x64/Debug/Master.dat
Binary files differ