LAPTOP-SNT8I5JK\Boounion
2025-04-30 d38d98d99e873d0a48e75aa9f8472cff4574c132
1.添加CEqReadStep, 以后大部分读数据可能要使用这个类,可以简单程序。
2.文档;
已添加6个文件
已修改12个文件
1339 ■■■■■ 文件已修改
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 | 历史
SourceCode/Bond/Servo/CBonder.cpp 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadStep.cpp 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadStep.h 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqWriteStep.cpp 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqWriteStep.h 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 504 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
SourceCode/Bond/Servo/CBonder.cpp
@@ -5,7 +5,7 @@
namespace SERVO {
    CBonder::CBonder() : CEquipment()
    {
        m_nIndex = 0;
    }
    CBonder::~CBonder()
@@ -38,6 +38,203 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out"));
    }
    void CBonder::initSteps()
    {
        CEquipment::initSteps();
        {
            // eq mode
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x350 : 0x650);
            pStep->setModeDev(m_nIndex == 0 ? 0x9d7d : 0xdd7d);
            if (addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq status
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x351 : 0x651);
            pStep->setStatusDev(m_nIndex == 0 ? 0x9d59 : 0xdd59);
            if (addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Eq Alarm
            static char* pszName[] = { STEP_ALARM_BLOCK1, STEP_ALARM_BLOCK2, STEP_ALARM_BLOCK3, STEP_ALARM_BLOCK4, STEP_ALARM_BLOCK5 };
            static int dev[2][5] = { { 0x9f0e , 0x9f3b, 0x9f68, 0x9f95, 0x9fc2 },
                { 0xdf0e , 0xdf3b, 0xdf68, 0xdf95, 0xdfc2 } };
            static int writeSignalDev[2][5] = { { 0x352, 0x353, 0x354, 0x355, 0x356 },
                { 0x652, 0x653, 0x654, 0x655, 0x656 } };
            static int addr[] = { STEP_ID_EQALARM1, STEP_ID_EQALARM2, STEP_ID_EQALARM3, STEP_ID_EQALARM4, STEP_ID_EQALARM5 };
            for (int i = 0; i < 5; i++) {
                CEqAlarmStep* pStep = new CEqAlarmStep();
                pStep->setName(pszName[i]);
                pStep->setWriteSignalDev(writeSignalDev[m_nIndex][i]);
                pStep->setAlarmDev(dev[m_nIndex][i]);
                if (addStep(addr[i], pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // eq process
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x357 : 0x657);
            pStep->setProcessDev(m_nIndex == 0 ? 0xab55 : 0xeb55);
            if (addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq cim mode change
            CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
            pStep->setName(STEP_CIM_MODE_CHANGE);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x370 : 0x670);
            pStep->setCimModeDev(m_nIndex == 0 ? 0x965 : 0x12b5);
            if (addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq cim message cmd
            CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
            pStep->setName(STEP_CIM_MESSAGE_CMD);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x371 : 0x671);
            pStep->setCimMessageDev(m_nIndex == 0 ? 0x950 : 0x12a0);
            if (addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq current recipe change
            CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
            pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x348 : 0x648);
            pStep->setDataDev(m_nIndex == 0 ? 0xa850 : 0xe850);
            if (addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // CIM Message Confirm
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, m_nIndex == 0 ? 0x9d80 : 0xdd80);
            pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x359 : 0x659);
            if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
            pStep->setName(STEP_CIM_MESSAGE_CLEAR);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x372 : 0x672);
            pStep->setClearCimMessageDev(m_nIndex == 0 ? 0x963 : 0x12b3);
            if (addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
            pStep->setName(STEP_DATETIME_SET_CMD);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x373 : 0x673);
            pStep->setDateTimeDev(m_nIndex == 0 ? 0x966 : 0x12b6);
            if (addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x375 : 0x675);
            pStep->setEqModeDev(m_nIndex == 0 ? 0x96E : 0x12be);
            if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // è¯·æ±‚主配方列表的step
            CEqWriteStep* pStep = new CEqWriteStep();
            pStep->setName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x366 : 0x666);
            pStep->setDataDev(m_nIndex == 0 ? 0x125a : 0x1baa);
            if (addStep(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // master recipe list report
            CEqReadStep* pStep = new CEqReadStep(m_nIndex == 0 ? 0xa955 : 0xe955, 255 * 2,
                [&](int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        // æ­¤å¤„解释配方数据
                    }
                });
            pStep->setName(STEP_EQ_MASTER_RECIPE_LIST);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x34b : 0x64b);
            if (addStep(STEP_ID_MASTER_RECIPE_LIST_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_RECEIVED_JOB_UPS1);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x300 : 0x600);
            pStep->setJobDataDev(m_nIndex == 0 ? 0x8c90 : 0xcc90);
            if (addStep(STEP_ID_RECIVE_JOB_UPS1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_RECEIVED_JOB_UPS2);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x301 : 0x601);
            pStep->setJobDataDev(m_nIndex == 0 ? 0x8dd0 : 0xcdd0);
            if (addStep(STEP_ID_RECIVE_JOB_UPS2, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS1);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x310 : 0x610);
            pStep->setJobDataDev(m_nIndex == 0 ? 0x8000 : 0xc000);
            if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS2);
            pStep->setWriteSignalDev(m_nIndex == 0 ? 0x311 : 0x611);
            pStep->setJobDataDev(m_nIndex == 0 ? 0x8140 : 0xc140);
            if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS2, pStep) != 0) {
                delete pStep;
            }
        }
    }
    void CBonder::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
