#pragma once #include #include #include "CEquipment.h" #include "CEFEM.h" #include "CBonder.h" #include "CLoadPort.h" #include "CFliper.h" #include "CAligner.h" #include "CVacuumBake.h" #include "CBakeCooling.h" #include "CMeasurement.h" #include "CArm.h" #include "CArmTray.h" #include "CCLinkIEControl.h" #include "CRobotTask.h" #include "ProcessJob.h" #include "CControlJob.h" #include "../DAQBridge/core/Collector.h" #include "CJobDataS.h" class CModel; #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, ATHERERROR }; enum class CurveMode { Production = 0, EmptyChamber }; typedef std::function ONMASTERSTATECHANGED; typedef std::function ONEQALIVE; typedef std::function ONEQSTEPEVENT; typedef std::function ONEQALARM; typedef std::function ONEQVCREVENTREPORT; typedef std::function ONEQDATACHANGED; typedef std::function ONROBOTTASKEVENT; typedef std::function ONLOADPORTSTATUSCHANGED; typedef std::function ONPROCESSSTATECHANGED; typedef std::function& params)> ONPROCESSDATAREPORTEX; typedef std::function& params)> ONSVDATAREPORT; typedef std::function ONJOBRECEIVED; typedef std::function ONJOBSENTOUT; typedef std::function ONEQSTATUSCHANGED; typedef std::function ONCTROUNDEND; typedef std::function ONPJSTART; typedef std::function ONCONTROLJOBCHANGED; typedef struct _MasterListener { ONMASTERSTATECHANGED onMasterStateChanged; ONEQALIVE onEqAlive; ONEQALIVE onEqCimStateChanged; ONEQALARM onEqAlarm; ONEQVCREVENTREPORT onEqVcrEventReport; ONEQDATACHANGED onEqDataChanged; ONROBOTTASKEVENT onRobotTaskEvent; ONLOADPORTSTATUSCHANGED onLoadPortStatusChanged; ONPROCESSSTATECHANGED onProcessStateChanged; ONSVDATAREPORT onSVDataReport; ONPROCESSDATAREPORTEX onProcessDataReport; ONJOBRECEIVED onJobReceived; ONJOBSENTOUT onJobSentOut; ONEQSTATUSCHANGED onEqStatusChanged; ONCTROUNDEND onCTRoundEnd; ONPJSTART onCjStart; ONPJSTART onCjEnd; ONPJSTART onPjStart; ONPJSTART onPjEnd; ONPJSTART onPanelStart; ONPJSTART onPanelEnd; ONCONTROLJOBCHANGED onControlJobChanged; } MasterListener; class CMaster : public IResourceView { public: CMaster(); virtual ~CMaster(); public: void setModelCtx(CModel* pModel); void setListener(MasterListener listener); CRobotTask* getActiveRobotTask(); int init(); int term(); int start(); int startContinuousTransfer(); int startBatch(); int stop(int nErCode = ER_CODE_NOERROR); void clearError(); ULONGLONG getRunTime(); MASTERSTATE getState(); void setCurveMode(CurveMode mode); CurveMode getCurveMode() const; unsigned DispatchProc(); unsigned ReadBitsProc(); void onTimer(UINT nTimerid); std::list& getEquipmentList(); CEquipment* getEquipment(int id); CEquipment* getEquipment(int id) const; void setCacheFilepath(const char* pszFilepath); int abortCurrentTask(); int restoreCurrentTask(); int resendCurrentTask(); 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& pjs); std::vector& 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& 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); uint32_t SlotToMid(int eqid, int slot); private: inline void lock() { EnterCriticalSection(&m_criticalSection); } inline void unlock() { LeaveCriticalSection(&m_criticalSection); } int addToEquipmentList(CEquipment* pEquipment); CLoadPort* addLoadPort(int index); CFliper* addFliper(); CVacuumBake* addVacuumBake(); CAligner* addAligner(); CEFEM* addEFEM(); CArm* addArm(); CArmTray* addArmTray(int index); CBonder* addBonder(int index); CBakeCooling* addBakeCooling(); CMeasurement* addMeasurement(); void connectEquipments(); int saveCache(); int saveCacheAndBackups(); int readCache(); void serialize(CArchive& ar); void setState(MASTERSTATE state); CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq, MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2, 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; void setAllowedCeids(const std::vector& ceids); void handleCollectionEvent(uint32_t ceid); bool raiseSoftAlarm(int alarmId, const std::string& desc, int level = -1, int deviceId = 0, int unitId = 0, const char* deviceName = "Software", const char* unitName = "App"); 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; MasterListener m_listener; CCCLinkIEControl m_cclink; std::list 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; CurveMode m_curveMode; // 当前任务和已完成任务列表 CRobotTask* m_pActiveRobotTask; std::list< CRobotTask* > m_listTask; // 错误代码 int m_nLastError; std::string m_strLastError; // 在开始工艺前是否需要先比较 map BOOL m_isCompareMapsBeforeProceeding; BOOL m_bJobMode; // 千传圈数计数 int m_nContinuousTransferCount; int m_nContinuousTransferStep; int m_nContinuousWorkingPort; int m_nContinuousWorkingSlot; // 已经开始处理的 ProcessJob 列表 std::vector m_inProcesJobs; std::vector m_completeProcessJobs; std::vector m_queueGlasses; std::vector m_inProcesGlasses; std::vector m_completeGlasses; private: bool m_bEnableEventReport; bool m_bEnableAlarmReport; bool m_bPauseAlarmRaised; SERVO::CControlJob* m_pControlJob; std::vector m_processJobs; std::string m_strStatePath; CModel* m_pModelCtx; int m_nTestFlag; std::list m_bufGlass; std::unordered_set m_allowedCeids; private: Collector* m_pCollector = nullptr; void CreateDAQBridgeServer(); inline void notifyControlJobChanged() { if (m_listener.onControlJobChanged) { m_listener.onControlJobChanged(this); } } }; }