已添加4个文件
已修改60个文件
815 ■■■■ 文件已修改
SourceCode/Bond/Servo/CAligner.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CAligner.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArm.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArm.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArmTray.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CArmTray.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CAttribute.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CAttributeVector.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBakeCooling.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBakeCooling.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.cpp 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqAlarmStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCassetteCtrlCmdStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCassetteTransferStateStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCimMessageClearStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCimMessageCmdStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCimModeChangeStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCurrentRecipeChangeStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqDateTimeSetCmdStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqJobEventStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqModeChangeStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqModeStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqPortChangeStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqProcessStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadIntStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqStatusStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqVCREnableStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqVcrEventStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqWriteStep.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CFliper.cpp 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CFliper.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CGlassPool.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CJobDataA.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CJobDataB.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CJobDataC.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CJobDataS.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.h 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMeasurement.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMeasurement.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPagePortProperty.cpp 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPath.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPortStatusReport.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CProcessData.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.cpp 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.h 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CSlot.cpp 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CSlot.h 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CVacuumBake.cpp 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CVacuumBake.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CVcrEventReport.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoCommo.h 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ToolUnits.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CAligner.cpp
@@ -39,6 +39,15 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out2"));
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CAligner::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1");
    }
    void CAligner::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CAligner.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CArm.cpp
@@ -34,6 +34,12 @@
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CArm::initSlots()
    {
    }
    void CArm::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CArm.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CArmTray.cpp
@@ -34,6 +34,15 @@
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CArmTray::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1");
    }
    void CArmTray::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CArmTray.h
@@ -14,6 +14,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CAttribute.h
@@ -7,7 +7,7 @@
    public:
        CAttribute();
        CAttribute(const char* pszName, const char* pszValue, const char* pszDescription, unsigned int weight);
        ~CAttribute();
        virtual ~CAttribute();
    public:
        std::string& getName();
SourceCode/Bond/Servo/CAttributeVector.h
@@ -8,7 +8,7 @@
    {
    public:
        CAttributeVector();
        ~CAttributeVector();
        virtual ~CAttributeVector();
    public:
        void addAttribute(CAttribute* pAttribute, BOOL bReplace = FALSE);
SourceCode/Bond/Servo/CBakeCooling.cpp
@@ -38,6 +38,15 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out"));
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CBakeCooling::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1");
    }
    void CBakeCooling::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CBakeCooling.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CBonder.cpp
@@ -336,6 +336,21 @@
        }
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CBonder::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1(G1)");
        m_slot[0].setType(MaterialsType::G1);
        m_slot[1].enable();
        m_slot[1].setPosition(m_nID);
        m_slot[1].setNo(2);
        m_slot[1].setName("Slot 2(G2)");
        m_slot[1].setType(MaterialsType::G2);
    }
    void CBonder::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CBonder.h
@@ -16,6 +16,7 @@
        virtual void term();
        virtual void initPins();
        virtual void initSteps();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEFEM.cpp
@@ -628,6 +628,12 @@
        }
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CEFEM::initSlots()
    {
    }
    void CEFEM::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CEFEM.h
@@ -20,6 +20,7 @@
        virtual void term();
        virtual void initPins();
        virtual void initSteps();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqAlarmStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqAlarmStep();
        ~CEqAlarmStep();
        virtual ~CEqAlarmStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqCassetteCtrlCmdStep.h
@@ -8,7 +8,7 @@
    {
    public:
        CEqCassetteCtrlCmdStep();
        ~CEqCassetteCtrlCmdStep();
        virtual ~CEqCassetteCtrlCmdStep();
    public:
        void setCtrlCmdDev(int nDev);
SourceCode/Bond/Servo/CEqCassetteTransferStateStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqCassetteTransferStateStep();
        ~CEqCassetteTransferStateStep();
        virtual ~CEqCassetteTransferStateStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqCimMessageClearStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqCimMessageClearStep();
        ~CEqCimMessageClearStep();
        virtual ~CEqCimMessageClearStep();
    public:
        void setClearCimMessageDev(int nDev);
SourceCode/Bond/Servo/CEqCimMessageCmdStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqCimMessageCmdStep();
        ~CEqCimMessageCmdStep();
        virtual ~CEqCimMessageCmdStep();
    public:
        void setCimMessageDev(int nDev);
SourceCode/Bond/Servo/CEqCimModeChangeStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqCimModeChangeStep();
        ~CEqCimModeChangeStep();
        virtual ~CEqCimModeChangeStep();
    public:
        void setCimModeDev(int nDev);
SourceCode/Bond/Servo/CEqCurrentRecipeChangeStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqCurrentRecipeChangeStep();
        ~CEqCurrentRecipeChangeStep();
        virtual ~CEqCurrentRecipeChangeStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqDateTimeSetCmdStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqDateTimeSetCmdStep();
        ~CEqDateTimeSetCmdStep();
        virtual ~CEqDateTimeSetCmdStep();
    public:
        void setDateTimeDev(int nDev);
SourceCode/Bond/Servo/CEqJobEventStep.h
@@ -8,7 +8,7 @@
    {
    public:
        CEqJobEventStep();
        ~CEqJobEventStep();
        virtual ~CEqJobEventStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqModeChangeStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqModeChangeStep();
        ~CEqModeChangeStep();
        virtual ~CEqModeChangeStep();
    public:
        void setEqModeDev(int nDev);
SourceCode/Bond/Servo/CEqModeStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqModeStep();
        ~CEqModeStep();
        virtual ~CEqModeStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqPortChangeStep.h
@@ -6,7 +6,7 @@
    {
    public:
        CEqPortChangeStep();
        ~CEqPortChangeStep();
        virtual ~CEqPortChangeStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqProcessStep.h
@@ -8,7 +8,7 @@
    {
    public:
        CEqProcessStep();
        ~CEqProcessStep();
        virtual ~CEqProcessStep();
    public:
        void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqReadIntStep.h
@@ -11,7 +11,7 @@
    public:
        CEqReadIntStep();
        CEqReadIntStep(int dataType, int dev);
        ~CEqReadIntStep();
        virtual ~CEqReadIntStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqReadStep.h
@@ -18,7 +18,7 @@
    public:
        CEqReadStep();
        CEqReadStep(int dev, size_t readSize, ONREAD onReadBlock);
        ~CEqReadStep();
        virtual ~CEqReadStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqStatusStep.h
@@ -10,7 +10,7 @@
    {
    public:
        CEqStatusStep();
        ~CEqStatusStep();
        virtual ~CEqStatusStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqVCREnableStep.h
@@ -7,7 +7,7 @@
    {
    public:
        CEqVCREnableStep();
        ~CEqVCREnableStep();
        virtual ~CEqVCREnableStep();
    public:
        void setEqVCRModeDev(int nDev);
SourceCode/Bond/Servo/CEqVcrEventStep.h
@@ -8,7 +8,7 @@
    {
    public:
        CEqVcrEventStep();
        ~CEqVcrEventStep();
        virtual ~CEqVcrEventStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CEqWriteStep.h
@@ -13,7 +13,7 @@
    {
    public:
        CEqWriteStep();
        ~CEqWriteStep();
        virtual ~CEqWriteStep();
    public:
        void setDataDev(int nDev);
SourceCode/Bond/Servo/CEquipment.cpp
@@ -1099,7 +1099,7 @@
            return -1;
        }
        unsigned short operationMode = (unsigned short)(mode + getIndexerOperationModeBaseValue());
        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);
@@ -1170,6 +1170,54 @@
        return 0;
    }
    CSlot* CEquipment::getAvailableSlot()
    {
        for (int i = 0; i < SLOT_MAX; i++) {
            if (!m_slot[i].isEnable()) continue;
            if (m_slot[i].isLock()) continue;
            if (!m_slot[i].isEmpty()) continue;
            return &m_slot[i];
        }
        return nullptr;
    }
    CSlot* CEquipment::getEmptySlot(MaterialsType type)
    {
        for (int i = 0; i < SLOT_MAX; i++) {
            if (!m_slot[i].isEnable()) continue;
            if (m_slot[i].isLock()) continue;
            if (!m_slot[i].isEmpty()) continue;
            MaterialsType slotType = m_slot[i].getType();
            if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
            if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
            return &m_slot[i];
        }
        return nullptr;
    }
    CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType)
    {
        for (int i = 0; i < SLOT_MAX; i++) {
            if (!m_slot[i].isEnable()) continue;
            if (m_slot[i].isLock()) continue;
            CGlass* pGlass = (CGlass*)m_slot[i].getContext();
            if (pGlass == nullptr) continue;
            MaterialsType glassType = pGlass->getType();
            if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
            if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
            return &m_slot[i];
        }
        return nullptr;
    }
    short CEquipment::decodeRecipeListReport(const char* pszData, size_t size)
    {
        return m_recipesManager.decodeRecipeListReport(pszData, size);
SourceCode/Bond/Servo/CEquipment.h
@@ -1,5 +1,6 @@
#pragma once
#include "Log.h"
#include "ServoCommo.h"
#include "CCLinkIEControl.h"
#include "CSample.h"
#include "CPin.h"
@@ -33,13 +34,11 @@
#include "CJobDataS.h"
#include "CProcessData.h"
#include "CPortStatusReport.h"
#include "CSlot.h"
namespace SERVO {
#define BLOCK_BUFFER_MAX            1024
#define ALIVE_TIMEOUT                15
#define VCR_MAX                        1
#define ARM_ALL                        99
#define SLOT_MAX        12
    typedef std::function<void(void* pEiuipment, BOOL bAlive)> ONALIVE;
    typedef std::function<void(void* pEiuipment, int code)> ONDATACHANGED;
@@ -54,78 +53,12 @@
        ONVCREVENTREPORT    onVcrEventReport;
    } EquipmentListener;
    // Memory Block ç»“构体定义
    typedef struct _MemoryBlock {
        unsigned int type;
        unsigned int start;
        unsigned int end;
        unsigned int size;
        char buffer[BLOCK_BUFFER_MAX];
    } MemoryBlock;
    // ALIVE
    typedef struct _ALIVE {
        BOOL flag;
        int count;
        BOOL alive;
    } ALIVE;
    enum DISPATCHING_MODE {
        EAS = 1,
        Local = 2
    };
    enum IDNEXER_OPERATION_MODE {
        Normal = 1,
        Clear_Out = 2,
        Cold_Run = 2,
        Start = 10,
        Stop = 11,
        Pause = 12,
        Resume = 13,
        Abort = 14,
        Cancel = 15,
    };
    enum RCMD {
        Robot_home = 1,
        Transfer,
        Move,
        Get,
        Put,
        One_Action_Exchange,
        Two_Action_Exchange,
        Command_Clear,
        Batch_get,
        Batch_put
    };
    enum VCR_Reply_Code {
        OK = 1,
        NG,
        Job_Data_Request,
        VCR_Mismatch
    };
    // Robot cmd param
#define ROBOT_CMD_PARAM_SIZE        16            /* é˜²æ­¢ä»¥åŽä¿®æ”¹ROBOT_CMD_PARAM为不是4的整数倍 */
    typedef struct _ROBOT_CMD_PARAM {
        short sequenceNo;
        short rcmd;
        short armNo;
        short getPosition;
        short putPosition;
        short getSlotNo;
        short putSlotNo;
        short subCmd;
    } ROBOT_CMD_PARAM;
    class CEquipment
    {
    public:
        CEquipment();
        virtual ~CEquipment();
    public:
        virtual const char* getClassName() = 0;
@@ -158,6 +91,7 @@
        virtual void term();
        virtual void initPins() = 0;
        virtual void initSteps();
        virtual void initSlots() = 0;
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void onReceiveLBData(const char* pszData, size_t size);
@@ -214,9 +148,17 @@
        // unitNo: 0:local; Others:unit No
        int recipeParameterRequest(short masterRecipeId, short localRecipeId, short unitNo);
        // èŽ·å–ä¸€ä¸ªå¯ç”¨çš„æ§½ä½
        CSlot* getAvailableSlot();
        // èŽ·å–ä¸€ä¸ªæŒ‡å®šç‰©æ–™ç±»åž‹(G1,G2,G1&G2)的空槽位
        CSlot* getEmptySlot(MaterialsType type);
        // èŽ·å–ä¸€ä¸ªæŒ‡å®šç‰©æ–™ç±»åž‹(G1,G2,G1&G2)的非空槽位
        CSlot* getNonEmptySlot(MaterialsType type);
    public:
        BOOL isGlassListEmpty();
    // ä»¥ä¸‹ä¸ºä»ŽCC-Link读取到的Bit标志位检测函数
    public:
@@ -278,6 +220,7 @@
        std::map<unsigned int, CStep*> m_mapStep;
        int m_nBaseAlarmId;
        CRecipesManager m_recipesManager;
        CSlot m_slot[SLOT_MAX];
    private:
        CEquipment* m_pArm;
SourceCode/Bond/Servo/CFliper.cpp
@@ -38,6 +38,16 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out"));
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CFliper::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1(G2)");
        m_slot[0].setType(MaterialsType::G2);
    }
    void CFliper::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CFliper.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CGlassPool.h
@@ -9,7 +9,7 @@
    {
    public:
        CGlassPool();
        ~CGlassPool();
        virtual ~CGlassPool();
    public:
        void initPool();
SourceCode/Bond/Servo/CJobDataA.h
@@ -8,7 +8,7 @@
    {
    public:
        CJobDataA();
        ~CJobDataA();
        virtual ~CJobDataA();
    public:
        short getPortNo();
SourceCode/Bond/Servo/CJobDataB.h
@@ -8,7 +8,7 @@
    public:
        CJobDataB();
        CJobDataB::CJobDataB(CJobDataB&& other) noexcept;
        ~CJobDataB();
        virtual ~CJobDataB();
    public:
        void copy(CJobDataB* pScr);
SourceCode/Bond/Servo/CJobDataC.h
@@ -6,7 +6,7 @@
    {
    public:
        CJobDataC();
        ~CJobDataC();
        virtual ~CJobDataC();
    public:
        int getCassetteSequenceNo();
SourceCode/Bond/Servo/CJobDataS.h
@@ -9,7 +9,7 @@
    public:
        CJobDataS();
        CJobDataS::CJobDataS(CJobDataS&& other) noexcept;
        ~CJobDataS();
        virtual ~CJobDataS();
    public:
        void copy(CJobDataS* pScr);
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -16,10 +16,10 @@
    CLoadPort::CLoadPort() : CEquipment()
    {
        m_nIndex = 0;
        m_nType = 1;
        m_nMode = 1;
        m_nCassetteType = 1;
        m_nTransferMode = 1;
        m_portType = PortType::Loading;
        m_portMode = PortMode::InService;
        m_cassetteType = CassetteType::G1;
        m_transferMode = TransferMode::AGVMode;
        m_bEnable = FALSE;
        m_bAutoChangeEnable = FALSE;
    }
@@ -55,6 +55,23 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out2"));
    }
    // å¿…须要实现的虚函数,在此初始化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");
    }
    void CLoadPort::initSteps()
    {
        CEquipment::initSteps();
@@ -88,7 +105,7 @@
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        m_nType = (unsigned int)CToolUnits::toInt16(pszData);
                        m_portType = (PortType)CToolUnits::toInt16(pszData);
                    }
                    return 0;
                });
@@ -109,7 +126,7 @@
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        m_nMode = (unsigned int)CToolUnits::toInt16(pszData);
                        m_portMode = (PortMode)CToolUnits::toInt16(pszData);
                    }
                    return 0;
                });
@@ -130,7 +147,7 @@
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        m_nCassetteType = (unsigned int)CToolUnits::toInt16(pszData);
                        m_cassetteType = (CassetteType)CToolUnits::toInt16(pszData);
                    }
                    return 0;
                });