@@ -67,4 +264,14 @@
        return m_glassList.empty();
    }
    void CBonder::setIndex(unsigned int index)
    {
        m_nIndex = index;
    }
    unsigned int CBonder::getIndex()
    {
        return m_nIndex;
    }
}
SourceCode/Bond/Servo/CBonder.h
@@ -15,11 +15,19 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSteps();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int recvIntent(CPin* pPin, CIntent* pIntent);
        virtual BOOL glassWillArrive(CGlass* pGlass);
    public:
        void setIndex(unsigned int index);
        unsigned int getIndex();
    private:
        unsigned int m_nIndex;
    };
}
SourceCode/Bond/Servo/CEFEM.cpp
@@ -2,6 +2,16 @@
#include "CEFEM.h"
#define ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(name,ws,index,psd) {                \
    CEqCassetteTransferStateStep* pStep = new CEqCassetteTransferStateStep();    \
    pStep->setName(name);                                                        \
    pStep->setWriteSignalDev(ws);                                                \
    pStep->setPortStatusDev(psd);                                                \
    if (addStep(index, pStep) != 0) {                                            \
        delete pStep;                                                            \
    }                                                                            \
}
namespace SERVO {
    CEFEM::CEFEM() : CEquipment()
    {
@@ -46,6 +56,226 @@
        LOGI("<CEFEM>initPins");
    }
    void CEFEM::initSteps()
    {
        CEquipment::initSteps();
        {
            // Eq mode
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setWriteSignalDev(0x50);
            pStep->setModeDev(0x5d7d);
            if (addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Eq Status
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setWriteSignalDev(0x51);
            pStep->setStatusDev(0x5d59);
            if (addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Eq Alarm
            static char* pszName[] = { STEP_ALARM_BLOCK1, STEP_ALARM_BLOCK2, STEP_ALARM_BLOCK3, STEP_ALARM_BLOCK4, STEP_ALARM_BLOCK5 };
            static int dev[] = { 0x5f0e , 0x5f3b, 0x5f68, 0x5f95, 0x5fc2 };
            static int writeSignalDev[] = { 0x52, 0x53, 0x54, 0x55, 0x56 };
            static int addr[] = { STEP_ID_EQALARM1, STEP_ID_EQALARM2, STEP_ID_EQALARM3, STEP_ID_EQALARM4, STEP_ID_EQALARM5 };
            for (int i = 0; i < 5; i++) {
                CEqAlarmStep* pStep = new CEqAlarmStep();
                pStep->setName(pszName[i]);
                pStep->setWriteSignalDev(writeSignalDev[i]);
                pStep->setAlarmDev(dev[i]);
                if (addStep(addr[i], pStep) != 0) {
                    delete pStep;
                }
            }
        }
        {
            // eq process
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setWriteSignalDev(0x57);
            pStep->setProcessDev(0x6b55);
            if (addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq cim mode change
            CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
            pStep->setName(STEP_CIM_MODE_CHANGE);
            pStep->setWriteSignalDev(0x70);
            pStep->setCimModeDev(0x15);
            if (addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq cim message
            CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
            pStep->setName(STEP_CIM_MESSAGE_CMD);
            pStep->setWriteSignalDev(0x71);
            pStep->setCimMessageDev(0x0);
            if (addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // CIM Message Confirm
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5f80);
            pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
            pStep->setWriteSignalDev(0x59);
            if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // VCR1 Event Report
            CEqVcrEventStep* pStep = new CEqVcrEventStep();
            pStep->setName(STEP_EQ_VCR1_EVENT_REPORT);
            pStep->setWriteSignalDev(0x4a);
            pStep->setReturnDev(0x91e);
            pStep->setVcrEventReportDev(0x5fef);
            if (addStep(STEP_ID_VCR1_EVENT_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq cim message clear
            CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
            pStep->setName(STEP_CIM_MESSAGE_CLEAR);
            pStep->setWriteSignalDev(0x72);
            pStep->setClearCimMessageDev(0x13);
            if (addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // datetime set cmd
            CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
            pStep->setName(STEP_DATETIME_SET_CMD);
            pStep->setWriteSignalDev(0x73);
            pStep->setDateTimeDev(0x16);
            if (addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // vcr enable
            CEqVCREnableStep* pStep = new CEqVCREnableStep();
            pStep->setName(STEP_EQ_VCR_ENABLE);
            pStep->setWriteSignalDev(0x74);
            pStep->setEqVCRModeDev(0x1F);
            if (addStep(STEP_ID_VCR_ENABLE_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // eq mode change
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setWriteSignalDev(0x75);
            pStep->setEqModeDev(0x1E);
            if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // current recipe change
            CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
            pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
            pStep->setWriteSignalDev(0x48);
            pStep->setDataDev(0x6850);
            if (addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // è¯·æ±‚主配方列表的step
            CEqWriteStep* pStep = new CEqWriteStep();
            pStep->setName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
            pStep->setWriteSignalDev(0x66);
            pStep->setDataDev(0x90a);
            if (addStep(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        // CEqCassetteTranserStateStep
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_EMPTY, 0xd8,
            STEP_ID_PORT1_CASSETTIE_EMPTY, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOAD_EADY, 0xe0,
            STEP_ID_PORT1_CASSETTIE_LOAD_READY, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOADED, 0xe8,
            STEP_ID_PORT1_CASSETTIE_LOADED, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_INUSE, 0xf0,
            STEP_ID_PORT1_CASSETTIE_INUSE, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_UNLOAD_EADY, 0xf8,
            STEP_ID_PORT1_CASSETTIE_UNLOAD_READY, 0x60f50);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_BLOCKED, 0x100,
            STEP_ID_PORT1_CASSETTIE_BLOCKED, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_EMPTY, 0xd9,
            STEP_ID_PORT2_CASSETTIE_EMPTY, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOAD_EADY, 0xe1,
            STEP_ID_PORT2_CASSETTIE_LOAD_READY, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOADED, 0xe9,
            STEP_ID_PORT2_CASSETTIE_LOADED, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_INUSE, 0xf1,
            STEP_ID_PORT2_CASSETTIE_INUSE, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_UNLOAD_EADY, 0xf9,
            STEP_ID_PORT2_CASSETTIE_UNLOAD_READY, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_BLOCKED, 0x101,
            STEP_ID_PORT2_CASSETTIE_BLOCKED, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_EMPTY, 0xda,
            STEP_ID_PORT3_CASSETTIE_EMPTY, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOAD_EADY, 0xe2,
            STEP_ID_PORT3_CASSETTIE_LOAD_READY, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOADED, 0xea,
            STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_INUSE, 0xf2,
            STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_UNLOAD_EADY, 0xfa,
            STEP_ID_PORT3_CASSETTIE_UNLOAD_READY, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_BLOCKED, 0x102,
            STEP_ID_PORT3_CASSETTIE_BLOCKED, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_EMPTY, 0xdb,
            STEP_ID_PORT4_CASSETTIE_EMPTY, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOAD_EADY, 0xe3,
            STEP_ID_PORT4_CASSETTIE_LOAD_READY, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOADED, 0xeb,
            STEP_ID_PORT4_CASSETTIE_LOADED, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_INUSE, 0xf3,
            STEP_ID_PORT4_CASSETTIE_INUSE, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_UNLOAD_EADY, 0xfb,
            STEP_ID_PORT4_CASSETTIE_UNLOAD_READY, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_BLOCKED, 0x103,
            STEP_ID_PORT4_CASSETTIE_BLOCKED, 0x60b0);
    }
    int CEFEM::onStepEvent(CStep* pStep, int code)
    {
        int nRet = CEquipment::onStepEvent(pStep, code);
@@ -58,13 +288,6 @@
                if (id == STEP_ID_PORT1_CASSETTIE_EMPTY) {
                }
/*
    #define STEP_ID_PORT1_CASSETTIE_LOAD_READY        0x420
    #define STEP_ID_PORT1_CASSETTIE_LOADED            0x428
    #define STEP_ID_PORT1_CASSETTIE_INUSE            0x430
    #define STEP_ID_PORT1_CASSETTIE_UNLOAD_READY    0x438
    #define STEP_ID_PORT1_CASSETTIE_BLOCKED            0x440
*/
            }
        }
SourceCode/Bond/Servo/CEFEM.h
@@ -16,6 +16,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSteps();
        virtual int onStepEvent(CStep* pStep, int code);
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
SourceCode/Bond/Servo/CEqReadStep.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
#include "stdafx.h"
#include "CEqReadStep.h"
#include "Log.h"
namespace SERVO {
    CEqReadStep::CEqReadStep() : CReadStep()
    {
        m_nDataDev = 0;
        m_nReadSize = 0;
        m_onReadBlock = nullptr;
    }
    CEqReadStep::CEqReadStep(int dev, size_t readSize, ONREAD onReadBlock)
    {
        m_nDataDev = dev;
        m_nReadSize = readSize;
        m_onReadBlock = onReadBlock;
    }
    CEqReadStep::~CEqReadStep()
    {
    }
    void CEqReadStep::getAttributeVector(CAttributeVector& attrubutes)
    {
        CReadStep::getAttributeVector(attrubutes);
        std::string strTemp;
        attrubutes.addAttribute(new CAttribute("Dev",
            ("W" + CToolUnits::toHexString(m_nDataDev, strTemp)).c_str(), ""));
    }
    int CEqReadStep::onReadData()
    {
        CReadStep::onReadData();
        char szBuffer[READ_BUFFER_MAX];
        int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nDataDev,
            (long)min(READ_BUFFER_MAX, m_nReadSize), szBuffer);
        if (0 != nRet) {
            LOGI("<CEqReadStep>Read data error.");
            if (m_onReadBlock != nullptr) {
                m_onReadBlock(RERROR, nullptr, 0);
            }
            return -1;
        }
        LOGI("<CEqReadStep>read data succeed.");
        if (m_onReadBlock != nullptr) {
            m_onReadBlock(ROK, szBuffer, m_nReadSize);
        }
        return 0;
    }
    int CEqReadStep::onComplete()
    {
        CReadStep::onComplete();
        LOGI("<CEqReadStep> onComplete.");
        if (m_onReadBlock != nullptr) {
            m_onReadBlock(RCOMPLETE, nullptr, 0);
        }
        return 0;
    }
    int CEqReadStep::onTimeout()
    {
        CReadStep::onTimeout();
        LOGI("<CEqReadStep> onTimeout.");
        if (m_onReadBlock != nullptr) {
            m_onReadBlock(RTIMEOUT, nullptr, 0);
        }
        return 0;
    }
}
SourceCode/Bond/Servo/CEqReadStep.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
#pragma once
#include "CReadStep.h"
#include <functional>
#define READ_BUFFER_MAX        1024
#define ROK                0                    /* è¯»æ•°æ®OK */
#define RTIMEOUT        -1                    /* è¯»æ•°æ®è¶…æ—¶ */
#define RERROR            -2                    /* è¯»æ•°æ®å‡ºé”™ */
#define RCOMPLETE        1                    /* è¯»æ•°æ®æµç¨‹å®Œæˆ */
namespace SERVO {
    typedef std::function<int(int code, const char* pszData, size_t size)> ONREAD;
    class CEqReadStep : public CReadStep
    {
    public:
        CEqReadStep();
        CEqReadStep(int dev, size_t readSize, ONREAD onReadBlock);
        ~CEqReadStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int onReadData();
        virtual int onComplete();
        virtual int onTimeout();
    private:
        ONREAD m_onReadBlock;
        int m_nDataDev;
        size_t m_nReadSize;
    };
}
SourceCode/Bond/Servo/CEqWriteStep.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
#include "stdafx.h"
#include "CEqWriteStep.h"
namespace SERVO {
    CEqWriteStep::CEqWriteStep() : CWriteStep()
    {
        m_nDataDev = 0;
        m_onWritedBlock = nullptr;
    }
    CEqWriteStep::~CEqWriteStep()
    {
    }
    void CEqWriteStep::setDataDev(int nDev)
    {
        m_nDataDev = nDev;
    }
    int CEqWriteStep::writeShort(short value, ONWRITED onWritedBlock/* = nullptr*/)
    {
        m_onWritedBlock = onWritedBlock;
        return writeData(m_nDataDev, (const char*)&value, sizeof(short));
    }
    int CEqWriteStep::writeInt(int value, ONWRITED onWritedBlock/* = nullptr*/)
    {
        m_onWritedBlock = onWritedBlock;
        return writeData(m_nDataDev, (const char*)&value, sizeof(int));
    }
    int CEqWriteStep::writeDataEx(const char* pszData, int size, ONWRITED onWritedBlock/* = nullptr*/)
    {
        m_onWritedBlock = onWritedBlock;
        return writeData(m_nDataDev, pszData, size);
    }
    void CEqWriteStep::getAttributeVector(CAttributeVector& attrubutes)
    {
        CWriteStep::getAttributeVector(attrubutes);
        std::string strTemp;
        attrubutes.addAttribute(new CAttribute("Data Dev",
            ("W" + CToolUnits::toHexString(m_nDataDev, strTemp)).c_str(), ""));
    }
    int CEqWriteStep::onComplete()
    {
        if (m_onWritedBlock != nullptr) {
            m_onWritedBlock(WOK);
        }
        return 0;
    }
    int CEqWriteStep::onTimeout()
    {
        if (m_onWritedBlock != nullptr) {
            m_onWritedBlock(WTIMEOUT);
        }
        return 0;
    }
}
SourceCode/Bond/Servo/CEqWriteStep.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
#pragma once
#include "CWriteStep.h"
#include <functional>
#define WOK                0
#define WTIMEOUT        -1
namespace SERVO {
    typedef std::function<int(int code)> ONWRITED;
    class CEqWriteStep : public CWriteStep
    {
    public:
        CEqWriteStep();
        ~CEqWriteStep();
    public:
        void setDataDev(int nDev);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        int writeShort(short value, ONWRITED onWritedBlock = nullptr);
        int writeInt(int value, ONWRITED onWritedBlock = nullptr);
        int writeDataEx(const char* pszData, int size, ONWRITED onWritedBlock = nullptr);
        virtual int onComplete();
        virtual int onTimeout();
    private:
        int m_nDataDev;
        ONWRITED m_onWritedBlock;
    };
}
SourceCode/Bond/Servo/CEquipment.cpp
@@ -132,6 +132,7 @@
    void CEquipment::init()
    {
        initPins();
        initSteps();
        for (auto item : m_mapStep) {
            item.second->init();
        }
@@ -142,6 +143,11 @@
        for (auto item : m_mapStep) {
            item.second->term();
        }
    }
    void CEquipment::initSteps()
    {
    }
    void CEquipment::setID(int nID)
@@ -394,6 +400,9 @@
        // EQ mode change cmd reply
        CHECK_WRITE_STEP_SIGNAL(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pszData, size);
        // EQ Master recipe request cmd reply
        CHECK_WRITE_STEP_SIGNAL(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pszData, size);
        // CIM Message Confirm
        CHECK_READ_STEP_SIGNAL(STEP_ID_CIM_MSG_CONFIRM_REPORT, pszData, size);
@@ -869,4 +878,25 @@
        return pStep->setDateTime(year, month, day, hour, minute, second);
    }
    int CEquipment::masterRecipeListRequest(short unitNo)
    {
        SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
        if (pStep == nullptr) {
            return -1;
        }
        LOGI("<CEquipment-%s>正在请求单元<%d>主配方列表", m_strName.c_str(), unitNo);
        pStep->writeShort(unitNo, [&](int code) -> int {
            if (code == WOK) {
                LOGI("<CEquipment-%s>请求单元<%d>主配方列表成功,正在等待数据.", m_strName.c_str(), unitNo);
            }
            else {
                LOGI("<CEquipment-%s>请求单元<%d>主配方列表失败,code:%d", m_strName.c_str(), unitNo, code);
            }
            return 0;
        });
        return 0;
    }
}
SourceCode/Bond/Servo/CEquipment.h
@@ -20,6 +20,8 @@
#include "CEqJobEventStep.h"
#include "CEqVcrEventStep.h"
#include "CEqCurrentRecipeChangeStep.h"
#include "CEqWriteStep.h"
#include "CEqReadStep.h"
#include <vector>
#include <map>
#include <list>
@@ -94,6 +96,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins() = 0;
        virtual void initSteps();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void onReceiveLBData(const char* pszData, size_t size);
@@ -124,6 +127,11 @@
        int setCimMessage(const char* pszMessage, short id, short nTouchPanelNo);
        int clearCimMessage(short id, short nTouchPanelNo);
        int setDateTime(short year, short month, short day, short hour, short minute, short second);
        // è¯·æ±‚主配方列表
        // unitNo: 0:local; Others:unit No
        int masterRecipeListRequest(short unitNo);
    // ä»¥ä¸‹ä¸ºä»ŽCC-Link读取到的Bit标志位检测函数
    public:
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -53,6 +53,120 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out2"));
    }
    void CLoadPort::initSteps()
    {
        CEquipment::initSteps();
        ASSERT(m_nIndex == 0 || m_nIndex == 1 || m_nIndex == 2 || m_nIndex == 3);
        {
            // 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 int dev[] = { 0x45, 0x1a5, 0x305, 0x465 };
            static int addr[] = { 0x480, 0x481, 0x482, 0x483 };
            CEqCassetteCtrlCmdStep* pStep = new CEqCassetteCtrlCmdStep();
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            pStep->setCtrlCmdDev(dev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Type
            static char* pszName[] = { STEP_EQ_PORT1_TYPE, STEP_EQ_PORT2_TYPE, STEP_EQ_PORT3_TYPE, STEP_EQ_PORT4_TYPE };
            static int dev[] = { 0x6010 , 0x6020, 0x6030, 0x6040 };
            static int writeSignalDev[] = { 0xa0, 0xa1, 0xa2, 0xa3 };
            static int addr[] = { STEP_ID_PORT1_TYPE_CHANGE, STEP_ID_PORT2_TYPE_CHANGE, STEP_ID_PORT3_TYPE_CHANGE, STEP_ID_PORT4_TYPE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Mode
            static char* pszName[] = { STEP_EQ_PORT1_MODE, STEP_EQ_PORT2_MODE, STEP_EQ_PORT3_MODE, STEP_EQ_PORT4_MODE };
            static int dev[] = { 0x6011, 0x6021, 0x6031, 0x6041 };
            static int writeSignalDev[] = { 0xa8, 0xa9, 0xaa, 0xab };
            static int addr[] = { STEP_ID_PORT1_MODE_CHANGE, STEP_ID_PORT2_MODE_CHANGE, STEP_ID_PORT3_MODE_CHANGE, STEP_ID_PORT4_MODE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Cassette type
            static char* pszName[] = { STEP_EQ_PORT1_CASSETTE_TYPE, STEP_EQ_PORT2_CASSETTE_TYPE, STEP_EQ_PORT3_CASSETTE_TYPE, STEP_EQ_PORT4_CASSETTE_TYPE };
            static int dev[] = { 0x6012, 0x6022, 0x6032, 0x6042 };
            static int writeSignalDev[] = { 0xb0, 0xb1, 0xb2, 0xb3 };
            static int addr[] = { STEP_ID_PORT1_CASSETTE_TYPE_CHANGE, STEP_ID_PORT2_CASSETTE_TYPE_CHANGE, STEP_ID_PORT3_CASSETTE_TYPE_CHANGE, STEP_ID_PORT4_CASSETTE_TYPE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Transfer type
            static char* pszName[] = { STEP_EQ_PORT1_TRANSFER_MODE, STEP_EQ_PORT2_TRANSFER_MODE, STEP_EQ_PORT3_TRANSFER_MODE, STEP_EQ_PORT4_TRANSFER_MODE };
            static int dev[] = { 0x6014, 0x6024, 0x6034, 0x6044 };
            static int writeSignalDev[] = { 0xb8, 0xb9, 0xba, 0xbb };
            static int addr[] = { STEP_ID_PORT1_TRANSFER_MODE_CHANGE, STEP_ID_PORT2_TRANSFER_MODE_CHANGE, STEP_ID_PORT3_TRANSFER_MODE_CHANGE, STEP_ID_PORT4_TRANSFER_MODE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Port enable
            static char* pszName[] = { STEP_EQ_PORT1_ENABLE, STEP_EQ_PORT2_ENABLE, STEP_EQ_PORT3_ENABLE, STEP_EQ_PORT4_ENABLE };
            static int dev[] = { 0x6015, 0x6025, 0x6035, 0x6045 };
            static int writeSignalDev[] = { 0xc0, 0xc1, 0xc2, 0xc3 };
            static int addr[] = { STEP_ID_PORT1_ENABLE_MODE_CHANGE, STEP_ID_PORT2_ENABLE_MODE_CHANGE, STEP_ID_PORT3_ENABLE_MODE_CHANGE, STEP_ID_PORT4_ENABLE_MODE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Type auto change
            char* pszName[] = { STEP_EQ_PORT1_TYPE_ATUO, STEP_EQ_PORT2_TYPE_ATUO, STEP_EQ_PORT3_TYPE_ATUO, STEP_EQ_PORT4_TYPE_ATUO };
            static int dev[] = { 0x6016, 0x6026, 0x6036, 0x6046 };
            static int writeSignalDev[] = { 0xc8, 0xc9, 0xca, 0xcb };
            static int addr[] = { STEP_ID_PORT1_TYPE_AUTO_CHANGE, STEP_ID_PORT2_TYPE_AUTO_CHANGE, STEP_ID_PORT3_TYPE_AUTO_CHANGE, STEP_ID_PORT4_TYPE_AUTO_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
            pStep->setName(pszName[m_nIndex]);
            pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
            if (addStep(addr[m_nIndex], pStep) != 0) {
                delete pStep;
            }
        }
    }
    void CLoadPort::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CLoadPort.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSteps();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CMaster.cpp
@@ -3,16 +3,6 @@
#include "CMaster.h"
#define ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(name,ws,index,psd) {                \
    CEqCassetteTransferStateStep* pStep = new CEqCassetteTransferStateStep();    \
    pStep->setName(name);                                                        \
    pStep->setWriteSignalDev(ws);                                                \
    pStep->setPortStatusDev(psd);                                                \
    if (pEquipment->addStep(index, pStep) != 0) {                                \
        delete pStep;                                                            \
    }                                                                            \
}
namespace SERVO {
    CMaster* g_pMaster = NULL;
@@ -246,15 +236,6 @@
    CLoadPort* CMaster::addLoadPort(int index)
    {
        ASSERT(index == 0 || index == 1 || index == 2 || index == 3);
        static char* pszCassetteCtrlCmd[] = {
            STEP_EQ_P1_CASSETTE_CTRL_CMD,
            STEP_EQ_P2_CASSETTE_CTRL_CMD,
            STEP_EQ_P3_CASSETTE_CTRL_CMD,
            STEP_EQ_P4_CASSETTE_CTRL_CMD
        };
        int nWriteSignalDev[] = {0x120, 0x121, 0x122, 0x123};
        int nCtrlCmdDev[] = {0x45, 0x1a5, 0x305, 0x465};
        int nStepDev[] = { 0x480, 0x481, 0x482, 0x483 };
        char szName[64];
@@ -265,109 +246,6 @@
        pEquipment->setName(szName);
        pEquipment->setDescription(szName);
        addToEquipmentList(pEquipment);
        // step
        {
            CEqCassetteCtrlCmdStep* pStep = new CEqCassetteCtrlCmdStep();
            pStep->setName(pszCassetteCtrlCmd[index]);
            pStep->setWriteSignalDev(nWriteSignalDev[index]);
            pStep->setCtrlCmdDev(nCtrlCmdDev[index]);
            if (pEquipment->addStep(nStepDev[index], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Type
            char* pszName[] = { STEP_EQ_PORT1_TYPE, STEP_EQ_PORT2_TYPE, STEP_EQ_PORT3_TYPE, STEP_EQ_PORT4_TYPE };
            int dev[] = { 0x6010 , 0x6020, 0x6030, 0x6040 };
            int writeSignalDev[] = { 0xa0, 0xa1, 0xa2, 0xa3 };
            int addr[] = { STEP_ID_PORT1_TYPE_CHANGE, STEP_ID_PORT2_TYPE_CHANGE, STEP_ID_PORT3_TYPE_CHANGE, STEP_ID_PORT4_TYPE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
            pStep->setName(pszName[index]);
            pStep->setWriteSignalDev(writeSignalDev[index]);
            if (pEquipment->addStep(addr[index], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Mode
            char* pszName[] = { STEP_EQ_PORT1_MODE, STEP_EQ_PORT2_MODE, STEP_EQ_PORT3_MODE, STEP_EQ_PORT4_MODE };
            int dev[] = { 0x6011, 0x6021, 0x6031, 0x6041};
            int writeSignalDev[] = { 0xa8, 0xa9, 0xaa, 0xab };
            int addr[] = { STEP_ID_PORT1_MODE_CHANGE, STEP_ID_PORT2_MODE_CHANGE, STEP_ID_PORT3_MODE_CHANGE, STEP_ID_PORT4_MODE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
            pStep->setName(pszName[index]);
            pStep->setWriteSignalDev(writeSignalDev[index]);
            if (pEquipment->addStep(addr[index], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Cassette type
            char* pszName[] = { STEP_EQ_PORT1_CASSETTE_TYPE, STEP_EQ_PORT2_CASSETTE_TYPE, STEP_EQ_PORT3_CASSETTE_TYPE, STEP_EQ_PORT4_CASSETTE_TYPE };
            int dev[] = { 0x6012, 0x6022, 0x6032, 0x6042 };
            int writeSignalDev[] = { 0xb0, 0xb1, 0xb2, 0xb3 };
            int addr[] = { STEP_ID_PORT1_CASSETTE_TYPE_CHANGE, STEP_ID_PORT2_CASSETTE_TYPE_CHANGE, STEP_ID_PORT3_CASSETTE_TYPE_CHANGE, STEP_ID_PORT4_CASSETTE_TYPE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
            pStep->setName(pszName[index]);
            pStep->setWriteSignalDev(writeSignalDev[index]);
            if (pEquipment->addStep(addr[index], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Transfer type
            char* pszName[] = { STEP_EQ_PORT1_TRANSFER_MODE, STEP_EQ_PORT2_TRANSFER_MODE, STEP_EQ_PORT3_TRANSFER_MODE, STEP_EQ_PORT4_TRANSFER_MODE };
            int dev[] = { 0x6014, 0x6024, 0x6034, 0x6044 };
            int writeSignalDev[] = { 0xb8, 0xb9, 0xba, 0xbb };
            int addr[] = { STEP_ID_PORT1_TRANSFER_MODE_CHANGE, STEP_ID_PORT2_TRANSFER_MODE_CHANGE, STEP_ID_PORT3_TRANSFER_MODE_CHANGE, STEP_ID_PORT4_TRANSFER_MODE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
            pStep->setName(pszName[index]);
            pStep->setWriteSignalDev(writeSignalDev[index]);
            if (pEquipment->addStep(addr[index], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Port enable
            char* pszName[] = { STEP_EQ_PORT1_ENABLE, STEP_EQ_PORT2_ENABLE, STEP_EQ_PORT3_ENABLE, STEP_EQ_PORT4_ENABLE };
            int dev[] = { 0x6015, 0x6025, 0x6035, 0x6045 };
            int writeSignalDev[] = { 0xc0, 0xc1, 0xc2, 0xc3 };
            int addr[] = { STEP_ID_PORT1_ENABLE_MODE_CHANGE, STEP_ID_PORT2_ENABLE_MODE_CHANGE, STEP_ID_PORT3_ENABLE_MODE_CHANGE, STEP_ID_PORT4_ENABLE_MODE_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
            pStep->setName(pszName[index]);
            pStep->setWriteSignalDev(writeSignalDev[index]);
            if (pEquipment->addStep(addr[index], pStep) != 0) {
                delete pStep;
            }
        }
        {
            // Type auto change
            char* pszName[] = { STEP_EQ_PORT1_TYPE_ATUO, STEP_EQ_PORT2_TYPE_ATUO, STEP_EQ_PORT3_TYPE_ATUO, STEP_EQ_PORT4_TYPE_ATUO };
            int dev[] = { 0x6016, 0x6026, 0x6036, 0x6046 };
            int writeSignalDev[] = { 0xc8, 0xc9, 0xca, 0xcb };
            int addr[] = { STEP_ID_PORT1_TYPE_AUTO_CHANGE, STEP_ID_PORT2_TYPE_AUTO_CHANGE, STEP_ID_PORT3_TYPE_AUTO_CHANGE, STEP_ID_PORT4_TYPE_AUTO_CHANGE };
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
            pStep->setName(pszName[index]);
            pStep->setWriteSignalDev(writeSignalDev[index]);
            if (pEquipment->addStep(addr[index], pStep) != 0) {
                delete pStep;
            }
        }
        pEquipment->init();
@@ -440,213 +318,6 @@
        addToEquipmentList(pEquipment);
        // æ·»åŠ  step
        {
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setWriteSignalDev(0x50);
            pStep->setModeDev(0x5d7d);
            if (pEquipment->addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setWriteSignalDev(0x51);
            pStep->setStatusDev(0x5d59);
            if (pEquipment->addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK1);
            pStep->setWriteSignalDev(0x52);
            pStep->setAlarmDev(0x5f0e);
            if (pEquipment->addStep(STEP_ID_EQALARM1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK2);
            pStep->setWriteSignalDev(0x53);
            pStep->setAlarmDev(0x5f3b);
            if (pEquipment->addStep(STEP_ID_EQALARM2, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK3);
            pStep->setWriteSignalDev(0x54);
            pStep->setAlarmDev(0x5f68);
            if (pEquipment->addStep(STEP_ID_EQALARM3, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK4);
            pStep->setWriteSignalDev(0x55);
            pStep->setAlarmDev(0x5f95);
            if (pEquipment->addStep(STEP_ID_EQALARM4, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK5);
            pStep->setWriteSignalDev(0x56);
            pStep->setAlarmDev(0x5fc2);
            if (pEquipment->addStep(STEP_ID_EQALARM5, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setWriteSignalDev(0x57);
            pStep->setProcessDev(0x6b55);
            if (pEquipment->addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
            pStep->setName(STEP_CIM_MODE_CHANGE);
            pStep->setWriteSignalDev(0x70);
            pStep->setCimModeDev(0x15);
            if (pEquipment->addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
            pStep->setName(STEP_CIM_MESSAGE_CMD);
            pStep->setWriteSignalDev(0x71);
            pStep->setCimMessageDev(0x0);
            if (pEquipment->addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // CIM Message Confirm
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5f80);
            pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
            pStep->setWriteSignalDev(0x59);
            if (pEquipment->addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // VCR1 Event Report
            CEqVcrEventStep* pStep = new CEqVcrEventStep();
            pStep->setName(STEP_EQ_VCR1_EVENT_REPORT);
            pStep->setWriteSignalDev(0x4a);
            pStep->setReturnDev(0x91e);
            pStep->setVcrEventReportDev(0x5fef);
            if (pEquipment->addStep(STEP_ID_VCR1_EVENT_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
            pStep->setName(STEP_CIM_MESSAGE_CLEAR);
            pStep->setWriteSignalDev(0x72);
            pStep->setClearCimMessageDev(0x13);
            if (pEquipment->addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
            pStep->setName(STEP_DATETIME_SET_CMD);
            pStep->setWriteSignalDev(0x73);
            pStep->setDateTimeDev(0x16);
            if (pEquipment->addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqVCREnableStep* pStep = new CEqVCREnableStep();
            pStep->setName(STEP_EQ_VCR_ENABLE);
            pStep->setWriteSignalDev(0x74);
            pStep->setEqVCRModeDev(0x1F);
            if (pEquipment->addStep(STEP_ID_VCR_ENABLE_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setWriteSignalDev(0x75);
            pStep->setEqModeDev(0x1E);
            if (pEquipment->addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
            pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
            pStep->setWriteSignalDev(0x48);
            pStep->setDataDev(0x6850);
            if (pEquipment->addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        // CEqCassetteTranserStateStep
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_EMPTY, 0xd8,
            STEP_ID_PORT1_CASSETTIE_EMPTY, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOAD_EADY, 0xe0,
            STEP_ID_PORT1_CASSETTIE_LOAD_READY, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOADED, 0xe8,
            STEP_ID_PORT1_CASSETTIE_LOADED, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_INUSE, 0xf0,
            STEP_ID_PORT1_CASSETTIE_INUSE, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_UNLOAD_EADY, 0xf8,
            STEP_ID_PORT1_CASSETTIE_UNLOAD_READY, 0x60f50);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_BLOCKED, 0x100,
            STEP_ID_PORT1_CASSETTIE_BLOCKED, 0x6050);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_EMPTY, 0xd9,
            STEP_ID_PORT2_CASSETTIE_EMPTY, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOAD_EADY, 0xe1,
            STEP_ID_PORT2_CASSETTIE_LOAD_READY, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOADED, 0xe9,
            STEP_ID_PORT2_CASSETTIE_LOADED, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_INUSE, 0xf1,
            STEP_ID_PORT2_CASSETTIE_INUSE, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_UNLOAD_EADY, 0xf9,
            STEP_ID_PORT2_CASSETTIE_UNLOAD_READY, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_BLOCKED, 0x101,
            STEP_ID_PORT2_CASSETTIE_BLOCKED, 0x6070);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_EMPTY, 0xda,
            STEP_ID_PORT3_CASSETTIE_EMPTY, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOAD_EADY, 0xe2,
            STEP_ID_PORT3_CASSETTIE_LOAD_READY, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOADED, 0xea,
            STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_INUSE, 0xf2,
            STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_UNLOAD_EADY, 0xfa,
            STEP_ID_PORT3_CASSETTIE_UNLOAD_READY, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_BLOCKED, 0x102,
            STEP_ID_PORT3_CASSETTIE_BLOCKED, 0x6090);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_EMPTY, 0xdb,
            STEP_ID_PORT4_CASSETTIE_EMPTY, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOAD_EADY, 0xe3,
            STEP_ID_PORT4_CASSETTIE_LOAD_READY, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOADED, 0xeb,
            STEP_ID_PORT4_CASSETTIE_LOADED, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_INUSE, 0xf3,
            STEP_ID_PORT4_CASSETTIE_INUSE, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_UNLOAD_EADY, 0xfb,
            STEP_ID_PORT4_CASSETTIE_UNLOAD_READY, 0x60b0);
        ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_BLOCKED, 0x103,
            STEP_ID_PORT4_CASSETTIE_BLOCKED, 0x60b0);
        pEquipment->init();
        LOGE("已添加“EFEM(ROBOT)”.");
@@ -667,181 +338,8 @@
        pEquipment->setStation(0, 255);
        pEquipment->setReadBitBlock(index == 0 ? 0x3b00 : 0x4600,
            index == 0 ? 0x5600 : 0x6100);
        pEquipment->setIndex(index);
        addToEquipmentList(pEquipment);
        // æ·»åŠ  step
        {
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setWriteSignalDev(index == 0 ? 0x350 : 0x650);
            pStep->setModeDev(index == 0 ? 0x9d7d : 0xdd7d);
            if (pEquipment->addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setWriteSignalDev(index == 0 ? 0x351 : 0x651);
            pStep->setStatusDev(index == 0 ? 0x9d59 : 0xdd59);
            if (pEquipment->addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK1);
            pStep->setWriteSignalDev(index == 0 ? 0x352 : 0x652);
            pStep->setAlarmDev(index == 0 ? 0x9f0e : 0xdf0e);
            if (pEquipment->addStep(STEP_ID_EQALARM1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK2);
            pStep->setWriteSignalDev(index == 0 ? 0x353 : 0x653);
            pStep->setAlarmDev(index == 0 ? 0x9f3b : 0xdf3b);
            if (pEquipment->addStep(STEP_ID_EQALARM2, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK3);
            pStep->setWriteSignalDev(index == 0 ? 0x354 : 0x654);
            pStep->setAlarmDev(index == 0 ? 0x9f68 : 0xdf68);
            if (pEquipment->addStep(STEP_ID_EQALARM3, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK4);
            pStep->setWriteSignalDev(index == 0 ? 0x355 : 0x655);
            pStep->setAlarmDev(index == 0 ? 0x9f95 : 0xdf95);
            if (pEquipment->addStep(STEP_ID_EQALARM4, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK5);
            pStep->setWriteSignalDev(index == 0 ? 0x356 : 0x656);
            pStep->setAlarmDev(index == 0 ? 0x9fc2 : 0xdfc2);
            if (pEquipment->addStep(STEP_ID_EQALARM5, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setWriteSignalDev(index == 0 ? 0x357 : 0x657);
            pStep->setProcessDev(index == 0 ? 0xab55 : 0xeb55);
            if (pEquipment->addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
            pStep->setName(STEP_CIM_MODE_CHANGE);
            pStep->setWriteSignalDev(index == 0 ? 0x370 : 0x670);
            pStep->setCimModeDev(index == 0 ? 0x965 : 0x12b5);
            if (pEquipment->addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
            pStep->setName(STEP_CIM_MESSAGE_CMD);
            pStep->setWriteSignalDev(index == 0 ? 0x371 : 0x671);
            pStep->setCimMessageDev(index == 0 ? 0x950 : 0x12a0);
            if (pEquipment->addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
            pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
            pStep->setWriteSignalDev(index == 0 ? 0x348 : 0x648);
            pStep->setDataDev(index == 0 ? 0xa850 : 0xe850);
            if (pEquipment->addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            // CIM Message Confirm
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, index == 0 ? 0x9d80 : 0xdd80);
            pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
            pStep->setWriteSignalDev(index == 0 ? 0x359 : 0x659);
            if (pEquipment->addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
            pStep->setName(STEP_CIM_MESSAGE_CLEAR);
            pStep->setWriteSignalDev(index == 0 ? 0x372 : 0x672);
            pStep->setClearCimMessageDev(index == 0 ? 0x963 : 0x12b3);
            if (pEquipment->addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
            pStep->setName(STEP_DATETIME_SET_CMD);
            pStep->setWriteSignalDev(index == 0 ? 0x373 : 0x673);
            pStep->setDateTimeDev(index == 0 ? 0x966 : 0x12b6);
            if (pEquipment->addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setWriteSignalDev(index == 0 ? 0x375 : 0x675);
            pStep->setEqModeDev(index == 0 ? 0x96E : 0x12be);
            if (pEquipment->addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_RECEIVED_JOB_UPS1);
            pStep->setWriteSignalDev(index == 0 ? 0x300 : 0x600);
            pStep->setJobDataDev(index == 0 ? 0x8c90 : 0xcc90);
            if (pEquipment->addStep(STEP_ID_RECIVE_JOB_UPS1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_RECEIVED_JOB_UPS2);
            pStep->setWriteSignalDev(index == 0 ? 0x301 : 0x601);
            pStep->setJobDataDev(index == 0 ? 0x8dd0 : 0xcdd0);
            if (pEquipment->addStep(STEP_ID_RECIVE_JOB_UPS2, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS1);
            pStep->setWriteSignalDev(index == 0 ? 0x310 : 0x610);
            pStep->setJobDataDev(index == 0 ? 0x8000 : 0xc000);
            if (pEquipment->addStep(STEP_ID_SENT_OUT_JOB_DOWNS1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqJobEventStep* pStep = new CEqJobEventStep();
            pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS2);
            pStep->setWriteSignalDev(index == 0 ? 0x311 : 0x611);
            pStep->setJobDataDev(index == 0 ? 0x8140 : 0xc140);
            if (pEquipment->addStep(STEP_ID_SENT_OUT_JOB_DOWNS2, pStep) != 0) {
                delete pStep;
            }
        }
        pEquipment->init();
SourceCode/Bond/Servo/Common.h
@@ -139,6 +139,8 @@
#define STEP_EQ_SENT_OUT_JOB_DOWNS2        _T("EQJESentOutJobDowns2")
#define STEP_EQ_VCR1_EVENT_REPORT        _T("EQVcr1EventReport")
#define STEP_EQ_RURRENT_RECIPE_CHANGE    _T("EQCurrentRecipeChange")
#define STEP_EQ_MASTER_RECIPE_LIST_REQ    _T("EQMasterRecipeListReq")
#define STEP_EQ_MASTER_RECIPE_LIST        _T("EQMasterRecipeListReport")
/* Step ID */
@@ -148,6 +150,7 @@
#define STEP_ID_DATETIME_SET_CMD_REPLY            0x553
#define STEP_ID_VCR_ENABLE_CMD_REPLY            0x554
#define STEP_ID_EQMODE_CHANGE_CMD_REPLY            0x555
#define STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY    0x556
#define STEP_ID_EQMODE_CHANGED                    0x560
#define STEP_ID_EQSTATUS_CHANGED                0x561
#define STEP_ID_EQALARM1                        0x562
@@ -159,6 +162,7 @@
#define STEP_ID_CURRENT_RECIPE_CHANGE_REPORT    0x568
#define STEP_ID_CIM_MSG_CONFIRM_REPORT            0x569
#define STEP_ID_VCR1_EVENT_REPORT                0x56A
#define STEP_ID_MASTER_RECIPE_LIST_REPORT        0x56B
#define STEP_ID_RECIVE_JOB_UPS1                    0x580
#define STEP_ID_RECIVE_JOB_UPS2                    0x581
#define STEP_ID_SENT_OUT_JOB_DOWNS1                0x590
SourceCode/Bond/Servo/Servo.vcxproj
@@ -219,11 +219,13 @@
    <ClInclude Include="CEqPortChangeStep.h" />
    <ClInclude Include="CEqProcessStep.h" />
    <ClInclude Include="CEqReadIntStep.h" />
    <ClInclude Include="CEqReadStep.h" />
    <ClInclude Include="CEqStatusStep.h" />
    <ClInclude Include="CEquipmentPage1.h" />
    <ClInclude Include="CEquipmentPage2.h" />
    <ClInclude Include="CEqVCREnableStep.h" />
    <ClInclude Include="CEqVcrEventStep.h" />
    <ClInclude Include="CEqWriteStep.h" />
    <ClInclude Include="CFliper.h" />
    <ClInclude Include="CGlass.h" />
    <ClInclude Include="CHMPropertyDlg.h" />
@@ -306,11 +308,13 @@
    <ClCompile Include="CEqPortChangeStep.cpp" />
    <ClCompile Include="CEqProcessStep.cpp" />
    <ClCompile Include="CEqReadIntStep.cpp" />
    <ClCompile Include="CEqReadStep.cpp" />
    <ClCompile Include="CEqStatusStep.cpp" />
    <ClCompile Include="CEquipmentPage1.cpp" />
    <ClCompile Include="CEquipmentPage2.cpp" />
    <ClCompile Include="CEqVCREnableStep.cpp" />
    <ClCompile Include="CEqVcrEventStep.cpp" />
    <ClCompile Include="CEqWriteStep.cpp" />
    <ClCompile Include="CFliper.cpp" />
    <ClCompile Include="CGlass.cpp" />
    <ClCompile Include="CHMPropertyDlg.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -93,6 +93,8 @@
    <ClCompile Include="CEqVcrEventStep.cpp" />
    <ClCompile Include="CPagePortProperty.cpp" />
    <ClCompile Include="CEqCurrentRecipeChangeStep.cpp" />
    <ClCompile Include="CEqWriteStep.cpp" />
    <ClCompile Include="CEqReadStep.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -184,6 +186,8 @@
    <ClInclude Include="CEqVcrEventStep.h" />
    <ClInclude Include="CPagePortProperty.h" />
    <ClInclude Include="CEqCurrentRecipeChangeStep.h" />
    <ClInclude Include="CEqWriteStep.h" />
    <ClInclude Include="CEqReadStep.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />