mrDarker
2025-06-19 ae6ef5e9343aba44b7547ecc4afab935ebdf4806
Merge branch 'clh' into liuyang
已添加1个文件
已删除6个文件
已修改19个文件
358 ■■■■■ 文件已修改
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.2.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.4(1).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(4).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(5).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.7(3).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBakeCooling.cpp 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.cpp 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqWriteStep.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqWriteStep.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMeasurement.cpp 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph2.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotCmdTestDlg.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CVacuumBake.cpp 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CWriteStep.cpp 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CWriteStep.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoCommo.h 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.2.xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.4(1).xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(4).xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(5).xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5.xlsx
Binary files differ
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.7(3).xlsx
Binary files differ
SourceCode/Bond/Servo/CBakeCooling.cpp
@@ -239,7 +239,7 @@
        {
            // Received Job Report Upstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x10c90 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -263,7 +263,7 @@
        {
            // Sent Out Job Report Downstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x10000 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -287,7 +287,7 @@
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x11c31 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -311,7 +311,7 @@
        {
            // Stored Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x11b23 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
SourceCode/Bond/Servo/CBonder.cpp
@@ -244,7 +244,7 @@
        {
            // Received Job Report Upstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep((m_nIndex == 0 ? 0x8c90 : 0xcc90) + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -267,7 +267,7 @@
        {
            // Sent Out Job Report Downstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep((m_nIndex == 0 ? 0x8000 : 0xc000) + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -291,7 +291,7 @@
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep((m_nIndex == 0 ? 0x9c31 : 0xdc31) + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -315,7 +315,7 @@
        {
            // Stored Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep((m_nIndex == 0 ? 0x9b23 : 0xdb23) + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -333,6 +333,18 @@
                if (addStep(STEP_ID_STORE_JOB_REPORT1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Indexer Operation Mode Change
            CEqWriteStep* pStep = new CEqWriteStep();
            pStep->setName(STEP_EQ_IN_OP_MODE_CHANGE);
            pStep->setWriteSignalDev(0x370);
            pStep->setDataDev(0x923);
            pStep->setRetDataDev(0xa00e, 2);
            if (addStep(STEP_ID_IN_OP_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
@@ -429,6 +441,14 @@
        CEquipment::onProcessData(pProcessData);
        return 0;
    }
    int CBonder::onProcessStateChanged(PROCESS_STATE state)
    {
        CEquipment::onProcessStateChanged(state);
        if (state == PROCESS_STATE::Complete) {
        // 检查数据,当前两片玻璃,一片为G1, 一片为G2, 且pProcessData中的id能匹配G1或G2
        Lock();
        CGlass* pGlass2 = getGlassFromSlot(1);
@@ -452,9 +472,10 @@
        pGlass1->setBuddy(pGlass2);
        getSlot(0)->setContext(nullptr);
        LOGE("<CBonder-%s>onProcessData,%s和%s已贴合!", m_strName.c_str(),
            LOGE("<CBonder-%s>onProcessStateChanged,%s和%s已贴合!", m_strName.c_str(),
            pGlass1->getID().c_str(), pGlass2->getID().c_str());
        Unlock();
        }
        return 0;
    }
SourceCode/Bond/Servo/CBonder.h
@@ -22,6 +22,7 @@
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int recvIntent(CPin* pPin, CIntent* pIntent);
        virtual int onProcessData(CProcessData* pProcessData);
        virtual int onProcessStateChanged(PROCESS_STATE state);
        virtual int getIndexerOperationModeBaseValue();
    public:
SourceCode/Bond/Servo/CEFEM.cpp
@@ -22,7 +22,7 @@
        m_pPort[3] = nullptr;
        m_pAligner = nullptr;
        m_pFliper = nullptr;
        m_robotData.status = ROBOT_STATUS::Idle;
        m_robotData.status = ROBOT_STATUS::Setup;
        m_robotData.position = ROBOT_POSITION::Port1;
        m_robotData.armState[0] = FALSE;
        m_robotData.armState[1] = FALSE;
@@ -549,55 +549,7 @@
                pStep->setName(szBuffer);
                pStep->setProp("Upstream", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x0 + i);
                if (addStep(STEP_ID_FETCHED_OUT_JOB_REPORT1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x5c31 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
                            int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                            if (port > 0) {
                                decodeFetchedOutJobReport((CStep*)pFrom, port, pszData, size);
                            }
                        }
                        return -1;
                    });
                sprintf_s(szBuffer, "%s%d", STEP_EQ_FETCHED_OUT_JOBn, i+1);
                pStep->setName(szBuffer);
                pStep->setProp("Port", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x023 + i);
                if (addStep(STEP_ID_FETCHED_OUT_JOB_REPORT1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Store Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x5b23 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
                            int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                            if (port > 0) {
                                decodeStoredJobReport((CStep*)pFrom, port, pszData, size);
                            }
                        }
                        return -1;
                    });
                sprintf_s(szBuffer, "%s%d", STEP_EQ_STORED_JOBn, i + 1);
                pStep->setName(szBuffer);
                pStep->setProp("Port", (void*)(__int64)(i + 1));
                pStep->setWriteSignalDev(0x014 + i);
                if (addStep(STEP_ID_STORE_JOB_REPORT1 + i, pStep) != 0) {
                if (addStep(STEP_ID_RECIVE_JOB_UPS1 + i, pStep) != 0) {
                    delete pStep;
                }
            }
@@ -628,9 +580,10 @@
        {
            // Indexer Operation Mode Change
            CEqWriteStep* pStep = new CEqWriteStep();
            pStep->setName(STEP_EFEM_IN_OP_MODE_CHANGE);
            pStep->setName(STEP_EQ_IN_OP_MODE_CHANGE);
            pStep->setWriteSignalDev(0x070);
            pStep->setDataDev(0x023);
            pStep->setRetDataDev(0x600e, 2);
            if (addStep(STEP_ID_IN_OP_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
SourceCode/Bond/Servo/CEqWriteStep.cpp
@@ -64,4 +64,13 @@
        return 0;
    }
    int CEqWriteStep::onReadRetDataError()
    {
        if (m_onWritedBlock != nullptr) {
            m_onWritedBlock(WREAD_RET_ERR);
        }
        return 0;
    }
}
SourceCode/Bond/Servo/CEqWriteStep.h
@@ -5,6 +5,7 @@
#define WOK                0
#define WTIMEOUT        -1
#define WREAD_RET_ERR    -2
namespace SERVO {
    typedef std::function<int(int code)> ONWRITED;
@@ -23,6 +24,7 @@
        int writeDataEx(const char* pszData, int size, ONWRITED onWritedBlock = nullptr);
        virtual int onComplete();
        virtual int onTimeout();
        virtual int onReadRetDataError();
    private:
        int m_nDataDev;
SourceCode/Bond/Servo/CEquipment.cpp
@@ -39,6 +39,7 @@
        m_pCclink = nullptr;
        m_nBaseAlarmId = 0;
        m_pArm = nullptr;
        m_processState = PROCESS_STATE::Ready;
        InitializeCriticalSection(&m_criticalSection);
    }
@@ -142,6 +143,16 @@
        pStep->setCcLink(m_pCclink);
        m_mapStep[addr] = pStep;
        return 0;
    }
    void CEquipment::setProcessState(PROCESS_STATE state)
    {
        m_processState = state;
        onProcessStateChanged(m_processState);
        if (m_listener.onProcessStateChanged != nullptr) {
            m_listener.onProcessStateChanged(this, m_processState);
        }
    }
    void CEquipment::init()
@@ -394,7 +405,9 @@
            m_bLinkSignal[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3);
            index += 0x40;
        }         
        if(m_bLinkSignal[0][SIGNAL_SEND_ABLE]) {
            onSendAble();
        }
        // 其它信号及响应
        index = 0x540;
@@ -795,6 +808,11 @@
        pContext->release();
        Unlock();
        if (m_processState != PROCESS_STATE::Ready) {
            setProcessState(PROCESS_STATE::Ready);
        }
        if (m_listener.onDataChanged != nullptr) {
            m_listener.onDataChanged(this, EDCC_FETCHOUT_JOB);
        }
@@ -821,22 +839,9 @@
        pGlass->release();                // tempFetchOut需要调用一次release
        Unlock();
        // 如果此玻璃已经贴合,贴合的玻璃也要从加入到列表中
        /*
        CGlass* pBuddy = pGlass->getBuddy();
        if (pBuddy != nullptr) {
            Lock();
            pBuddy->addPath(m_nID, 0);
            if (putSlot % 2 == 0) {
                m_slot[putSlot - 2].setContext(pBuddy);
        if (m_processState != PROCESS_STATE::Processing) {
            setProcessState(PROCESS_STATE::Processing);
            }
            else {
                m_slot[putSlot].setContext(pBuddy);
            }
            Unlock();
        }
        */
        if (m_listener.onDataChanged != nullptr) {
            m_listener.onDataChanged(this, EDCC_STORED_JOB);
@@ -1007,30 +1012,34 @@
        return 0;
    }
    int CEquipment::indexerOperationModeChange(IDNEXER_OPERATION_MODE mode, ONWRITED onWritedBlock/* = nullptr*/)
    int CEquipment::indexerOperationModeChange(IDNEXER_OPERATION_MODE mode, ONWRITEDRET onWritedRetBlock)
    {
        SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EFEM_IN_OP_MODE_CHANGE);
        SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_IN_OP_MODE_CHANGE);
        if (pStep == nullptr) {
            return -1;
        }
        unsigned short operationMode = (unsigned short)((unsigned short)mode + getIndexerOperationModeBaseValue());
        LOGI("<CEquipment-%s>准备设置indexerOperationMode<%d>", m_strName.c_str(), (int)mode);
        if (onWritedBlock != nullptr) {
            pStep->writeShort(operationMode, onWritedBlock);
        }
        else {
            pStep->writeShort(operationMode, [&, mode](int code) -> int {
            int retCode = 0;
                if (code == WOK) {
                    LOGI("<CEquipment-%s>设置indexerOperationMode成功.", m_strName.c_str());
                const char* pszRetData = nullptr;
                pStep->getReturnData(pszRetData);
                ASSERT(pszRetData);
                retCode = (unsigned int)CToolUnits::toInt16(pszRetData);
                }
                else {
                    LOGI("<CEquipment-%s>设置indexerOperationMode失败,code:%d", m_strName.c_str(), code);
                }
            if (onWritedRetBlock != nullptr) {
                onWritedRetBlock(code, retCode);
            }
                return 0;
                });
        }
        return 0;
    }
@@ -1595,6 +1604,26 @@
        return 0;
    }
    /*
     * 当从CC-Link检测到设备Send Able为On时调用此函数
     * 可能会多次重复调用(根据扫描频率), 注意防呆
     */
    int CEquipment::onSendAble()
    {
        LOGI("<CEquipment-%s>onSendAble.", m_strName.c_str());
        if (m_processState != PROCESS_STATE::Complete) {
            setProcessState(PROCESS_STATE::Complete);
        }
        return 0;
    }
    int CEquipment::onProcessStateChanged(PROCESS_STATE state)
    {
        return 0;
    }
    int CEquipment::getIndexerOperationModeBaseValue()
    {
        return 0;
SourceCode/Bond/Servo/CEquipment.h
@@ -43,6 +43,7 @@
#define SIGNAL_UPSTREAM_TROUBLE    1
#define SIGNAL_INTERLOCK        2
#define SIGNAL_SEND_ABLE        3
    typedef std::function<int(int writeCode, int retCode)> ONWRITEDRET;
    typedef std::function<void(void* pEiuipment, BOOL bAlive)> ONALIVE;
    typedef std::function<void(void* pEiuipment, int code)> ONDATACHANGED;
@@ -50,6 +51,7 @@
    typedef std::function<void(void* pEiuipment, void* pReport)> ONVCREVENTREPORT;
    typedef std::function<BOOL(void* pEiuipment, CJobDataB* pJobDataB)> ONPREFETCHEDOUTJOB;
    typedef std::function<BOOL(void* pEiuipment, CJobDataB* pJobDataB, short& putSlot)> ONPRESTOREDJOB;
    typedef std::function<void(void* pEiuipment, PROCESS_STATE state)> ONPROCESSSTATE;
    typedef struct _EquipmentListener
    {
        ONALIVE                onAlive;
@@ -59,6 +61,7 @@
        ONVCREVENTREPORT    onVcrEventReport;
        ONPREFETCHEDOUTJOB    onPreFethedOutJob;
        ONPRESTOREDJOB        onPreStoredJob;
        ONPROCESSSTATE        onProcessStateChanged;
    } EquipmentListener;
@@ -119,6 +122,8 @@
        virtual BOOL onPreStoredJob(int port, CJobDataB* pJobDataB, short& putSlot);
        virtual int onStoredJob(int port, CJobDataB* pJobDataB);
        virtual int onProcessData(CProcessData* pProcessData);
        virtual int onSendAble();
        virtual int onProcessStateChanged(PROCESS_STATE state);
        virtual int getIndexerOperationModeBaseValue();
        bool isAlarmStep(SERVO::CStep* pStep);
        bool isVcrEventStep(SERVO::CStep* pStep);
@@ -136,7 +141,7 @@
        int clearCimMessage(short id, short nTouchPanelNo);
        int setDateTime(short year, short month, short day, short hour, short minute, short second);
        int setDispatchingMode(DISPATCHING_MODE mode, ONWRITED onWritedBlock = nullptr);
        int indexerOperationModeChange(IDNEXER_OPERATION_MODE mode, ONWRITED onWritedBlock = nullptr);
        int indexerOperationModeChange(IDNEXER_OPERATION_MODE mode, ONWRITEDRET onWritedRetBlock);
@@ -225,6 +230,7 @@
        int removeJobDataS(int nCassetteSequenceNo, int nJobSequenceNo);
        CJobDataS* getJobDataS(int nCassetteSequenceNo, int nJobSequenceNo);
        BOOL compareJobDataB(CJobDataB* pJobDataB1, CJobDataB* pJobDataB2);
        void setProcessState(PROCESS_STATE state);
    protected:
        EquipmentListener m_listener;
@@ -256,6 +262,7 @@
        int m_nBaseAlarmId;
        CRecipesManager m_recipesManager;
        CSlot m_slot[SLOT_MAX];
        PROCESS_STATE m_processState;
    private:
        CEquipment* m_pArm;
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -57,30 +57,12 @@
    // 必须要实现的虚函数,在此初始化Slot信息
    void CLoadPort::initSlots()
    {
        m_slot[0].enable();
        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");
        m_slot[2].setPosition(m_nID);
        m_slot[2].enable();
        m_slot[2].setNo(3);
        m_slot[2].setName("Slot 3");
        m_slot[3].setPosition(m_nID);
        m_slot[3].enable();
        m_slot[3].setNo(4);
        m_slot[3].setName("Slot 4");
        m_slot[4].setPosition(m_nID);
        m_slot[4].enable();
        m_slot[4].setNo(5);
        m_slot[4].setName("Slot 5");
        m_slot[5].setPosition(m_nID);
        m_slot[5].enable();
        m_slot[5].setNo(6);
        m_slot[5].setName("Slot 6");
        for (int i = 0; i < SLOT_MAX; i++) {
            m_slot[i].enable();
            m_slot[i].setPosition(m_nID);
            m_slot[i].setNo(i + 1);
            m_slot[i].setName((std::string("Slot") + std::to_string(i+1)).c_str());
        }
    }
    void CLoadPort::initSteps()
@@ -363,6 +345,50 @@
                if (addStep(addr[i][m_nIndex], pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            CEqReadStep* pStep = new CEqReadStep(0x5c31 + 18 * m_nIndex, 18 * 2,
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                        if (port > 0) {
                            decodeFetchedOutJobReport((CStep*)pFrom, port, pszData, size);
                        }
                    }
                    return -1;
                });
            sprintf_s(szBuffer, "%s%d", STEP_EQ_FETCHED_OUT_JOBn, m_nIndex + 1);
            pStep->setName(szBuffer);
            pStep->setProp("Port", (void*)(__int64)(m_nIndex + 1));
            pStep->setWriteSignalDev(0x023 + m_nIndex);
            if (addStep(STEP_ID_FETCHED_OUT_JOB_REPORT1 + m_nIndex, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Store Job Report #1~15
            char szBuffer[256];
            CEqReadStep* pStep = new CEqReadStep(0x5b23 + 18 * m_nIndex, 18 * 2,
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
                        if (port > 0) {
                            decodeStoredJobReport((CStep*)pFrom, port, pszData, size);
                        }
                    }
                    return -1;
                });
            sprintf_s(szBuffer, "%s%d", STEP_EQ_STORED_JOBn, m_nIndex + 1);
            pStep->setName(szBuffer);
            pStep->setProp("Port", (void*)(__int64)(m_nIndex + 1));
            pStep->setWriteSignalDev(0x014 + m_nIndex);
            if (addStep(STEP_ID_STORE_JOB_REPORT1 + m_nIndex, pStep) != 0) {
                delete pStep;
            }
        }
    }
@@ -838,6 +864,8 @@
    void CLoadPort::onReceiveLBData(const char* pszData, size_t size)
    {
        __super::onReceiveLBData(pszData, size);
        static int type[] = { STEP_ID_PORT1_TYPE_CHANGE, STEP_ID_PORT2_TYPE_CHANGE,
            STEP_ID_PORT3_TYPE_CHANGE, STEP_ID_PORT4_TYPE_CHANGE };
        static int mode[] = { STEP_ID_PORT1_MODE_CHANGE, STEP_ID_PORT2_MODE_CHANGE,
@@ -1128,7 +1156,7 @@
        char szBuffer[64];
        int suffix = startSuffix;
        for (int i = 0; i < SLOT_MAX; i++) {
        for (int i = 0; i < 1; i++) {
            if (!m_slot[i].isEnable()) continue;
            CJobDataB jb;
SourceCode/Bond/Servo/CMaster.cpp
@@ -613,17 +613,6 @@
            // 读标志位
            for (auto item : m_listEquipment) {
                //if (item->getID() == EQ_ID_Bonder1 ||
                //    item->getID() == EQ_ID_Bonder2) {
                //    const StationIdentifier& station = item->getStation();
                //    MemoryBlock& block = item->getReadBitBlock();
                //    int nRet = m_cclink.ReadData2(station, (DeviceType)block.type,
                //        block.start, block.size, block.buffer);
                //    if (0 == nRet) {
                //        item->onReceiveLBData(block.buffer, block.size);
                //    }
                //}
                const StationIdentifier& station = item->getStation();
                MemoryBlock& block = item->getReadBitBlock();
@@ -788,7 +777,9 @@
                unlock();
            }
        };
        listener.onProcessStateChanged = [&](void* pEquipment, PROCESS_STATE state) -> void {
            LOGI("<Master>onProcessStateChanged<%d>", (int)state);
        };
        pEquipment->setListener(listener);
        pEquipment->setCcLink(&m_cclink);
        m_listEquipment.push_back(pEquipment);
SourceCode/Bond/Servo/CMeasurement.cpp
@@ -239,7 +239,7 @@
        {
            // Received Job Report Upstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x18c90 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -263,7 +263,7 @@
        {
            // Sent Out Job Report Downstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x18000 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -287,7 +287,7 @@
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x19c31 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -311,7 +311,7 @@
        {
            // Stored Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x19b23 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -212,17 +212,18 @@
        else if (nCmd == ID_EQSGRAPHITEM_TEST1) {
            BOOL bTestGenerate = FALSE;
            SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData;
            if (pEquipment->getID() == EQ_ID_LOADPORT1 && !pEquipment->hasGlass()) {
            if (pEquipment->getID() == EQ_ID_LOADPORT4 && !pEquipment->hasGlass()) {
                ((SERVO::CLoadPort*)pEquipment)->testGenerateGlassList(SERVO::MaterialsType::G1, 
                    "P20250320G1X", 1);
                bTestGenerate = TRUE;
            }
            /*
            else if (pEquipment->getID() == EQ_ID_LOADPORT2 && !pEquipment->hasGlass()) {
                ((SERVO::CLoadPort*)pEquipment)->testGenerateGlassList(SERVO::MaterialsType::G2,
                    "P20250320G2X", 1);
                bTestGenerate = TRUE;
            }
            */
            if (!bTestGenerate) {
                SERVO::CRobotTask* pTask = theApp.m_model.getMaster().getActiveRobotTask();
                if (pTask != nullptr) {
SourceCode/Bond/Servo/CRobotCmdTestDlg.cpp
@@ -270,6 +270,8 @@
void CRobotCmdTestDlg::AppendLogLineRichStyled(const CString& content, COLORREF color /*= RGB(0, 0, 0)*/)
{
    if (!::IsWindow(GetSafeHwnd())) return;
    // 时间戳
    CString timestamp;
    CTime now = CTime::GetCurrentTime();
SourceCode/Bond/Servo/CRobotTask.cpp
@@ -227,7 +227,7 @@
        ASSERT(m_pEFEM);
        m_state = ROBOT_TASK_STATE::Picking;
        m_pEFEM->robotSendMoveToGet(m_robotCmdParam->sequenceNo,
        m_pEFEM->robotSendGet(m_robotCmdParam->sequenceNo,
            m_robotCmdParam[ACTION_PICK].armNo,
            m_robotCmdParam[ACTION_PICK].getPosition,
            m_robotCmdParam[ACTION_PICK].getSlotNo,
SourceCode/Bond/Servo/CVacuumBake.cpp
@@ -239,7 +239,7 @@
        {
            // Received Job Report Upstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x14c90 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -263,7 +263,7 @@
        {
            // Sent Out Job Report Downstream #1~9
            char szBuffer[256];
            for (int i = 0; i < 9; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x14000 + 320 * i, 320 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -287,7 +287,7 @@
        {
            // Fetched Out Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x15c31 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
@@ -311,7 +311,7 @@
        {
            // Stored Job Report #1~15
            char szBuffer[256];
            for (int i = 0; i < 15; i++) {
            for (int i = 0; i < 1; i++) {
                CEqReadStep* pStep = new CEqReadStep(0x15b23 + 18 * i, 18 * 2,
                    [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                        if (code == ROK && pszData != nullptr && size > 0) {
SourceCode/Bond/Servo/CWriteStep.cpp
@@ -55,6 +55,18 @@
        m_nWriteSignalDev = dev;
    }
    void CWriteStep::setRetDataDev(int dev, int size)
    {
        m_nReturnDevNo = dev;
        m_nReturnDataSize = size;
    }
    int CWriteStep::getReturnData(const char*& pszData)
    {
        pszData = m_szReturnBuf;
        return m_nReturnDataSize;
    }
    void CWriteStep::onRecvSignal(BOOL bSignal)
    {
        Lock();
@@ -111,6 +123,18 @@
                    goto RESET;
                }
                ResetEvent(m_hRecvSignalOn);
                // 3.9读数据,如果有
                if (m_nReturnDataSize > 0) {
                    int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nReturnDevNo,
                        (long)min(READ_BUFFER_MAX, m_nReturnDataSize), m_szReturnBuf);
                    if (0 != nRet) {
                        LOGI("<CEqReadStep>Read return data error.");
                        onReadRetDataError();
                        return -1;
                    }
                }
                // 4.дOFF
@@ -196,4 +220,9 @@
    {
        return 0;
    }
    int CWriteStep::onReadRetDataError()
    {
        return 0;
    }
}
SourceCode/Bond/Servo/CWriteStep.h
@@ -19,8 +19,14 @@
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int onComplete();
        virtual int onTimeout();
        virtual int onReadRetDataError();
        inline void nextStep();
        inline void resetStep();
        virtual void setRetDataDev(int dev, int size);
    public:
        int getReturnData(const char*& pszData);
    protected:
        HANDLE m_hWorkThreadHandle;
@@ -33,6 +39,12 @@
        char m_szBuffer[1024];
        int m_nWriteDataSize;
        int m_nWriteDevNo;
    protected:
        // return code or data
        char m_szReturnBuf[1024];
        int m_nReturnDataSize;
        int m_nReturnDevNo;
    };
}
SourceCode/Bond/Servo/Common.h
@@ -218,7 +218,7 @@
#define STEP_EQ_STORED_JOB15            _T("EQStoredJobReport15")
#define STEP_EQ_DISPATCHINT_MODE_CHANGE    _T("EQDispatchingModeChangeCommand")
#define STEP_EFEM_ROBOT_CMD                _T("EFEMRobotCmd")
#define STEP_EFEM_IN_OP_MODE_CHANGE        _T("EFEMIndexerOperationModeChangeCommand")
#define STEP_EQ_IN_OP_MODE_CHANGE        _T("EQIndexerOperationModeChangeCommand")
#define STEP_PORT1_TYPE_CHANGE            _T("Port1TypeChange")
#define STEP_PORT2_TYPE_CHANGE            _T("Port2TypeChange")
#define STEP_PORT3_TYPE_CHANGE            _T("Port3TypeChange")
SourceCode/Bond/Servo/ServoCommo.h
@@ -149,6 +149,13 @@
        BOOL armState[2];
    } ROBOT_MONITORING_DATA, RMDATA;
    /* 工艺(加工处理)状态 */
    enum class PROCESS_STATE {
        Ready = 0,
        Processing,
        Complete,
        Error
    };
    /* EQ Data changed code */
#define EDCC_FETCHOUT_JOB                1000    /* ȡƬ */