@@ -151,7 +168,7 @@
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        m_nTransferMode = (unsigned int)CToolUnits::toInt16(pszData);
                        m_transferMode = (TransferMode)CToolUnits::toInt16(pszData);
                    }
                    return 0;
                });
@@ -358,13 +375,13 @@
        attrubutes.addAttribute(new CAttribute("Index",
            std::to_string(m_nIndex).c_str(), "", weight++));
        attrubutes.addAttribute(new CAttribute("Type",
            getPortTypeDescription(m_nType, strTemp).c_str(), "", weight++));
            getPortTypeDescription(m_portType, strTemp).c_str(), "", weight++));
        attrubutes.addAttribute(new CAttribute("Mode",
            getPortModeDescription(m_nMode, strTemp).c_str(), "", weight++));
            getPortModeDescription(m_portMode, strTemp).c_str(), "", weight++));
        attrubutes.addAttribute(new CAttribute("CassetteType",
            getPortCassetteTypeDescription(m_nCassetteType, strTemp).c_str(), "", weight++));
            getPortCassetteTypeDescription(m_cassetteType, strTemp).c_str(), "", weight++));
        attrubutes.addAttribute(new CAttribute("TransferMode",
            getPortTransferModeDescription(m_nTransferMode, strTemp).c_str(), "", weight++));
            getPortTransferModeDescription(m_transferMode, strTemp).c_str(), "", weight++));
        attrubutes.addAttribute(new CAttribute("Enable",
            m_bEnable ? "Eanble" : "Disable", "", weight++));
        attrubutes.addAttribute(new CAttribute("Auto Change",
@@ -441,24 +458,24 @@
        return m_bEnable;
    }
    int CLoadPort::getPortType()
    PortType CLoadPort::getPortType()
    {
        return m_nType;
        return m_portType;
    }
    int CLoadPort::getPortMode()
    PortMode CLoadPort::getPortMode()
    {
        return m_nMode;
        return m_portMode;
    }
    int CLoadPort::getCessetteType()
    CassetteType CLoadPort::getCessetteType()
    {
        return m_nCassetteType;
        return m_cassetteType;
    }
    int CLoadPort::getTransferMode()
    TransferMode CLoadPort::getTransferMode()
    {
        return m_nTransferMode;
        return m_transferMode;
    }
    BOOL CLoadPort::isAutoChange()
@@ -510,9 +527,9 @@
     6: Buffer Port-Un-loader in Buffer Type
     7: Unloading Partial Port
     */
    std::string& CLoadPort::getPortTypeDescription(int portType, std::string& strDescription)
    std::string& CLoadPort::getPortTypeDescription(PortType portType, std::string& strDescription)
    {
        switch (portType) {
        switch ((int)portType) {
        case 1:
            strDescription = _T("Loading Port");
            break;
@@ -550,9 +567,9 @@
     4: InService
     5: TransferReady
     */
    std::string& CLoadPort::getPortModeDescription(int portMode, std::string& strDescription)
    std::string& CLoadPort::getPortModeDescription(PortMode portMode, std::string& strDescription)
    {
        switch (portMode) {
        switch ((int)portMode) {
        case 0:
            strDescription = _T("OutOfService");
            break;
@@ -584,9 +601,9 @@
     2: G2
     3: G1&G2
     */
    std::string& CLoadPort::getPortCassetteTypeDescription(int casseteType, std::string& strDescription)
    std::string& CLoadPort::getPortCassetteTypeDescription(CassetteType casseteType, std::string& strDescription)
    {
        switch (casseteType) {
        switch ((int)casseteType) {
        case 1:
            strDescription = _T("G1");
            break;
@@ -609,9 +626,9 @@
     2: AGV Mode
     3: Stocker Inline Mode
     */
    std::string& CLoadPort::getPortTransferModeDescription(int mode, std::string& strDescription)
    std::string& CLoadPort::getPortTransferModeDescription(TransferMode mode, std::string& strDescription)
    {
        switch (mode) {
        switch ((int)mode) {
        case 1:
            strDescription = _T("MGV Mode");
            break;
SourceCode/Bond/Servo/CLoadPort.h
@@ -17,6 +17,7 @@
        virtual void term();
        virtual void initPins();
        virtual void initSteps();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
@@ -36,10 +37,10 @@
        void setIndex(unsigned int index);
        unsigned int getIndex();
        BOOL isEnable();
        int getPortType();
        int getPortMode();
        int getCessetteType();
        int getTransferMode();
        PortType getPortType();
        PortMode getPortMode();
        CassetteType getCessetteType();
        TransferMode getTransferMode();
        BOOL isAutoChange();
        int getPortStatus();
        int getCassetteSequenceNo();
@@ -51,10 +52,10 @@
        int testGenerateGlassList(MaterialsType type, int count, const char* pszPrefix, int startSuffix);
    public:
        static std::string& getPortTypeDescription(int portType, std::string& strDescription);
        static std::string& getPortModeDescription(int portMode, std::string& strDescription);
        static std::string& getPortCassetteTypeDescription(int casseteType, std::string& strDescription);
        static std::string& getPortTransferModeDescription(int mode, std::string& strDescription);
        static std::string& getPortTypeDescription(PortType portType, std::string& strDescription);
        static std::string& getPortModeDescription(PortMode portMode, std::string& strDescription);
        static std::string& getPortCassetteTypeDescription(CassetteType casseteType, std::string& strDescription);
        static std::string& getPortTransferModeDescription(TransferMode mode, std::string& strDescription);
        static std::string& getEnableModeDescription(int mode, std::string& strDescription);
        static std::string& getPortStatusDescription(int portStatus, std::string& strDescription);
        static std::string& getLoadingCassetteTypeDescription(int type, std::string& strDescription);
@@ -77,10 +78,10 @@
    private:
        unsigned int m_nIndex;
        int m_nType;
        int m_nMode;
        int m_nCassetteType;
        int m_nTransferMode;
        PortType m_portType;
        PortMode m_portMode;
        CassetteType m_cassetteType;
        TransferMode m_transferMode;
        BOOL m_bEnable;
        BOOL m_bAutoChangeEnable;
        CPortStatusReport m_portStatusReport;
SourceCode/Bond/Servo/CMaster.cpp
@@ -47,6 +47,7 @@
        m_ullStartTime = 0;
        m_ullRunTime = 0;
        m_state = MASTERSTATE::READY;
        m_pActiveRobotTask = nullptr;
        InitializeCriticalSection(&m_criticalSection);
    }
@@ -88,6 +89,11 @@
        m_listener.onEqAlarm = listener.onEqAlarm;
        m_listener.onEqVcrEventReport = listener.onEqVcrEventReport;
        m_listener.onEqDataChanged = listener.onEqDataChanged;
    }
    CRobotTask* CMaster::getActiveRobotTask()
    {
        return m_pActiveRobotTask;
    }
    int CMaster::init()
@@ -305,6 +311,35 @@
                unlock();
                LOGI("调度处理中...");
                Sleep(1000);
                // LoadPort -> Fliper(G2)
                // LoadPort -> VacuumBake(G1)
                // Fliper(G2) -> Aligner
                // VacuumBake(G1) -> Aligner
                // Aligner -> Bonder
                // Bonder -> BakeCooling
                // BakeCooling ->Measurement
                // Measurement -> LoadPort
            }
            unlock();
        }
SourceCode/Bond/Servo/CMaster.h
@@ -12,6 +12,7 @@
#include "CArm.h"
#include "CArmTray.h"
#include "CCLinkIEControl.h"
#include "CRobotTask.h"
namespace SERVO {
@@ -42,11 +43,12 @@
    {
    public:
        CMaster();
        ~CMaster();
        virtual ~CMaster();
    public:
        void setListener(MasterListener listener);
        CRobotTask* getActiveRobotTask();
        int init();
        int term();
        int start();
@@ -105,6 +107,10 @@
        ULONGLONG m_ullStartTime;
        ULONGLONG m_ullRunTime;
        MASTERSTATE m_state;
        // å½“前任务和已完成任务列表
        CRobotTask* m_pActiveRobotTask;
        std::list< CRobotTask* > m_listTask;
    };
}
SourceCode/Bond/Servo/CMeasurement.cpp
@@ -38,6 +38,15 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out2"));
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CMeasurement::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1");
    }
    void CMeasurement::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CMeasurement.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CPagePortProperty.cpp
@@ -60,36 +60,36 @@
    
    pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PORT_TYPE);
    for (int i = 1; i <= 7; i++) {
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortTypeDescription(i, strTemp).c_str());
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortTypeDescription((SERVO::PortType)i, strTemp).c_str());
    }
    int portType = m_pPort->getPortType();
    int portType = (int)m_pPort->getPortType();
    if (1 <= portType && portType <= 7) {
        pComboBox->SetCurSel(portType - 1);
    }
    pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PORT_MODE);
    for (int i = 0; i <= 5; i++) {
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortModeDescription(i, strTemp).c_str());
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortModeDescription((SERVO::PortMode)i, strTemp).c_str());
    }
    int portMode = m_pPort->getPortMode();
    int portMode = (int)m_pPort->getPortMode();
    if (0 <= portMode && portMode <= 5) {
        pComboBox->SetCurSel(portMode);
    }
    pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PORT_CASSERT_TYPE);
    for (int i = 1; i <= 3; i++) {
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortCassetteTypeDescription(i, strTemp).c_str());
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortCassetteTypeDescription((SERVO::CassetteType)i, strTemp).c_str());
    }
    int cessetteType = m_pPort->getCessetteType();
    int cessetteType = (int)m_pPort->getCessetteType();
    if (1 <= cessetteType && cessetteType <= 3) {
        pComboBox->SetCurSel(cessetteType - 1);
    }
    pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_PORT_TRANSFER_MODE);
    for (int i = 1; i <= 3; i++) {
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortTransferModeDescription(i, strTemp).c_str());
        pComboBox->InsertString(i - 1, SERVO::CLoadPort::getPortTransferModeDescription((SERVO::TransferMode)i, strTemp).c_str());
    }
    int transferMode = m_pPort->getTransferMode();
    int transferMode = (int)m_pPort->getTransferMode();
    if (1 <= transferMode && transferMode <= 3) {
        pComboBox->SetCurSel(transferMode - 1);
    }
