LAPTOP-SNT8I5JK\Boounion
2025-10-16 a351ed8a97a72bddfb281d2aa350a5c42a7f81a5
SourceCode/Bond/Servo/CMaster.h
@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <list>
#include "CEquipment.h"
#include "CEFEM.h"
@@ -13,15 +13,41 @@
#include "CArmTray.h"
#include "CCLinkIEControl.h"
#include "CRobotTask.h"
#include "ProcessJob.h"
#include "CControlJob.h"
#include "../DAQBridge/core/Collector.h"
#define CTStep_Unknow                   0
#define CTStep_LoadPort_Aligner         1
#define CTStep_Aligner_Fliper           2
#define CTStep_Fliper_Bonder1           3
#define CTStep_Bonder1_Bonder2          4
#define CTStep_Bonder2_VacuumBake       5
#define CTStep_VacuumBake_VacuumBake    6
#define CTStep_VacuumBake_BakeCooling   7
#define CTStep_BakeCooling_BakeCooling1 8
#define CTStep_BakeCooling_BakeCooling2 9
#define CTStep_BakeCooling_BakeCooling3 10
#define CTStep_BakeCooling_Measurement  11
#define CTStep_Measurement_LoadPort     12
#define CTStep_begin                    CTStep_LoadPort_Aligner
#define CTStep_end                      CTStep_Measurement_LoadPort
#define ER_CODE_NOERROR                0
#define ER_CODE_OPERATION_MODE_FAIL    -1
#define ER_CODE_AOI_NG                 -2
namespace SERVO {
    enum class MASTERSTATE {
        READY = 0,
        STARTING,
        RUNNING,
        RUNNING_CONTINUOUS_TRANSFER,
        RUNNING_BATCH,
        STOPPING,
        MSERROR
        MSERROR,
        ATHERERROR
    };
    typedef std::function<void(void* pMaster, MASTERSTATE state)> ONMASTERSTATECHANGED;
@@ -31,7 +57,9 @@
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, CVcrEventReport* pReport)> ONEQVCREVENTREPORT;
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, int code)> ONEQDATACHANGED;
    typedef std::function<void(void* pMaster, CRobotTask* pTask, int code)> ONROBOTTASKEVENT;
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, short scanMap)> ONLOADPORTINUSE;
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, short status, __int64 data)> ONLOADPORTSTATUSCHANGED;
    typedef std::function<void(void* pMaster, int round)> ONCTROUNDEND;
    typedef std::function<void(void* pMaster, void* pj)> ONPJSTART;
    typedef struct _MasterListener
    {
        ONMASTERSTATECHANGED    onMasterStateChanged;
@@ -41,10 +69,17 @@
        ONEQVCREVENTREPORT       onEqVcrEventReport;
        ONEQDATACHANGED         onEqDataChanged;
        ONROBOTTASKEVENT        onRobotTaskEvent;
        ONLOADPORTINUSE         onLoadPortInUse;
        ONLOADPORTSTATUSCHANGED   onLoadPortStatusChanged;
        ONCTROUNDEND            onCTRoundEnd;
        ONPJSTART               onCjStart;
        ONPJSTART               onCjEnd;
        ONPJSTART               onPjStart;
        ONPJSTART               onPjEnd;
        ONPJSTART               onPanelStart;
        ONPJSTART               onPanelEnd;
    } MasterListener;
    class CMaster
    class CMaster : public IResourceView
    {
    public:
        CMaster();
@@ -57,7 +92,9 @@
        int init();
        int term();
        int start();
        int stop();
        int startContinuousTransfer();
        int startBatch();
        int stop(int nErCode = ER_CODE_NOERROR);
        void clearError();
        ULONGLONG getRunTime();
        MASTERSTATE getState();
@@ -66,19 +103,42 @@
        void onTimer(UINT nTimerid);
        std::list<CEquipment*>& getEquipmentList();
        CEquipment* getEquipment(int id);
        CEquipment* getEquipment(int id) const;
        void setCacheFilepath(const char* pszFilepath);
        int abortCurrentTask();
        int restoreCurrentTask();
        int resendCurrentTask();
        void setPortType(unsigned int index, BOOL enable, int type, int mode,
        void setPortTypeEx(unsigned int index, BOOL enable, int type, int mode,
            int cassetteType, int transferMode, BOOL autoChangeEnable);
        void setPortType(unsigned int index, int type);
        void setPortCassetteType(unsigned int index, SERVO::CassetteType type);
        void setPortEnable(unsigned int index, BOOL bEnable);
        void setCompareMapsBeforeProceeding(BOOL bCompare);
        void setJobMode(BOOL bJobMode);
        void datetimeSync(SYSTEMTIME& time);
        void enableEventReport(bool bEnable);
        void enableAlarmReport(bool bEnable);
        bool isAlarmReportEnable();
        int proceedWithCarrier(unsigned int port);
        int carrierRelease(unsigned int port);
        int getContinuousTransferCount();
        void setContinuousTransferCount(int round);
        int setProcessJobs(std::vector<CProcessJob*>& pjs);
        std::vector<CProcessJob*>& getProcessJobs();
        CProcessJob* getProcessJob(const std::string& id);
        int setControlJob(CControlJob& controlJob);
        CControlJob* getControlJob();
        CLoadPort* getPortWithCarrierId(const std::string& carrierId) const;
        bool saveState() const;
        bool loadState();
        void setStateFile(const std::string& path);
        int getWipGlasses(std::vector<CGlass*>& glasses);
        void test();
        bool moveGlassToBuf(int eqid, int slotNo);
        bool moveGlassToSlot(int eqid, int slotNo);
        int getPortCassetteSnSeed(int port);
        void setPortCassetteSnSeed(int port, int seed);
        CGlass* getGlass(int scrPort, int scrSlot);
    private:
        inline void lock() { EnterCriticalSection(&m_criticalSection); }
@@ -102,11 +162,46 @@
        void setState(MASTERSTATE state);
        CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq,
            MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2,
            int armNo = 1);
            int armNo = 1, BOOL bJobMode = FALSE);
        CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq);
        CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq);
        CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq);
        CRobotTask* createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts);
        CRobotTask* createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
            CEquipment* pTarEq, int nTarSlot, int armNo = 1);
    public:
        // —— IResourceView 覆写 ——(注意 const)
        bool isProcessJobsEmpty() const override;
        bool recipeExists(const std::string& ppid) const override;
        bool carrierPresent(const std::string& carrierId) const override;
        bool slotUsable(const std::string& carrierId, uint16_t slot) const override;
        bool ceidDefined(uint32_t ceid) const override;
    public:
        int getLastError();
        std::string& getLastErrorText();
    public:
        // 新增函数
        CProcessJob* acquireNextProcessJob();
        CGlass* acquireNextGlass();
        int acquireGlassToQueue();
        bool addGlassToQueue(CGlass* pGlass);
        bool glassFromQueueToInPorcess(CGlass* pGlass);
        bool glassFromInPorcessToComplete(CGlass* pGlass);
        bool processJobFromInPorcessToComplete(CProcessJob* pProcessJob);
        bool checkAndUpdatePjComplete(CProcessJob* pJob);
        bool checkAndUpdateCjComplete(CControlJob* pJob);
        CProcessJob* getGlassProcessJob(CGlass* pGlass);
        bool completeControlJob();
        bool forceCompleteControlJob(std::string description);
        bool canCreateControlJob();
        bool canCompleteControlJob();
        bool canDeleteControlJob();
        // DAQ Bridge鐩稿叧
        Collector* getCollector() const { return m_pCollector; }
    private:
        CRITICAL_SECTION m_criticalSection;
@@ -115,37 +210,65 @@
        std::list<CEquipment*> m_listEquipment;
        std::string m_strFilepath;
        BOOL m_bDataModify;
        bool m_bContinuousTransfer;
        bool m_bBatch;
    private:
        /* 监控比特位的线程*/
        /* 监控比特位的线程*/
        HANDLE m_hEventReadBitsThreadExit[2];
        HANDLE m_hReadBitsThreadHandle;
        unsigned m_nReadBitsThreadAddr;
        // 调度线程
        // 调度线程
        HANDLE m_hDispatchEvent;
        HANDLE m_hEventDispatchThreadExit[2];
        HANDLE m_hDispatchThreadHandle;
        unsigned m_nDispatchThreadAddr;
        // 启动时间,运行时间,状态
        // 启动时间,运行时间,状态
        ULONGLONG m_ullStartTime;
        ULONGLONG m_ullRunTime;
        MASTERSTATE m_state;
        // 当前任务和已完成任务列表
        // 当前任务和已完成任务列表
        CRobotTask* m_pActiveRobotTask;
        std::list< CRobotTask* > m_listTask;
        // 错误代码
        // 错误代码
        int m_nLastError;
        std::string m_strLastError;
        // 在开始工艺前是否先需要先比较map
        // 在开始工艺前是否先需要先比较map
        BOOL m_isCompareMapsBeforeProceeding;
        BOOL m_bJobMode;
        // 千传圈数计数
        int m_nContinuousTransferCount;
        int m_nContinuousTransferStep;
        int m_nContinuousWorkingPort;
        int m_nContinuousWorkingSlot;
        // 新增已经开始处理的ProcessJob列表
        std::vector<CProcessJob*> m_inProcesJobs;
        std::vector<CProcessJob*> m_completeProcessJobs;
        std::vector<CGlass*> m_queueGlasses;
        std::vector<CGlass*> m_inProcesGlasses;
        std::vector<CGlass*> m_completeGlasses;
    private:
        bool m_bEnableEventReport;
        bool m_bEnableAlarmReport;
        SERVO::CControlJob* m_pControlJob;
        std::vector<SERVO::CProcessJob*> m_processJobs;
        std::string m_strStatePath;
        int m_nTestFlag;
        std::list<CGlass*> m_bufGlass;
    private:
        Collector* m_pCollector = nullptr;
        void CreateDAQBridgeServer();
    };
}