SourceCode/Bond/Servo/CPath.h
@@ -7,7 +7,7 @@
    public:
        CPath();
        CPath(unsigned int nSiteId);
        ~CPath();
        virtual ~CPath();
    public:
        void getDescription(std::string& strOut);
SourceCode/Bond/Servo/CPortStatusReport.h
@@ -9,7 +9,7 @@
    {
    public:
        CPortStatusReport();
        ~CPortStatusReport();
        virtual ~CPortStatusReport();
    public:
        void copyEx(CPortStatusReport& other);
SourceCode/Bond/Servo/CProcessData.h
@@ -8,7 +8,7 @@
    {
    public:
        CProcessData();
        ~CProcessData();
        virtual ~CProcessData();
    public:
        std::string& getGlassId();
SourceCode/Bond/Servo/CRobotTask.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
#include "stdafx.h"
#include "CRobotTask.h"
#include "ToolUnits.h"
namespace SERVO {
    CRobotTask::CRobotTask()
    {
        generateId(m_strId);
        m_timeCreate = CToolUnits::getTimestamp();
    }
    CRobotTask::~CRobotTask()
    {
    }
    std::string& CRobotTask::generateId(std::string& out)
    {
        char szBuffer[256];
        CTime time = CTime::GetCurrentTime();
        __int64 nTick = 0;
        QueryPerformanceCounter((LARGE_INTEGER*)&nTick);
        sprintf_s(szBuffer, 256, "%d%02d%02d%02d%02d%02d%010llu", time.GetYear(),
            time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond(),
            nTick % 10000000000);
        out = szBuffer;
        return out;
    }
    std::string& CRobotTask::getId()
    {
        return m_strId;
    }
    void CRobotTask::setRobotTransferParam(int seq, int armNo, int fromPos, int toPos, int fromSlot, int toSlot)
    {
        m_robotCmdParam = {};
        m_robotCmdParam.sequenceNo = static_cast<short>(seq);
        m_robotCmdParam.rcmd = static_cast<short>(SERVO::RCMD::Transfer);
        m_robotCmdParam.armNo = static_cast<short>(armNo);
        m_robotCmdParam.getPosition = static_cast<short>(fromPos);
        m_robotCmdParam.getSlotNo = static_cast<short>(fromSlot);
        m_robotCmdParam.putPosition = static_cast<short>(toPos);
        m_robotCmdParam.putSlotNo = static_cast<short>(toSlot);
    }
    ROBOT_CMD_PARAM& CRobotTask::getRobotCmdParam()
    {
        return m_robotCmdParam;
    }
    time_t CRobotTask::getCreateTime()
    {
        return m_timeCreate;
    }
    time_t CRobotTask::getFinishTime()
    {
        return m_timeFinish;
    }
}
SourceCode/Bond/Servo/CRobotTask.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
#pragma once
#include "ServoCommo.h"
namespace SERVO {
    class CRobotTask
    {
    public:
        CRobotTask();
        virtual ~CRobotTask();
    public:
        std::string& getId();
        void setRobotTransferParam(int seq, int armNo, int fromPos, int toPos, int fromSlot, int toSlot);
        ROBOT_CMD_PARAM& getRobotCmdParam();
        time_t getCreateTime();
        time_t getFinishTime();
    private:
        static std::string& generateId(std::string& out);
    public:
        std::string m_strId;
        time_t m_timeCreate;                        /* åˆ›å»ºæ—¶é—´ */
        time_t m_timeFinish;                        /* ç»“束时间 */
        ROBOT_CMD_PARAM m_robotCmdParam;            /* å‚æ•° */
    };
}
SourceCode/Bond/Servo/CSlot.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
#include "stdafx.h"
#include "CSlot.h"
namespace SERVO {
    CSlot::CSlot()
    {
        m_nNo = 0;
        m_materialsType = MaterialsType::G1G2;
        m_pContext = nullptr;
        m_bEnable = FALSE;
        m_bLock = FALSE;
    }
    CSlot::~CSlot()
    {
    }
    BOOL CSlot::isEnable()
    {
        return m_bEnable;
    }
    void CSlot::enable()
    {
        m_bEnable = TRUE;
    }
    void CSlot::disable()
    {
        m_bEnable = FALSE;
    }
    BOOL CSlot::isLock()
    {
        return m_bLock;
    }
    void CSlot::lock()
    {
        m_bLock = TRUE;
    }
    void CSlot::unlock()
    {
        m_bLock = FALSE;
    }
    int CSlot::getPosition()
    {
        return m_nPosition;
    }
    void CSlot::setPosition(int position)
    {
        m_nPosition = position;
    }
    int CSlot::getNo()
    {
        return m_nNo;
    }
    void CSlot::setNo(int no)
    {
        m_nNo = no;
    }
    MaterialsType CSlot::getType()
    {
        return m_materialsType;
    }
    void CSlot::setType(MaterialsType type)
    {
        m_materialsType = type;
    }
    std::string& CSlot::getName()
    {
        return m_strName;
    }
    void CSlot::setName(const char* pszName)
    {
        m_strName = pszName;
    }
    BOOL CSlot::isEmpty()
    {
        return m_pContext == nullptr;
    }
    CContext* CSlot::getContext()
    {
        return m_pContext;
    }
    void CSlot::setContext(CContext* pContext)
    {
        m_pContext = pContext;
    }
}
SourceCode/Bond/Servo/CSlot.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
#pragma once
#include "Context.h"
#include "ServoCommo.h"
namespace SERVO {
    class CSlot
    {
    public:
        CSlot();
        virtual ~CSlot();
    public:
        BOOL isEnable();
        void enable();
        void disable();
        BOOL isLock();
        void lock();
        void unlock();
        int getPosition();
        void setPosition(int position);
        int getNo();
        void setNo(int no);
        MaterialsType getType();
        void setType(MaterialsType type);
        std::string& getName();
        void setName(const char* pszName);
        BOOL isEmpty();
        CContext* getContext();
        void setContext(CContext* pContext);
    private:
        int m_nPosition;
        int m_nNo;
        MaterialsType m_materialsType;
        std::string m_strName;
        CContext* m_pContext;
        BOOL m_bEnable;
        BOOL m_bLock;
    };
}
SourceCode/Bond/Servo/CVacuumBake.cpp
@@ -38,6 +38,16 @@
        addPin(SERVO::PinType::OUTPUT, _T("Out"));
    }
    // å¿…须要实现的虚函数,在此初始化Slot信息
    void CVacuumBake::initSlots()
    {
        m_slot[0].enable();
        m_slot[0].setPosition(m_nID);
        m_slot[0].setNo(1);
        m_slot[0].setName("Slot 1(G1)");
        m_slot[0].setType(MaterialsType::G1);
    }
    void CVacuumBake::onTimer(UINT nTimerid)
    {
        CEquipment::onTimer(nTimerid);
SourceCode/Bond/Servo/CVacuumBake.h
@@ -15,6 +15,7 @@
        virtual void init();
        virtual void term();
        virtual void initPins();
        virtual void initSlots();
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void getAttributeVector(CAttributeVector& attrubutes);
SourceCode/Bond/Servo/CVcrEventReport.h
@@ -8,7 +8,7 @@
    {
    public:
        CVcrEventReport();
        ~CVcrEventReport();
        virtual ~CVcrEventReport();
    public:
        std::string& getGlassId();
SourceCode/Bond/Servo/Common.h
@@ -60,22 +60,22 @@
#define BTN_ALARM_BKGND_PRESS            RGB(133, 203, 225)
/* Equipment ID */
#define EQ_ID_EFEM                1
#define EQ_ID_Bonder1            2
#define EQ_ID_Bonder2            3
#define EQ_ID_LOADPORT1            4
#define EQ_ID_LOADPORT2            5
#define EQ_ID_LOADPORT3            6
#define EQ_ID_LOADPORT4            7
#define EQ_ID_LOADPORT1            1
#define EQ_ID_LOADPORT2            2
#define EQ_ID_LOADPORT3            3
#define EQ_ID_LOADPORT4            4
#define EQ_ID_ARM_TRAY1            5
#define EQ_ID_ARM_TRAY2            6
#define EQ_ID_ALIGNER            7
#define EQ_ID_FLIPER            8
#define EQ_ID_VACUUMBAKE        9
#define EQ_ID_ALIGNER            10
#define EQ_ID_BAKE_COOLING        11
#define EQ_ID_MEASUREMENT        12
#define EQ_ID_ARM                13
#define EQ_ID_ARM_TRAY1            14
#define EQ_ID_ARM_TRAY2            15
#define EQ_ID_OPERATOR_REMOVE    999
#define EQ_ID_Bonder1            10
#define EQ_ID_Bonder2            11
#define EQ_ID_BAKE_COOLING        12
#define EQ_ID_MEASUREMENT        13
#define EQ_ID_EFEM                100
#define EQ_ID_ARM                101
#define EQ_ID_OPERATOR_REMOVE    102
/* step name */
SourceCode/Bond/Servo/Servo.vcxproj
@@ -205,6 +205,8 @@
    <ClInclude Include="CRobotCmdTestDlg.h" />
    <ClInclude Include="CPagePortStatus.h" />
    <ClInclude Include="CPortStatusReport.h" />
    <ClInclude Include="CRobotTask.h" />
    <ClInclude Include="CSlot.h" />
    <ClInclude Include="HorizontalLine.h" />
    <ClInclude Include="JobSlotGrid.h" />
    <ClInclude Include="MsgDlg.h" />
@@ -315,6 +317,8 @@
    <ClCompile Include="CRobotCmdTestDlg.cpp" />
    <ClCompile Include="CPagePortStatus.cpp" />
    <ClCompile Include="CPortStatusReport.cpp" />
    <ClCompile Include="CRobotTask.cpp" />
    <ClCompile Include="CSlot.cpp" />
    <ClCompile Include="HorizontalLine.cpp" />
    <ClCompile Include="JobSlotGrid.cpp" />
    <ClCompile Include="MsgDlg.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -115,6 +115,8 @@
    <ClCompile Include="TopToolbar.cpp" />
    <ClCompile Include="HorizontalLine.cpp" />
    <ClCompile Include="CMyStatusbar.cpp" />
    <ClCompile Include="CRobotTask.cpp" />
    <ClCompile Include="CSlot.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -229,6 +231,8 @@
    <ClInclude Include="TopToolbar.h" />
    <ClInclude Include="HorizontalLine.h" />
    <ClInclude Include="CMyStatusbar.h" />
    <ClInclude Include="CRobotTask.h" />
    <ClInclude Include="CSlot.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />
SourceCode/Bond/Servo/ServoCommo.h
@@ -2,7 +2,12 @@
namespace SERVO {
    enum PortType {
#define BLOCK_BUFFER_MAX            1024
#define ALIVE_TIMEOUT                15
#define VCR_MAX                        1
#define ARM_ALL                        99
    enum class PortType {
        Loading = 1,
        Unloading,
        Both,
@@ -12,7 +17,7 @@
        UnloadingPartial
    };
    enum PortMode {
    enum class PortMode {
        OutOfService = 0,
        TransferBlocked,
        ReadyToLoad,
@@ -21,17 +26,91 @@
        TransferReady
    };
    enum MaterialsType {
        G1 = 0,
        G2 = 1,
        G1G2 = 2
    enum class MaterialsType {
        G1 = 1,
        G2 = 2,
        G1G2 = 3
    };
    typedef MaterialsType CassetteType;
    enum TransferMode {
    enum class TransferMode {
        MGVMode = 1,
        AGVMode,
        StockerInlineMode
    };
    // Memory Block ç»“构体定义
    typedef struct _MemoryBlock {
        unsigned int type;
        unsigned int start;
        unsigned int end;
        unsigned int size;
        char buffer[BLOCK_BUFFER_MAX];
    } MemoryBlock;
    // ALIVE
    typedef struct _ALIVE {
        BOOL flag;
        int count;
        BOOL alive;
    } ALIVE;
    enum class DISPATCHING_MODE {
        EAS = 1,
        Local = 2
    };
    enum class IDNEXER_OPERATION_MODE {
        Normal = 1,
        Clear_Out = 2,
        Cold_Run = 2,
        Start = 10,
        Stop = 11,
        Pause = 12,
        Resume = 13,
        Abort = 14,
        Cancel = 15,
    };
    enum class VCR_Reply_Code {
        OK = 1,
        NG,
        Job_Data_Request,
        VCR_Mismatch
    };
    // Robot cmd param
#define ROBOT_CMD_PARAM_SIZE        16            /* é˜²æ­¢ä»¥åŽä¿®æ”¹ROBOT_CMD_PARAM为不是4的整数倍 */
    typedef struct _ROBOT_CMD_PARAM {
        short sequenceNo;
        short rcmd;
        short armNo;
        short getPosition;
        short putPosition;
        short getSlotNo;
        short putSlotNo;
        short subCmd;
    } ROBOT_CMD_PARAM;
    enum class RCMD {
        Robot_home = 1,
        Transfer,
        Move,
        Get,
        Put,
        One_Action_Exchange,
        Two_Action_Exchange,
        Command_Clear,
        Batch_get,
        Batch_put
    };
    enum class ROBOT_TASK_STATE {
        Ready = 0,
        Running,
        Error,
        Abort,
        Completed
    };
}
SourceCode/Bond/Servo/ToolUnits.cpp
@@ -75,9 +75,8 @@
ULONGLONG CToolUnits::getTimestamp()
{
    auto now = std::chrono::system_clock::now();
    auto duration_in_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
    uint64_t timestamp = duration_in_milliseconds.count();
    return timestamp;
    auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
    return static_cast<ULONGLONG>(ms.time_since_epoch().count());
}
void CToolUnits::createDir(const char* pszDir)